织梦CMS - 轻松建站从此开始!

罗索

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

落鹤生 发布于 2009-12-08 09:55 点击:次 
最近用libmad做了些mp3解码的工作,顺便也研究了一下windows下播放PCM音频数据的双缓冲用法。
TAG:

       最近用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征文比赛获奖文章。

(李利平)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/200912/8095.html]
本文出处:未知 作者:李利平
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容