新闻中心

EEPW首页 > 消费电子 > 设计应用 > Windows Mobile下播放PCM音频的双缓冲用法

Windows Mobile下播放PCM音频的双缓冲用法

作者:时间:2009-12-03来源:网络收藏

最近用libmad做了些mp3解码的工作,顺便也研究了一下windows下数据的双

本文引用地址:http://www.eepw.com.cn/article/166846.htm

libmad的调用在此暂略过不表。

libmad解码出来的是16bit的数据,调用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_,wBitsPerSample为16,nBlockAlign为 nChannels*wBitsPerSample/8,nAvgBytesPerSec为nSamplesPerSec*nBlockAlign;

3)读入buf1,buf2,并设置好相应长度;

4)将waveHeader1,waveHeader2写入wave设备:
waveOutPrepareHeader( hWaveOut, waveHeader1, sizeof(WAVEHDR));
waveOutPrepareHeader( hWaveOut, waveHeader2, sizeof(WAVEHDR));

waveOutWrite( hWaveOut, waveHeader1, sizeof(WAVEHDR) );
waveOutWrite( hWaveOut, waveHeader2, sizeof(WAVEHDR) );

5)关于回调
void CALLBACK waveOutProc( HWAVEOUT hwo,
UINT uMsg,
DWORD dwInstance,
DWORD dwParam1,
DWORD dwParam2 )
{
if(uMsg == WOM_DONE)
{
LPWAVEHDR pWaveHeader = (LPWAVEHDR)dwParam1;//系统自动识别是哪一个WAVEHDR播放完毕

waveOutUnprepareHeader( hwo, pWaveHeader, sizeof(WAVEHDR) );//播放完后须调用此函数

//此处填充WAVEHDR的lpdate缓冲

waveOutPrepareHeader( hwo, pWaveHeader, sizeof(WAVEHDR));
waveOutWrite( hwo, pWaveHeader, sizeof(WAVEHDR) );

//...
}
return ;
}

6)播放完毕后,调用waveOutClose,释放缓冲。其他的一些waveOut函数,如waveOutPause、 waveOutReset等等,在做播放器的时候会用得到。若播放过程中终止,须先调用waveOutReset,再调用waveOutClose。

本文为 Embedded征文比赛获奖文章。



评论


相关推荐

技术专区

关闭