欢迎关注公众号可以查看更多完整文章
流化是一个过程,在这个过程中,我们只需要在内存中维护一小块内存来播放音频文件。这样我们就可以使用很大的音频文件作为背景音乐,而不占用很大的内存。当我们流化一个音频文件的时候,音频数据是从硬盘上一块一块的读取,而不是将整个文件一次性全部加载。流化是通过异步读取音频数据到硬盘缓冲区队列来完成的。当一个缓冲区填充好数据后,提交给source voice。当source voice播放完成一个缓冲区后,这个缓冲区就可以再次用来读取文件中的数据。通过这种方式循环使用缓冲区,允许我们只加载一部分文件的数据就可以完成对一个很大的音频文件的播放。流化的代码应该放在一个单独的线程中,这样当需要等待长时间的读取或者音频播放操作时可以睡眠。当音频播放完成时,我们可以使用回调触发事件来唤醒线程。
创建一个类继承IXAudio2VoiceCallback接口,并实现。在 void OnBufferEnd( void* ){ SetEvent( hBufferEndEvent ); }方法中设置一个事件,当音频播放需要等待时,线程会自动进入睡眠,当当前buffer播放完成时,SetEvent中的事件被触发从而唤醒线程。
例子的主要实现方法是,在主线程中完成CO