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采集播放声音技术文档

DirectSound采集播放声音技术文档
  • zdy_ruoshui
  • zdy_ruoshui
  • 2013年12月12日 17:40
  • 2288

DirectSound开发指南(1)

1DirectSound简介(Introduction to DirectSound)       曾经学习过Directshow的开发,对于Dsound一直没有仔细的莱学习,以前只是知道Dsound...
  • aoosang
  • aoosang
  • 2005年11月01日 22:11
  • 12814

VC Directsound开发环境配置

在进行DirectSound开发之前,一定要设置好开发环境,否则编译时会提示你很多东西都找不到定义,DirectSound的开发环境很好设置,简单的说就是包含一些头文件,将lib文件添加要工程中。仅仅...
  • D_MIC
  • D_MIC
  • 2012年03月14日 10:03
  • 1299

DirectSound入门指南(0)播放声音

过去PC机上播放声音和音乐比登天还难!然而,随着DirectSound和DirectMusic的出现,这一切变得相当容易了。本文根据《Windows游戏编程大师技巧》一书学习了DirectSound基...
  • williamaiden
  • williamaiden
  • 2017年05月29日 09:29
  • 1144

DirectSound 与Waveout的区别

Q Directsound 与 Waveout 有何不同? A Waveout 是在32位的Windows上的一种老旧且过时,用来播放数字音讯的应用程序接 口(Application Progra...
  • wishfly
  • wishfly
  • 2015年10月17日 21:27
  • 12689

一个DirectSound的例子,即录即放

一个捕获音频并且播放的例子,可以用来唱歌^_^写了半天才发现Direct SDK有个类似的例子,所以到了最后几乎都是照抄了。声音效果不太好,修改一下加上网络传送功能做成语音聊天工具。不过这样肯定不行,...
  • benny5609
  • benny5609
  • 2008年02月09日 19:17
  • 1903

DirectSound入门基础介绍 和 环境的配置

DirectSound应用程序开发快速入门   摘要:DirectSound编程的入门介绍,通过实例讲解了如何利用DirectSound最基本的功能:播放音频,并提供了DirectSound播放音...
  • FrankieWang008
  • FrankieWang008
  • 2013年10月28日 09:59
  • 3324

使用DirectSound播放MP3文件

http://www.cppblog.com/codejie/archive/2009/03/26/77916.html 使用DirectSound播放MP3文件     将对...
  • woshiyuanlei
  • woshiyuanlei
  • 2015年06月02日 23:02
  • 650

windows平台DirectSound编程的替代者XAudio2编程

仿真的音效终于安排给做了,以前我主动要做,被主管经理推迟了。现在研究DirectSound实现了混音效果。 但是还是觉得意犹未尽。仔细的看了现在装的DirectSDK2010(常见名字为:DXSDK_...
  • thanklife
  • thanklife
  • 2016年11月30日 17:28
  • 814

关于DirectSound播放声音缓存的一些认识

关于DirectSound播放声音时缓冲区的工作原理,书上讲的不是很清楚,自己也曾经对这个东西模糊了好久。现在有了自己的一点认识,希望能帮助初学DirectSound的朋友。 先看下图,我们将缓存区设...
  • u011089298
  • u011089298
  • 2013年08月08日 16:03
  • 1389
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:DirectSound回放
举报原因:
原因补充:

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