From 0b3e1925678e0d16062abbdbf9fec4438991e03a Mon Sep 17 00:00:00 2001 From: tpoole Date: Tue, 14 Feb 2017 15:48:20 +0000 Subject: [PATCH] Restricted sample rate changes for composite audio devices to common sample rates only --- .../native/juce_mac_CoreAudio.cpp | 24 +++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp b/modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp index 34be9f0b8e..0d00e75b06 100644 --- a/modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp +++ b/modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp @@ -1560,16 +1560,32 @@ private: { const ScopedLock sl (callbackLock); - currentSampleRate = device->getCurrentSampleRate(); - bool sampleRateChanges = false; + auto newSampleRate = device->getCurrentSampleRate(); + auto commonRates = getAvailableSampleRates(); + if (! commonRates.contains (newSampleRate)) + { + commonRates.sort(); + if (newSampleRate < commonRates.getFirst() || newSampleRate > commonRates.getLast()) + newSampleRate = jlimit (commonRates.getFirst(), commonRates.getLast(), newSampleRate); + else + for (auto it = commonRates.begin(); it < commonRates.end() - 1; ++it) + if (it[0] < newSampleRate && it[1] > newSampleRate) + { + newSampleRate = newSampleRate - it[0] < it[1] - newSampleRate ? it[0] : it[1]; + break; + } + } + currentSampleRate = newSampleRate; + + bool anySampleRateChanges = false; for (int i = 0; i < devices.size(); ++i) if (devices.getUnchecked(i)->getCurrentSampleRate() != currentSampleRate) { devices.getUnchecked(i)->setCurrentSampleRate (currentSampleRate); - sampleRateChanges = true; + anySampleRateChanges = true; } - if (sampleRateChanges) + if (anySampleRateChanges) owner.audioDeviceListChanged(); if (callback != nullptr)