lm68140318 发表于 2023-8-3 22:42:12

MM_WIM_DATA


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));   对原缓冲区要重新指定   起到什么效果??


Mike_python小 发表于 2023-8-3 22:42:28

在该代码中,waveInAddBuffer 函数用于重新指定音频输入设备的缓冲区,并且将指定的缓冲区添加到音频输入队列中以接收新的音频数据。

当音频输入设备采集到一定量的音频数据时,通过 OnMM_WIM_DATA 函数进行处理。在处理过程中,首先将已录制的音频数据复制到一个新分配的内存块中,以确保新分配的内存能够容纳已录制的数据以及之前已经存在的数据。

然后,通过调用 waveInAddBuffer 函数,重新指定缓冲区,告诉音频输入设备应该使用新的缓冲区来接收新的音频数据。这样做是为了在处理完当前缓冲区的数据后,将新录制的数据追加到之前已经录制的数据之后,以便完整地保存整个音频流。

总结起来,waveInAddBuffer 的作用是告诉音频输入设备使用新的缓冲区来接收新的音频数据,以便在处理完当前缓冲区的数据后,继续录制新的数据并保存完整的音频流。

希望以上解答能够帮到你。如有其他问题,请随时追问。

学习编程中的Ben 发表于 2023-8-3 22:42:30

回答:

对于 waveInAddBuffer 函数,它的作用是将指定的音频缓冲区重新添加到音频输入设备队列中。

在代码中,waveInAddBuffer(hWaveIn, (PWAVEHDR)lParam, sizeof(WAVEHDR)) 的作用是重新将 (PWAVEHDR)lParam 指向的音频缓冲区添加到 hWaveIn 指定的音频输入设备的队列中,以便下一次进行数据采集。

在音频输入设备采集音频数据时,通常会使用多个音频缓冲区进行循环使用。每当一个音频缓冲区被填充满后,就会触发 MM_WIM_DATA 消息,并执行相应的处理操作。然后,通过调用 waveInAddBuffer 函数,将已经处理完的音频缓冲区重新添加到音频输入设备的队列中,以便继续采集新的音频数据。

这样做的目的是为了实现持续的音频数据采集,保证音频输入设备不间断地从缓冲区中获取音频数据。通过循环使用多个音频缓冲区,可以避免音频输入设备在采集过程中出现等待的情况,提高了音频数据的连续性和实时性。

希望以上解答对你有帮助。如有任何疑问,请随时追问。

如果回答对你有帮助,请给我一个最佳答案!{:10_254:}{:10_254:}{:10_254:}

isdkz 发表于 2023-8-3 22:42:31

在这段代码中, waveInAddBuffer 函数用于将指定的音频缓冲区添加到音频输入设备的输入队列中,以便继续录制音频数据。通过调用 waveInAddBuffer 函数,将原始的音频缓冲区重新指定给音频输入设备,使其可以继续使用该缓冲区来接收新的音频数据。

在这段代码中, waveInAddBuffer 函数的参数 (PWAVEHDR)lParam 是指向 WAVEHDR 结构的指针,该结构标识包含数据的缓冲区。通过重新指定缓冲区,音频输入设备可以将新录制的音频数据存储到该缓冲区中,以便后续处理。

重新指定缓冲区的目的是为了确保音频输入设备可以继续使用正确的缓冲区来接收音频数据。这样可以保证在处理完当前缓冲区的数据后,音频输入设备可以继续录制新的音频数据,并将其存储到正确的位置。否则,如果不重新指定缓冲区,音频输入设备可能会将新的音频数据存储到错误的位置,导致数据混乱或丢失。

因此,通过调用 waveInAddBuffer 函数并重新指定缓冲区,可以确保音频输入设备可以持续录制音频数据,并将其正确地存储到指定的缓冲区中。

lm68140318 发表于 2023-8-3 22:57:02

Mike_python小 发表于 2023-8-3 22:42
在该代码中,waveInAddBuffer 函数用于重新指定音频输入设备的缓冲区,并且将指定的缓冲区添加到音频输入队 ...

我认为:发出MM_WIM_DATA时,会设置dwFlags的WHDR_DONE,并将缓冲区返回给应用程序,也就是说此时麦克风不在 拥有 这个缓冲区,需要waveInAddBuffer重新 指定,我这样 理解对码?

lm68140318 发表于 2023-8-3 22:59:50

isdkz 发表于 2023-8-3 22:42
在这段代码中, waveInAddBuffer 函数用于将指定的音频缓冲区添加到音频输入设备的输入队列中,以便继续录 ...

我认为:发出MM_WIM_DATA时,会设置dwFlags的WHDR_DONE,并将缓冲区返回给应用程序,也就是说此时麦克风不在 拥有 这个缓冲区,需要waveInAddBuffer重新 指定,我这样 理解对码?

isdkz 发表于 2023-8-3 23:10:21

lm68140318 发表于 2023-8-3 22:59
我认为:发出MM_WIM_DATA时,会设置dwFlags的WHDR_DONE,并将缓冲区返回给应用程序,也就是说此时麦克风 ...

是的,你的理解是正确的。当音频输入设备完成对指定缓冲区的数据录制后,会发出 MM_WIM_DATA 消息,并将缓冲区的所有权返回给应用程序。此时,音频输入设备不再拥有这个缓冲区,因此不能再向其中写入新的音频数据。
在这种情况下,如果你想让音频输入设备继续录制音频数据,就需要通过调用 waveInAddBuffer 函数,将缓冲区重新指定给音频输入设备。这样,音频输入设备就可以继续使用这个缓冲区来接收新的音频数据。

因此,你的理解是正确的,当音频输入设备完成对缓冲区的数据录制并发出 MM_WIM_DATA 消息后,需要通过调用 waveInAddBuffer 函数,将缓冲区重新指定给音频输入设备,以便继续录制音频数据。
页: [1]
查看完整版本: MM_WIM_DATA