当前位置: 代码迷 >> 多媒体/流媒体开发 >> waveOutUnprepareHeader 报错很频繁怎么处理
  详细解决方案

waveOutUnprepareHeader 报错很频繁怎么处理

热度:10398   发布时间:2013-02-26 00:00:00.0
waveOutUnprepareHeader 报错很频繁怎么办?
我用的双缓冲,结果发现
switch(uMsg)
{
  case WOM_DONE:
waveOutUnprepareHeader(hwo,dwParam1,sizeof(WAVEHDR));
m_pMain->PlaySound(*dwParam1);
break;
}
这里的waveOutUnprepareHeader(hwo,dwParam1,sizeof(WAVEHDR))很频繁的出错,返回的dwParam1是错误的指针,返回的错误值是11,结果好像这次播放就跳过去了,如果写入的缓冲设大一点,那么中间就会有音掉了,如果缓冲小一点,播出来的声音又发颤,像哭.为什么waveOutUnprepareHeader会出错啊?我该怎么改呢

------解决方案--------------------------------------------------------
那就注释掉这行。
------解决方案--------------------------------------------------------
waveOutUnprepareHeader()应该只在WOM_CLOSE消息中执行
------解决方案--------------------------------------------------------
waveOutPrepareHeader()的参数是否正确?
waveOutPrepareHeader()也只应调用一次,在waveOutOpen()后。
------解决方案--------------------------------------------------------
我调用一次使用很正常,这样效率高些,你的头参数是否设置有问题。
m_waveHeader[i].dwUser=i; //缓冲内存块序号
m_waveHeader[i].lpData =m_pBufPlay[i];//和上面序号一致。
m_waveHeader[i].dwBufferLength =BUF_SIZE;
m_waveHeader[i].dwBytesRecorded = 0 ;
m_waveHeader[i].dwFlags = WHDR_DONE ;
m_waveHeader[i].dwLoops = 1 ;
m_waveHeader[i].lpNext = NULL ;
m_waveHeader[i].reserved = 0 ;
响应WM_DONE消息时
LPWAVEHDR pHdr=(LPWAVEHDR)dwParam1;
int index=pHdr->dwUser;
m_waveHeader[Index].lpData=m_pBufPlay[Index];//填充对应缓冲
::waveOutWrite(m_waveOut, &m_waveHeader[Index], sizeof(WAVEHDR));