Windows Mobile下播放PCM音频的双缓冲用法
电子元件,电子元器件深圳市创唯电子有限公司
您现在的位置: 首页 > 电子技术
Windows Mobile下播放PCM音频的双缓冲用法  2012/3/1
最近用libmad做了些mp3解码的工作,顺便也研究了一下windows下播放PCM音频数据的双缓冲用法。 libmad的调用在此暂略过不表。 libmad解码出来的是16bit的PCM数据,调用windows API可对其实现播放。不过如果解码一段播放一段,听起来会有一顿一顿的感觉,不流畅,究其原因,是没有使用双缓冲。 吭哧吭哧研究了半天,终于编码实现,播放出来的效果倒也很流畅。 流程如下: 1)声明两个WAVEHDR结构waveHeader1,waveHeader2,并分别对

       最近用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, 
 

与《Windows Mobile下播放PCM音频的双缓冲用法》相关列表
电话:400-900-3095
QQ:800152669
库存查询
Copyright(C) 2011-2021 Szcwdz.com 创唯电子 版权所有 备案号:粤ICP备11103613号
专注电子元件代理销售  QQ:800152669  电子邮件:sales@szcwdz.com  电话:400-900-3095