最近用libmad做了些mp3解码的工作,顺便也研究了一下windows下播放PCM音频数据的双缓冲用法。
libmad的调用在此暂略过不表。
libmad解码出来的是16bit的PCM数据,调用windows API可对其实现播放。不过如果解码一段播放一段,听起来会有一顿一顿的感觉,不流畅,究其原因,是没有使用双缓冲。
吭哧吭哧研究了半天,终于编码实现,播放出来的效果倒也很流畅。
流程如下:
1)声明两个WAVEHDR结构waveHeader1,waveHeader2,并分别对其lpData参数分配缓冲buf1,buf2;
2)声明WAVEFORMATEX结构waveFormat,以及HWAVEOUT结构hWaveOut。调用函数
waveOutOpen( &hWaveOut, WAVE_MAPPER, &waveFormat, (DWORD)waveOutProc, NULL, CALLBACK_FUNCTION );
waveOutProc为回调函数,在后面会提到。
也说一下waveFormat的各参数。根据MSDN解释,nChannels为通道数,nSamplesPerSec为采样率,wFormatTag的值为WAVE_FORMAT_PCM,wBitsPerSample为16,nBlockAlign为nChannels*wBitsPerSample/8,nAvgBytesPerSec为nSamplesPerSec*nBlockAlign;
3)读入buf1,buf2,并设置好相应长度;

本文介绍了如何在Windows Mobile中实现PCM音频的流畅播放,通过双缓冲技术解决了播放过程中可能出现的不连续问题。文章详细阐述了从分配缓冲区、设置WAVEHDR结构、配置WAVEFORMATEX到调用API播放的流程,以及回调函数waveOutProc在处理播放完毕后的操作。

447

被折叠的 条评论
为什么被折叠?



