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。
密码是-
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)
{
...
}
}
我移植了 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。
密码是-
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)
{
...
}
}