用声卡录音后为何跟到MM_WIM_DATA()的响应函数的结束处出错?

ilovevisio1 2004-12-08 12:39:14
出错信息为:
Unhandled exception in Recorder.exe(WDMAUD.DRV): 0xC00000005: Access Violation.

胸闷呀.
...全文
269 点赞 收藏 9
写回复
9 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
linguanyu315 2004-12-14
楼主,我仔细看了,并且测试了你的OnMM_WIM_DATA(),你把"delete pHdr->lpData;delete pHdr;"去掉,很可能就可以了.至少,在我的机子上可以.
回复
linguanyu315 2004-12-14
对了,我只测试了你关于录音的部分.对于另外的部分,如下,我无法测试.就是说除了下面的.其他部分可以了,但要把"delete pHdr->lpData;delete pHdr;"去掉.
CBuffer buf(pHdr->lpData, pHdr->dwBufferLength);

// if (!recordpaused)
{ //write only if not paused

//Write Data to file
DataFromSoundIn(&buf);

}
回复
linguanyu315 2004-12-13
我做录音程序的时候,也做法和楼主类似,在这个OnMM_WIM_DATA()里面使用waveInPrepareHeader(),waveInUnprepareHeader().因为如MSDN所述:This function cleans up the preparation performed by waveInPrepareHeader. The function must be called after the device driver fills a data buffer and returns it to the application. You must call this function before freeing the data buffer.但出现同样问题.我采取的方法如上所述,解决了问题.楼主可以试试.
为什么我不是很清楚.我认为,重要的是You must call this function before freeing the data buffer.
回复
everandforever 2004-12-13
楼主的用法本身似乎没错。你最好能确认是哪一句错了
回复
linguanyu315 2004-12-13
对不起,打错了一个字,waveInPrepareHeader(),在打开设备"后"(不是"前")使用一次,就可以了.
回复
linguanyu315 2004-12-13
楼主,waveInUnprepareHeader()这个函数,在关闭设备前使用一次.waveInPrepareHeader(),在打开设备前使用一次.这样就可以了.在OnMM_WIM_DATA()里面,你把他们去掉就应该没有问题了.试试吧,如过还有问题,write mail to me:linguanyu315@163.com
回复
ilovevisio1 2004-12-08
up
回复
ilovevisio1 2004-12-08
打开方式:
mmReturn = ::waveInOpen( &m_hRecord, AudioDeviceID, &m_Format,(DWORD) hWndGlobal, NULL, CALLBACK_WINDOW ); //use on message to map.....

函数代码.
void CRecorderDlg::OnMM_WIM_DATA(UINT parm1, LONG parm2)
{
MMRESULT mmReturn = 0;

LPWAVEHDR pHdr = (LPWAVEHDR) parm2;

mmReturn = ::waveInUnprepareHeader(m_hRecord, pHdr, sizeof(WAVEHDR));
if(mmReturn)
{
// waveInErrorMsg(mmReturn, "in OnWIM_DATA()");
return;
}

TRACE("WIM_DATA %4d\n", pHdr->dwBytesRecorded);

// if (recordstate)
{
CBuffer buf(pHdr->lpData, pHdr->dwBufferLength);

// if (!recordpaused)
{ //write only if not paused

//Write Data to file
DataFromSoundIn(&buf);

}

// reuse the buffer:
// prepare it again
mmReturn = ::waveInPrepareHeader(m_hRecord,pHdr, sizeof(WAVEHDR));
if(mmReturn)
{
// waveInErrorMsg(mmReturn, "in OnWIM_DATA()");
}
else // no error
{
// add the input buffer to the queue again
mmReturn = ::waveInAddBuffer(m_hRecord, pHdr, sizeof(WAVEHDR));
// if(mmReturn) waveInErrorMsg(mmReturn, "in OnWIM_DATA()");
// else return; // no error
}

}

// we are closing the waveIn handle,
// all data must be deleted
// this buffer was allocated in Start()
delete pHdr->lpData;
delete pHdr;
m_QueuedBuffers--;

}



回复
linguanyu315 2004-12-08
能不能看看你MM_WIM_DATA的响应函数的代码? 还有你声卡以什么方式打开的?
回复
相关推荐
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2004-12-08 12:39
社区公告

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