DIY编程器网

标题: Windows Mobile下播放PCM音频的双缓冲用法 [打印本页]

作者: liyf    时间: 2012-1-22 00:20
标题: Windows Mobile下播放PCM音频的双缓冲用法
  最近用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,并设置好相应长度;       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。       本文为Windows Embedded征文比赛获奖文章。
                          
                       
                          
                               




欢迎光临 DIY编程器网 (http://diybcq.com/) Powered by Discuz! X3.2