1

I have a visual C++ app that captures audio from the default communications playback device using WASAPI Loopback capture. the captured audio is not affected by the device's volume setting (which is what I want), but, it is affected by Equalizer APO, which I installed on the device for room correction. Obviously, I don't want its effects to apply to the audio I capture. I tried looking for lower-level methods to capture sound, such as DirectSound and kernel streaming, but these are long deprecated. how can I capture sound from a playback device at a low level before it is affected by audio enhancements and APOs, or just capture audio from a playback device with audio enhancements and APOs enabled and not have those enhancements appear in the captured audio?

My initialization code:

res = CoInitialize(NULL);
    if (FAILED(res))
    {
        cerr << "CoInitialize " << res;
        return 1;
    }

    // Get the default audio capture device
    IMMDeviceEnumerator* pEnumerator = NULL;
    res = CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_ALL, IID_PPV_ARGS(&pEnumerator));
    if (FAILED(res))
    {
        cerr << "CoCreateInstance " << res;
        return 1;
    }

    IMMDevice* pDevice = NULL;
    res = pEnumerator->GetDefaultAudioEndpoint(eRender, eCommunications, &pDevice);
    if (FAILED(res))
    {
        cerr << "GetDefaultAudioEndpoint " << res;
        return 1;
    }
    pEnumerator->Release();

    // Activate the audio client
    IAudioClient* pAudioClient = NULL;
    res = pDevice->Activate(__uuidof(IAudioClient), CLSCTX_ALL, NULL, (void**)&pAudioClient);
    if (FAILED(res))
    {
        cerr << "Activate " << res;
        return 1;
    }
    pDevice->Release();

    // Initialize the audio capture client
    WAVEFORMATEX format = {};
    format.wFormatTag = WAVE_FORMAT_PCM;
    format.nChannels = 2;
    format.nSamplesPerSec = 48000;
    format.nAvgBytesPerSec = 192000;
    format.nBlockAlign = 4;
    format.wBitsPerSample = 16;
    res = pAudioClient->Initialize(AUDCLNT_SHAREMODE_SHARED, AUDCLNT_STREAMFLAGS_LOOPBACK | AUDCLNT_STREAMFLAGS_EVENTCALLBACK | AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM | AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY, 0, 0, &format, NULL);
    if (FAILED(res))
    {
        cerr << "Initialize " << res;
        return 1;
    }

    // Register for notification of capture events
    HANDLE captureEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
    res = pAudioClient->SetEventHandle(captureEvent);
    if (FAILED(res))
    {
        cerr << "SetEventHandle " << res;
        return 1;
    }

    // Get capture service
    IAudioCaptureClient* pCaptureClient = NULL;
    res = pAudioClient->GetService(IID_PPV_ARGS(&pCaptureClient));
    if (FAILED(res))
    {
        cerr << "GetService " << res;
        return 1;
    }

    // Start audio capture
    res = pAudioClient->Start();
    if (FAILED(res))
    {
        cerr << "Start " << res;
        return 1;
    }
Tiger Yang
  • 61
  • 4

0 Answers0