一个关于用waveout××进行声音播放的问题,请高手帮忙!来者有分~~谢了

kissfall 2005-09-26 01:18:28
我在做视频会议得项目。我们用电话伴侣(和电脑相连,控制电话的)录音然后在本机声卡上播放,现在可以实现,但是内存总是在增加,到最后死掉,我是实时得在电话伴侣得消息处理函数中申请内存,用于声音得线性转化,然后将转化后得声音在声卡上播放出来。代码如下。
//电话伴侣录音消息处理函数
void CVideo::OnRecordBuf1(WPARAM wParam,LPARAM lParam)
{
if(m_recnum1 == 1)
{

//申请头。
LPWAVEHDR pWaveHdr5 = new WAVEHDR;
ZeroMemory(pWaveHdr5,sizeof(WAVEHDR));
//申请空间存放线性转换后的内存。
char *temp = new char[128];
//初始化
memset(temp,0,128);
//电话伴侣将声音线性转换得函数,转换后得声音放在temp中。
TV_ALaw2Linear((char*)lParam,wParam,(short int*)temp);
//填充Pwavehdr。
pWaveHdr5->lpData = (LPSTR)temp;
pWaveHdr5->dwBufferLength = 2*wParam;
pWaveHdr5->dwBytesRecorded = 0;
pWaveHdr5->dwUser = 0;
pWaveHdr5->dwFlags = 0;
pWaveHdr5->dwLoops = 0;
// 准备头写声卡
waveOutPrepareHeader (hWaveOut, pWaveHdr5, sizeof(WAVEHDR));
waveOutWrite(hWaveOut, pWaveHdr5, sizeof(WAVEHDR));
}
}
播放完一块内存,都会进入声卡的回调函数,我将播放完的内存在这里释放。
//使用电话伴侣时本机声卡播放的回调函数
void CALLBACK CVideo::waveOutProc(HWAVEOUT hwo,UINT uMsg,DWORD dwInstance,DWORD dwParam1,DWORD dwParam2)
{
if( uMsg == WOM_DONE)
{
//得到刚播放完的wavehdr。
PWAVEHDR hdr = (PWAVEHDR)dwParam1;
//释放掉存放播放的内存数据。
delete []hdr->lpData;
hdr->lpData = NULL;
waveOutUnprepareHeader(hWaveOut,(WAVEHDR*)dwParam1,sizeof(WAVEHDR));
//删除wavehdr指针。
delete hdr;
hdr = NULL;
}
}
为什么我在播放的时候申请的内存已经释放了,为什么运行程序的时候内存还是在增加呢,说明还有内存泄漏,关于waveout××api函数,我释放的时候,过程对嘛,有什么遗漏的地方嘛,
请各位帮忙,急,在线等,顶者有分,谢了。
...全文
227 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
kissfall 2005-10-11
  • 打赏
  • 举报
回复
确实如楼上所说,
我也知道是应该这样,但是,我用的电话伴侣这个硬件,当我在回调函数中(声卡播放)进行
waveOutUnprepareHeader
delete []hdr->lpData;
hdr->lpData = NULL;的时候,他会非法操作。
现在我换到在声卡播放的消息处理函数中进行就可以了。但是又有问题了,^_^。
多谢各位支持,请继续支持,现在揭帖!
菜牛 2005-09-26
  • 打赏
  • 举报
回复
提个意见,仅供参考:
MSDN上,waveOutUnprepareHeader
The waveOutUnprepareHeader function cleans up the preparation performed by the waveOutPrepareHeader function. This function must be called after the device driver is finished with a data block. You must call this function before freeing the buffer.

注意最后一句:先调用这个函数,再释放缓冲区。就是说,你把
delete []hdr->lpData;
hdr->lpData = NULL;
放到这个函数调用后面试试看。
快乐鹦鹉 2005-09-26
  • 打赏
  • 举报
回复
那你把代码给我发过来。我看一下。是否有什么代码上的漏洞。
happyparrot@126.com
kissfall 2005-09-26
  • 打赏
  • 举报
回复
是啊,还没解决啊,代码简单,但是需要一个硬件 电话伴侣,所以调试困难啊,
多谢鹦鹉大哥~~
快乐鹦鹉 2005-09-26
  • 打赏
  • 举报
回复
楼主这个问题还没有解决啊?
代码简单否?需要环境么?简单的话,发给我调试一下
kissfall 2005-09-26
  • 打赏
  • 举报
回复
kissfall 2005-09-26
  • 打赏
  • 举报
回复
大家帮忙 啊
kissfall 2005-09-26
  • 打赏
  • 举报
回复
谢谢回复,我确定那块内存释放了,调试过了,用过waveout××函数嘛,真是郁闷,看不出哪里内存泄漏啊,而且,用BoudsChecker显示没有内存泄漏啊,
请多多指教~~
hxfhxf 2005-09-26
  • 打赏
  • 举报
回复
先确认你的内存释放函数确实被调用了,加断点看看,或者直接加一句afxmessagebox()之类.....确认内存被释放了

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧