马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
afx_msg LRESULT CcsyinDlg::OnMM_WIM_DATA(WPARAM wParam, LPARAM lParam) //当音频输入设备采集到一定量的音频数据时触发
{
/*
wParam = (WPARAM) hInputDev 接收数据的波形音频输入设备的句柄
lParam = (LONG) lpwvhdr 指向 WAVEHDR 结构的指针,该结构标识包含数据的缓冲区
*/
pNewBuffer = (PBYTE)realloc(pSaveBuffer, dwDataLength + ((PWAVEHDR)lParam)->dwBytesRecorded);
/*
((PWAVEHDR)lParam)->dwBytesRecorded 缓冲区中已有的音频数据
说明:通过将已录制的音频数据字节数与当前缓冲区大小相加,你确保新分配的内存能够容纳已录制的数据以及之前已经存在的数据。
这是因为在音频数据流中,每次处理完缓冲区中的数据后,你需要将新录制的数据追加到之前已经录制的数据之后,
以便完整地保存整个音频流。所以你需要确保重新分配的内存大小足够大,以容纳已有的数据和新录制的数据
*/
if (pNewBuffer == NULL)
{
waveInClose(hWaveIn); //关闭指定的波形输入设备
/*
参数:HWAVEIN hwi
返回值:MMRESULT 如果成功则返回MMSYSERR_NOERROR
MMSYSERR_INVALHANDLE 指定的设备句柄无效
MMSYSERR_NODRIVER 不存在设备驱动程序
MMSYSERR_NOMEM 无法分配或锁定内存
WAVERR_STILLPLAYING 队列中仍有缓冲区
*/
MessageBeep(MB_ICONEXCLAMATION);
AfxMessageBox(_T("内存数据错误"));
return TRUE;
}
pSaveBuffer = pNewBuffer;
CopyMemory(pSaveBuffer + dwDataLength, ((PWAVEHDR)lParam)->lpData,((PWAVEHDR)lParam)->dwBytesRecorded); //复制音频数据
dwDataLength += ((PWAVEHDR)lParam)->dwBytesRecorded;
if (bEnding)
{
waveInClose(hWaveIn);
return TRUE;
}
waveInAddBuffer(hWaveIn, (PWAVEHDR)lParam, sizeof(WAVEHDR));//重新指定缓冲区
return 0;
}
我的问题:音频数据复制完之后,
waveInAddBuffer(hWaveIn, (PWAVEHDR)lParam, sizeof(WAVEHDR)); 对原缓冲区要重新指定 起到什么效果 ??
是的,你的理解是正确的。当音频输入设备完成对指定缓冲区的数据录制后,会发出 MM_WIM_DATA 消息,并将缓冲区的所有权返回给应用程序。此时,音频输入设备不再拥有这个缓冲区,因此不能再向其中写入新的音频数据。
在这种情况下,如果你想让音频输入设备继续录制音频数据,就需要通过调用 waveInAddBuffer 函数,将缓冲区重新指定给音频输入设备。这样,音频输入设备就可以继续使用这个缓冲区来接收新的音频数据。
因此,你的理解是正确的,当音频输入设备完成对缓冲区的数据录制并发出 MM_WIM_DATA 消息后,需要通过调用 waveInAddBuffer 函数,将缓冲区重新指定给音频输入设备,以便继续录制音频数据。
|