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

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

胸闷呀.
...全文
358 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
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的响应函数的代码? 还有你声卡以什么方式打开的?

16,548

社区成员

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

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

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