无限循环读取1秒环回记录中的数据包数据

时间:2016-06-09 05:21:36

标签: audio wasapi

我移植了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,我不是确定为什么它永远不会变成0,因为while循环是期待的。

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

1 个答案:

答案 0 :(得分:1)

我想,微软示例中存在隐藏的错误,似乎在您的情况下发生。代码的内循环处理时间足以使新数据出现在传入的音频缓冲区中,从而使您永远旋转内循环或直到您可以以合适的速度处理传入数据。 因此,我建议在内循环中添加&& !bDone条件。

while (bDone == FALSE)
{
    ...

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