马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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 缓冲区中已有的音频数据
dwDataLength 是缓冲区大小
*/
if (pNewBuffer == NULL)
{
waveInClose(hWaveIn);
MessageBeep(MB_ICONEXCLAMATION);
AfxMessageBox(_T("erro memory"));
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;
}
我的问题:要从麦克风的缓冲区读取数据
pNewBuffer = (PBYTE)realloc(pSaveBuffer, dwDataLength + ((PWAVEHDR)lParam)->dwBytesRecorded);
/*
((PWAVEHDR)lParam)->dwBytesRecorded 缓冲区中已有的音频数据字节数
dwDataLength 是缓冲区大小
*/
上面这条指令(PWAVEHDR)lParam)->dwBytesRecorded 就是缓冲区中已有的音频数据字节数,为何还要加上dwDataLength缓冲区大小呢 ?
不完全是。MM_WIM_DATA消息是在音频输入设备完成缓冲区的数据采集后发送的。发送此消息后,缓冲区中的数据不会自动清空,而是需要你在代码中显式地处理。
在你的代码中,你使用了waveInAddBuffer函数来重新将缓冲区添加到音频输入设备的队列中。这意味着,一旦数据被处理(在这种情况下,是被复制到pSaveBuffer),这个缓冲区就可以被音频输入设备重新使用,以便采集更多的音频数据。
所以,虽然缓冲区在发送MM_WIM_DATA消息后不会自动清空,但是你的代码确实在处理完数据后清空了缓冲区,以便它可以被重新使用。这是通过将缓冲区重新添加到音频输入设备的队列中来实现的。
|