WaveOut系列多段缓冲播放

wave的播放方法很多,可以用dsound,dshow,甚至是sndPlay,sendMciString等等方法都可以实现。但是这都是对于windows平台下的音频播放,如果换到windows mobile平台,就未必支持以上几种方式,这时就必须用到低级的wave系列的API了。

步骤1:
申请二个或二个以上的WAVEHDR结构,m_WaveHdr1,m_WaveHdr2
填充WAVEHDR结构, 如下:
m_WaveHdr1.lpData           = (LPTSTR)_pWaveData + 44;
m_WaveHdr1.dwBufferLength  = PLAY_BUFFE_SIZE;
m_WaveHdr1.dwBytesRecorded = 0;
m_WaveHdr1.dwUser          = 0;
m_WaveHdr1.dwFlags         = WHDR_BEGINLOOP | WHDR_ENDLOOP;
m_WaveHdr1.dwLoops         = 1;
m_WaveHdr1.lpNext          = NULL;
m_WaveHdr1.reserved        = 0;
// 第二个的数据起止位置一定要大于第一个数据的播放缓冲大小,否则可能会声音不正常。
m_WaveHdr2.lpData          = (LPTSTR)_pWaveData + 44 + PLAY_BUFFE_SIZE;
m_WaveHdr2.dwBufferLength  = PLAY_BUFFE_SIZE;
m_WaveHdr2.dwBytesRecorded = 0;
m_WaveHdr2.dwUser          = 0;
m_WaveHdr2.dwFlags         = WHDR_BEGINLOOP | WHDR_ENDLOOP;
m_WaveHdr2.dwLoops         = 1;
m_WaveHdr2.lpNext          = NULL;
m_WaveHdr2.reserved        = 0;

步骤2:
在回调函数、回调线程或回调窗口的 WOM_DONE 响应里,作以下操作,
LPWAVEHDR pWaveHeader  = (LPWAVEHDR)dwParam1;   // 系统自动识别是哪一个WAVEHDR播放完毕
waveOutUnprepareHeader(hwo, pWaveHeader, sizeof(WAVEHDR)); // 清空设备缓存
   pWaveHeader->lpData     += (5 * PLAY_BUFFE_SIZE);
   pWaveHeader->dwBufferLength = pThis->m_lLeaveSize < PLAY_BUFFE_SIZE ? pThis->m_lLeaveSize : PLAY_BUFFE_SIZE;   // 得到正确的缓冲大小.
   waveOutPrepareHeader(hwo, pWaveHeader, sizeof(WAVEHDR));
   waveOutWrite(hwo, pWaveHeader, sizeof(WAVEHDR));

完成以上步骤,及可实现多段缓冲播放。 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值