Захваченные данные WASAPI только 00 и FF

Если я открываю захваченные данные PCM, то они представляют собой только комбинации байтов 00 и FF. Кажется, что они фиксируют только статический шум на моем ноутбуке и ПК. На моем компьютере записывающее устройство (Stereo Mix - Realtek High Definiton Audio) и на моем ноутбуке Я использую записывающее устройство Stereo Mix (Realtek Audio) . Я могу изменить WAVEFORMATEX и изменить формат драйвера, но я по-прежнему получаю только разные виды громких статических шумов или вообще никакого звука... Если я использую Audacity для захвата, это работает так что проблема должна быть в моем коде.

    HRESULT InitAudio() {
HRESULT hr = E_FAIL;
REFERENCE_TIME hnsRequestedDuration;
REFERENCE_TIME hnsActualDuration;
UINT32 bufferFrameCount;
IMMDeviceEnumerator *pEnumerator = NULL;
IMMDeviceCollection* pIMMDeviceCollection = NULL;
IMMDevice *pDevice = NULL;
_AudioSamplesReadyEvent = CreateEventEx(NULL, NULL, 0, EVENT_MODIFY_STATE | SYNCHRONIZE);
_ShutdownEvent = CreateEventEx(NULL, NULL, 0, EVENT_MODIFY_STATE | SYNCHRONIZE);

    WAVEFORMATEX                wfx =
  {WAVE_FORMAT_PCM, wavFile.num_channels, wavFile.sample_rate, wavFile.byte_rate, wavFile.sample_alignment, wavFile.bit_depth, 0};

hr = CoCreateInstance(
       CLSID_MMDeviceEnumerator, NULL,
       CLSCTX_ALL, IID_IMMDeviceEnumerator,
       (void**)&pEnumerator);

hr = pEnumerator->EnumAudioEndpoints(eCapture,DEVICE_STATE_ACTIVE,&pIMMDeviceCollection);
hr = pIMMDeviceCollection->Item(0, &pDevice);

hr = pDevice->Activate(
                IID_IAudioClient, CLSCTX_ALL,
                NULL, (void**)&pAudioClient);

hr = pAudioClient->GetDevicePeriod(NULL, &hnsRequestedDuration);
hr = pAudioClient->Initialize(
                     AUDCLNT_SHAREMODE_SHARED,
                     AUDCLNT_STREAMFLAGS_EVENTCALLBACK | AUDCLNT_STREAMFLAGS_NOPERSIST,
                     hnsRequestedDuration,
                     0,
                     &wfx,
                     NULL);


hr = pAudioClient->SetEventHandle(_AudioSamplesReadyEvent);
if (FAILED(hr)) MessageBox(NULL,TEXT("Unable to set event handle!"), TEXT("Error"), MB_OK);

hr = pAudioClient->GetService(
                     IID_IAudioCaptureClient,
                     (void**)&pCaptureClient);

ProcessSoundThread = CreateThread(NULL, 0, ProcessSound, 0, 0, NULL);

hr = pAudioClient->Start();  // Start recording.

return hr;
}

и функция, которая используется для обработки данных

    DWORD WINAPI ProcessSound(void* arg) {
UINT32 numFramesAvailable;
UINT32 packetLength = 0;
UINT32 dataSize = 0;
BYTE *pData;
DWORD  flags;
HRESULT hr;
UINT dwDataWrote;

HANDLE waitArray[2] = { _AudioSamplesReadyEvent, _ShutdownEvent};
HANDLE mmcssHandle = NULL;
DWORD mmcssTaskIndex = 0;

hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
if (FAILED(hr)) MessageBox(NULL,TEXT("Unable to initialize COM in render thread!"), TEXT("Error"), MB_OK);

mmcssHandle = AvSetMmThreadCharacteristics("Audio", &mmcssTaskIndex);
if(mmcssHandle == NULL) MessageBox(NULL,TEXT("Unable to enable MMCSS on capture thread!"), TEXT("Error"), MB_OK);

while(captureSound) {
    DWORD waitResult = WaitForMultipleObjects(2, waitArray, FALSE, INFINITE);
    switch (waitResult)
        {
        case WAIT_OBJECT_0 + 0:
            hr = pCaptureClient->GetBuffer(&pData,&numFramesAvailable,&flags,NULL,NULL);
            if(hr != AUDCLNT_S_BUFFER_EMPTY) {
                dataSize = numFramesAvailable * wavFile.sample_alignment; // wavFile.sample_alignment = frameSize = num_channels * (pWav->bit_depth)/8
                if (FAILED( addWavData(&wavFile, pData, dataSize, &dwDataWrote)))
                    MessageBox(NULL,TEXT("Error writting the data!"), TEXT("Error"), MB_OK); 
                totalData += dataSize;
            }
            pCaptureClient->ReleaseBuffer(numFramesAvailable);
            break;
        case WAIT_OBJECT_0 + 1:   
            captureSound = false;
            break;
        }`
}
return 0;
}

0 ответов

Другие вопросы по тегам