From 99b3d85fcc4df8f76501d215a32c4bb35f22adc9 Mon Sep 17 00:00:00 2001 From: ed Date: Sun, 6 Sep 2020 17:47:29 +0100 Subject: [PATCH] Windows: Always use requested sample rate when opening a WASAPI device with sample rate conversion enabled --- .../native/juce_win32_WASAPI.cpp | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/modules/juce_audio_devices/native/juce_win32_WASAPI.cpp b/modules/juce_audio_devices/native/juce_win32_WASAPI.cpp index acabe33b3b..9516f3780e 100644 --- a/modules/juce_audio_devices/native/juce_win32_WASAPI.cpp +++ b/modules/juce_audio_devices/native/juce_win32_WASAPI.cpp @@ -681,10 +681,10 @@ private: WAVEFORMATEX* nearestFormat = nullptr; if (SUCCEEDED (audioClient->IsFormatSupported (isExclusiveMode (deviceMode) ? AUDCLNT_SHAREMODE_EXCLUSIVE - : AUDCLNT_SHAREMODE_SHARED, + : AUDCLNT_SHAREMODE_SHARED, (WAVEFORMATEX*) &format, isExclusiveMode (deviceMode) ? nullptr - : (WAVEFORMATEX**) &nearestFormat))) + : &nearestFormat))) { if (nearestFormat != nullptr) rate = nearestFormat->nSamplesPerSec; @@ -728,20 +728,30 @@ private: format.SubFormat = sampleFormat.useFloat ? KSDATAFORMAT_SUBTYPE_IEEE_FLOAT : KSDATAFORMAT_SUBTYPE_PCM; format.dwChannelMask = newMixFormatChannelMask; - WAVEFORMATEXTENSIBLE* nearestFormat = nullptr; + WAVEFORMATEX* nearestFormat = nullptr; HRESULT hr = clientToUse->IsFormatSupported (isExclusiveMode (deviceMode) ? AUDCLNT_SHAREMODE_EXCLUSIVE : AUDCLNT_SHAREMODE_SHARED, (WAVEFORMATEX*) &format, isExclusiveMode (deviceMode) ? nullptr - : (WAVEFORMATEX**) &nearestFormat); + : &nearestFormat); logFailure (hr); + auto supportsSRC = supportsSampleRateConversion (deviceMode); + if (hr == S_FALSE && nearestFormat != nullptr - && format.Format.nSamplesPerSec == nearestFormat->Format.nSamplesPerSec) + && (format.Format.nSamplesPerSec == nearestFormat->nSamplesPerSec + || supportsSRC)) { - copyWavFormat (format, (const WAVEFORMATEX*) nearestFormat); + copyWavFormat (format, nearestFormat); + + if (supportsSRC) + { + format.Format.nSamplesPerSec = (DWORD) newSampleRate; + format.Format.nAvgBytesPerSec = (DWORD) (format.Format.nSamplesPerSec * format.Format.nBlockAlign); + } + hr = S_OK; }