DirectSound之 播放
前面,学习到了创建播放设备,目的自然就是为了播放声音嘛!
DirectSound有一个缓冲区对象IDirectSoundBuffer,该对象表示一个包含数据的缓冲区,这些数据以PCM格式被存储,该对象不仅可以用于开始、停止或暂停声音的播放,还能够设置声音数据中诸如频率和格式等属性。 缓冲区分为主缓冲区和副缓冲区,主缓冲区中是听者将要听到的音频信号,一般是将副缓冲区中信号混音后的结果。而副缓冲区中存放着许多单独的声音信号,有的可以直接播放,有的要混音,有的循环播放。主缓冲区由DirectSound自动创建,而副缓冲区需由应用程序来创建。DirectSound将副缓冲区中的声音混合后,存入主缓冲区,再输出到相应播放设备。
DirectSound中没有解析声音文件的功能,需要自己在应用程序中将不同格式的声音信号改变过来(PCM) 。缓冲区可以在主板的RAM、波表存储器、DMA通道或虚拟存储器中。 多个应用程序可以用同一声音设备来创建DirectSound对象。当输入焦点在应用程序中发生变化时,音频输出将自动在各个应用程序之间切换。于是,应用程序不用在输入焦点改变中反复的
播放和停止他们的缓冲区。通过IDirectSoundNotify接口,当播放到了一个用户指定的地方,或播放结束时,DirectSound将动态地通知拥护这一事件。
上面说了DirectSound自动创建主缓冲区,副缓冲区,要自己创建。
应用程序必须至少创建一个副缓冲区,用来存储要播放的声音数据文件。一个副缓冲区的生命期可以比应用程序还长,所以在不需要的时候,应该要将其释放,一个副缓冲区可以包含整个声音数据,也可以只包含声音数据的一部分,为了限制内存的开销,所以一般在播放长文件时采用流缓冲区,这些流缓冲区中只用包含几秒钟的数据量。
可以通过同时播放几个副缓冲区中的声音来对他们进行混音,至于能同时播放几个副缓冲区
则由硬件设备的性能决定。另外要注意的是,不能创建相同的副缓冲区,副缓冲区的格式一般为
Format: 缓冲区的format必须要和播放音频的waveformat一致
Controls: 不同的缓冲区可以有不同的配置,如音量,频率等。
Location: 缓冲区时是硬件来管理的还是由软件来管理的。硬件缓冲区通常很有效率,但是他不
支持64位的操作系统
这里咱给一个例子创建一个副缓冲区
|