zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    zzuli--2134: 维克兹的进制转换(规律)
    hdu--1316--How Many Fibs?(java大数)
    NYOJ--517--最小公倍数(大数打表)
    NYOJ--513--A+B Problem IV(大数)
    NYOJ--45--棋盘覆盖(大数)
    NYOJ--114--某种序列(大数)
    HAUT--1262--魔法宝石(暴力)
    NYOJ--1276--机器设备(河南省第九届省赛,简单的bfs)
    hdu--1429--胜利大逃亡(续) (bfs+状态压缩)
    NYOJ--541--最强DE 战斗力(递推)
  • 原文地址:https://www.cnblogs.com/fengju/p/6173570.html
Copyright © 2011-2022 走看看