DirectSound学习(二)--流式缓冲区
使用流式缓冲方式播放波形音频文件比较复杂,主要原因是在只有一个缓冲区提供给用户的前提下,这个缓冲区在提供给声卡播放数据的同是还需要用户不断的定时向其中写入数据。要注意从缓冲区这时是一个环形缓冲区,声音的播放和数据的写入都是从缓冲区中循环进行的。
波形音频数据写入到从缓冲区时需要三个因素:①写入的实践,也就是什么时候开始写入;
②写入位置,也就是要从从缓冲区的哪一个点开始写入;
③写入数据量,也就是从缓冲区有多少缓冲数据已经播放完,可以用新数据填充。
写入时机可以由用户自己预先在从缓冲区中固定位置定义一些通知事件触发点,当播放到这些位置时,就会触发相应的事件,这时我们就可以写入新的PCM格式的数据。写入位置和写入数据量都可以在这时调用DirectSoundApi函数获得。如果写入点在接近从缓冲区结束的位置上,而需要写入的数据量超过了剩余空间,这时,我们首先将数据填充从缓冲区的剩余部分,然后将剩下未写入的数据填充到从缓冲区的开始位置。
①准备工作:
在播放之前,必须先向从缓冲区填充一部分波形音频数据,否则在开始播放后和数据填充前会随机播放一些噪音。预先写入数据块的大小最大可与从缓冲区大小相等,最小不能小于所设置的第一个通知位置。
②第一次播放到通知位置I时
开始播放后,会有一个播放进度指针在缓冲区移动,当它直到通知位置I时,会触发一个事件,用户这时应负责读取新的数据填充到从缓冲区中无效的区域中,上述中填充需要分两步,首先填充从缓冲区中尾部的无效区域,然后填充从缓冲区头部的无效区域。
③第一次播放到通知位置2时
播放到通知位置2时会产生一个事件,这时用户应当负责读取新的数据填充到从缓冲区中最新无效的区域中。
实现DirectSound播放的关键步骤
DirectSound同DirectX中的其它部件一样,都是基于组件对象模型创建的,,涉及到的组件对象包括DirectSound对象的IDirectSound管理缓冲区的IDirectSoundBuffer和在不放过程中传递消息的IDirectSoundNotify这三个组件对象。通过这些对象提供的借口完成实际的操作。
①创建并设置DirectSound对象
②打开波形音频文件
③创建从缓冲区
④在从缓冲区中设置触发通知事件的位置
⑤在播放过程中处理通知事件
⑥读取数据写入从缓冲区
⑦关闭DirectSound设备