DirectSound学习笔记(3):协作级别

 协作级别

因为Windows是一个多任务环境,多个应用程序可能在任意时刻对一个设备驱动器进行操作。虽然使用协作级别,DirectX仍然确保每个应用程序不能以错误方式或在错误时刻访问设备。每个DirectSound应用程序都有一个协作级别,用于决定它被允许访问设备的程度。

在创建一个设备对象后,你必须使用IDirectSound8::SetCooperativeLevel 方法为这个设备设置协作级别。如果你不这么做,将无法听到声音。下面这个例子为DirectSound设备设置了协作级别,这个设备由IDirectSound8接口lpDirectSound标识。Hwnd参数是应用程序窗口句柄。

HRESULT hr = lpDirectSound-> SetCooperativeLevel(hwnd, DSSCL_PRIORITY);
if
 (FAILED(hr))
{
  ErrorHandler(hr);  
// Add error-handling here.

}

DirectSound为声音设备定义了三个协作级别,由值DSSCL_NORMAL,DSSCL_PRIORITY和DSSCL_WRITEPRIMARY指定。
注意:DSSCL_EXCLUSIBE协作级别已经过时。一个DirectX应用程序不再可能使其他应用程序沉寂。那些要求专用级别的应用程序将被赋予优先级别。

标准协作级别

在标准协作级别(DSSCL_NORMAL)下,应用程序不能设置主缓冲区的格式,填充主缓冲区,或者压缩设备的On-board内存。所有在这个协作级别的应用程序使用一个22KHz,立体音效,8位采样格式的主缓冲区,这样设备能够在应用程序间顺利地切换。

优先协作级别

当使用一个出于优先协作级别(DSSCL_PRIORITY)地DirectSound设备时,应用程序享有对硬件资源的优先权,如硬件混频,设置主缓冲区的格式,以及压缩设备的On-board内存。
游戏程序在几乎所有环境下都应该使用优先协作级别。这个级别给予了应用程序最强大的行为能力,使它能够控制采样率和位深度。优先协作级别也允许来自其他应用程序(如IP电话)的声音与游戏中的声音一同被听到。

写主缓冲区协作级别

最高协作级别是写主缓冲区(DSSCL_WRITEPRIMARY)。当使用这一协作级别的DirectSound设备时,你的应用程序能够直接访问非WDM驱动的主缓冲区。在这种模式下,应用程序必须直接填充主缓冲区。此时,辅助缓冲区无法被播放。
一个应用程序为了获取对主缓冲区中音频采样的直接写访问,必须被设置为写主缓冲区级别。如果应用程序没有被设置成这一级别,那么所有对主缓冲区上IDirectSoundBuffer::Lock方法的调用都将失败。
注意:主缓冲区只支持IDirectSoundBuffer接口,而不是IDirectSoundBuffer8。
当你的应用程序被设置为写主缓冲区协作级别并出于前台位置时,所有用于其他应用程序的辅助缓冲区将被停止并标记为已丢失。当你的应用程序顺次移动到后台时,它的主缓冲区被标记为已丢失,并且在应用程序再次移动到前台时被恢复。
如果一个DirectSound驱动器不在用户系统中时,你无法设置写主缓冲区协作级别。为判断是否出于这种情形,调用IDirectSound8::GetCaps方法,并检查DSCAPS结构中DSCAPS_EMULDRIVER标识。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值