DirectSound学习指南之协作级别

文章作者 100test 发表时间 2007:10:10 12:27:59
来源 100Test.Com百考试题网


协作级别

  因为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标识。

相关文章


DirectSound学习指南之设备性能
DirectShow学习指南之Filter的连接
DirectSound学习指南之枚举声音设备
利用VisualC 制作应用程序启动画面
DirectSound学习指南之协作级别
用VC获取其它程序的命令行参数
VC中利用WinAPI实现自绘按钮类
DirectShow入门之动态构建FilterGraph
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛