1秒环回录音无限循环读取包数据

Infinite loop reading packet data in 1sec loopback recording

我移植了 MSDN 捕获流示例 - https://msdn.microsoft.com/en-us/library/windows/desktop/dd370800

并针对环回对其进行了修改,与此处所见完全相同 -

https://github.com/slavanap/WaveRec/blob/754b0cfdeec8d1edc59c60d179867ca6088bbfaa/wavetest.cpp

所以我要求录制时长为1秒,实际时长验证为1秒。

但是我在这里读取这个数据包时陷入了无限循环,packetLength 始终是 448 的值(numFramesAvailable 也是 448,我'我不确定为什么它永远不会像 while 循环所期望的那样变为 0。

https://github.com/slavanap/WaveRec/blob/754b0cfdeec8d1edc59c60d179867ca6088bbfaa/wavetest.cpp#L208-L232

密码是-

        while (packetLength != 0)
        {
            // Get the available data in the shared buffer.
            hr = pCaptureClient->GetBuffer(
                                   &pData,
                                   &numFramesAvailable,
                                   &flags, NULL, NULL);
            EXIT_ON_ERROR(hr)

            if (flags & AUDCLNT_BUFFERFLAGS_SILENT)
            {
                pData = NULL;  // Tell CopyData to write silence.
            }

            // Copy the available capture data to the audio sink.
            // hr = pMySink->CopyData(pData, numFramesAvailable, &bDone);
            // EXIT_ON_ERROR(hr)

            hr = pCaptureClient->ReleaseBuffer(numFramesAvailable);
            EXIT_ON_ERROR(hr)

            hr = pCaptureClient->GetNextPacketSize(&packetLength);
            EXIT_ON_ERROR(hr)
        }

我移植的代码在 ctypes 中并且在此处 - https://github.com/Noitidart/ostypes_playground/blob/audio-capture/bootstrap.js#L71-L180

我想,Microsoft 示例中有一个隐藏的错误似乎发生在您的案例中。代码的内循环处理时间足以让新数据出现在传入的音频缓冲区中,从而使您永远在内循环中旋转,或者直到您可以以适当的速度处理传入的数据。 因此,我建议将 && !bDone 条件添加到内部循环。

while (bDone == FALSE)
{
    ...

    while (packetLength != 0 && bDone == FALSE)
    {
        ...
    }
}