游行天涯

为当初的美好而努力

DirectSound回放

DirectSound回放的基本流程

1.创建DirectSound对象;

2.设置设备的协作等级;

3.创建缓冲区并设置播放格式;

4.调用播放和控制函数实现声音的播放和控制。

详细步骤:

1.枚举系统输出声音设备,调用DirectSoundEnumerate函数;

2.创建DirectSound对象,调用全局函数DirectSoundCreate8可以创建一个IDirectSound8接口,通过调用该接口的各种方法,可以生成缓冲区对象,获取和设置设备对象的属性等;

3.设置声音设备的协作等级,调用IDirectSound8::SetCooperativeLevel函数;

4.创建声音缓冲区对象。为创建一个声音缓冲区,应用程序需要填充一个DSBUFFERDESC结构,然后调用IDirectSound8::CreateSoundBuffer方法,CreateSoundBuffer将创建一个直接缓冲区对象(DirectSoundBuffer)并返回一个指向IDirectSoundBuffer接口的指针,之后可以通过这个接口指针获取IDirectSoundBuffer8接口来进行缓冲区的播放和其他缓冲区操作;

5.加载WAVE声音数据,调用mmioOpen、mmioDescend、mmioAscend、mmioRead等函数;

6.声音缓冲区回放。注意,将声音数据写入声音缓冲区必须遵循一定的步骤:

给静态缓冲区加载声音数据的步骤

①调用IDirectSoundBuffer8::Lock方法锁住整个缓冲区,并制定数据写入缓冲区位置的偏移量(通常为0,即从缓冲区起始地址开始写入),并得到该点的内存地址(指针);
②用标准的内存拷贝方法,将声音数据写入返回的内存地址;
③调用IdirectSoundBuffer8::Unlock方法解锁缓冲区。

给流缓冲区加载音频数据的步骤

①确保缓冲区以做好接收数据的准备;
②调用IDirectSoundBuffer8::Lock函数锁住缓冲区的位置,该函数返回一个或两个可以写入数据的地址;
③使用标准的拷贝数据的方法将音频数据写入缓冲区;
④使用IDirectSoundBuffer8::Unlock函数解锁缓冲区。

注意事项

1.当应用程序使用用户首选的输出设备(通过控制面板设置的缺省声音输出设备)来输出声音时,不必枚举系统中所有的输出设备。但如果需要两个及以上的设备,或者提供用户自己选择输出设备的功能时,则需要枚举系统中的声音输出设备。

2.在播放音频缓冲区之前必须调用协作等级的方法,通常在创建DirectSound对象之后就立即调用,否则将听不到声音。因为Windows采用的是多任务机制,同一时间可能有多个应用程序在使用同一个设备的驱动程序。通过设置协作等级的方法,DirectX保证了每个应用程序不会在错误的时间或以错误的方式取得对设备的访问权。每个DirectSound应用程序有一个协作等级决定了它被允许访问设备的范围和程度。

3.应用程序在初始化DirectSound时,它会自动创建一个主声音缓冲来进行混音处理并把声音送往输出设备。应用程序必须创建一个或多个二级缓冲区来存储和播放独立的声音信息。在创建一个二级声音缓冲区时,需要定义其为静态声音缓冲区还是流式声音缓冲区。


阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gkzscs/article/details/53995441
文章标签: C++ WAVE directx
个人分类: C++ 音频开发
上一篇WAVE录音
下一篇DirectSound录音
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭