Как работает WINAPI-дескриптор IAudioClient-> SetEventHandle ()?

Я пишу приложение, которое читает аудио конечную точку на окнах, через WASAPI. Пока у меня есть подобный код для потока захвата (обработайте этот код как минимальный пример):

DWORD CWASAPICapture::DoCaptureThread()
{
BYTE *pData;
UINT32 framesAvailable = 1;
DWORD  flags, state;

HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
if (FAILED(hr))
{
printf("Unable to initialize COM in render thread: %x\n", hr);
return hr;
}

while (framesAvailable != 0) {
// get the available data in the shared buffer.
state = WaitForSingleObject(_AudioSamplesReadyEvent, INFINITE);
hr = _CaptureClient->GetBuffer(&pData, &framesAvailable, &flags, NULL, NULL);
if ((state != 0) || (hr != S_OK)) {
// my breakpoint
assert(false);
}

UINT32 framesToCopy = min(framesAvailable, static_cast<UINT32>((_CaptureBufferSize - _CurrentCaptureIndex) / _FrameSize));

if (flags & AUDCLNT_BUFFERFLAGS_SILENT)
{
ZeroMemory(&_CaptureBuffer[_CurrentCaptureIndex], framesToCopy*_FrameSize);
} else {
CopyMemory(&_CaptureBuffer[_CurrentCaptureIndex], pData, framesToCopy*_FrameSize);
}

_CurrentCaptureIndex += framesToCopy*_FrameSize;

// release data
hr = _CaptureClient->ReleaseBuffer(framesAvailable);
assert(hr == S_OK);
}

CoUninitialize();
return 0;
}

В разделе Init я запросил буфер на 1 с, blockAlign равен 8, поэтому мой captureBufferSize = 3528000 байт. _AudioSamplesReadyEvent установлен как _AudioClient-> SetEventHandle (_AudioSamplesReadyEvent). Размер пакета = 441. Другой код основан на официальном Windows SDK CaptureSharedEventDriven пример, Этот метод Я изменился.

Проблема:

Программа всегда терпит неудачу на моей точке останова (по проекту), и я наблюдаю за переменными, ожидаемые значения: hr = AUDCLNT_S_BUFFER_EMPTY (0x08890001) и _CurrentCaptureIndex = 3528000, и я даже получил эти значения, как в 1 из 10 случаев … Обычно hr = AUDCLNT_S_BUFFER_EMPTY (0x08890001) и _CurrentCaptureIndex равны случайным значениям, чаще всего это 0, 3528 (8 пакетов) и 10584 (24 пакета).

Прежде всего, когда я только начал использовать WaitForSingleObject с _AudioClient-> SetEventHandle, я предположил, что это сигнализирует, когда буфер заполняется за запрошенное время в _AudioClient-> Initialize () (MSDN описание довольно бегло), но это неправильно, следующее мое предложение заключалось в том, что он ожидает, пока не будет заполнен один пакет с данными, но, как показывает мой пример, у меня нет доступных кадров в буфере. Я пытался использовать GetNextPacketSize nex для WaitSingleObject, но результат все тот же.

Мои вопросы:

  1. Почему мой пример работает именно так?
  2. Что именно IAudioClient-> SetEventHandle () сигнализирует о WaitForSingleObject ()?
  3. Как правильно читать буфер размера, который я запрашивал?

UPD1: Sleep() размещены раньше, а не WaitForSingleObject() работает отлично, я получаю все кадры за время, когда моя нить спала.

UPD2: минимальный пример

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector