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;
}