DirectSound回放

原创 2017年01月03日 16:13:11

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


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

DirectSound初步教程 -- 如何从第三发音乐播放器中HOOK音频数据然后跟自己麦采集数据做同步

DirectSound初步教程 -- 如何从第三发音乐播放器中HOOK音频数据然后跟自己麦采集数据做同步 分类: 流媒体技术 音视频网络传输 数字视频处理2014-09-12 12:46...

屏幕录制回放

  • 2015年12月07日 15:16
  • 11KB
  • 下载

LoadRunner脚本回放问题及解决(九)

核心提示:在运行脚本回放过程中,有时会出现错误,这在实际测试中是不可避免的,毕竟自动录制生成的脚本难免会有问题,需要运行脚本进行验证   在运行脚本回放过程中,有时会出现错误,这在实际测试中...

百度地图API四:实现轨迹动态回放功能

本文记录 百度地图实现实现 轨迹回放的功能。   所谓轨迹回放功能。 是指选择某个时间段,然后在地图上再现这个时间段内轨迹的出现情况。 什么时候出现了第几个轨迹点。隔几秒出现下一个轨迹 点。...

Selenium ide的具体操作录制和回放

  • 2014年10月30日 11:19
  • 599KB
  • 下载

基于高德地图API实现车辆轨迹回放并显示实时坐标

一、先上代码: html代码: js代码: var postData = {}; postData['rsearch'] = rsearch; postData['uid...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:DirectSound回放
举报原因:
原因补充:

(最多只允许输入30个字)