From 8bb56fcad84129fb4f26d8adf8642fe64fdc68ce Mon Sep 17 00:00:00 2001 From: hogliux Date: Tue, 13 Mar 2018 11:09:01 +0000 Subject: [PATCH] Try to re-use the current selected audio device if sharing an AudioDeviceManager with an AudioAppComponent --- .../gui/juce_AudioAppComponent.cpp | 36 ++++++++++++++++--- .../gui/juce_AudioAppComponent.h | 1 + 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/modules/juce_audio_utils/gui/juce_AudioAppComponent.cpp b/modules/juce_audio_utils/gui/juce_AudioAppComponent.cpp index 6acd0bc729..31ccc2ae80 100644 --- a/modules/juce_audio_utils/gui/juce_AudioAppComponent.cpp +++ b/modules/juce_audio_utils/gui/juce_AudioAppComponent.cpp @@ -28,12 +28,14 @@ namespace juce { AudioAppComponent::AudioAppComponent() - : deviceManager (defaultDeviceManager) + : deviceManager (defaultDeviceManager), + usingCustomDeviceManager (false) { } AudioAppComponent::AudioAppComponent (AudioDeviceManager& adm) - : deviceManager (adm) + : deviceManager (adm), + usingCustomDeviceManager (true) { } @@ -46,7 +48,30 @@ AudioAppComponent::~AudioAppComponent() void AudioAppComponent::setAudioChannels (int numInputChannels, int numOutputChannels, const XmlElement* const xml) { - String audioError = deviceManager.initialise (numInputChannels, numOutputChannels, xml, true); + String audioError; + + if (usingCustomDeviceManager && xml == nullptr) + { + AudioDeviceManager::AudioDeviceSetup setup; + deviceManager.getAudioDeviceSetup (setup); + + if (setup.inputChannels.countNumberOfSetBits() != numInputChannels + || setup.outputChannels.countNumberOfSetBits() != numOutputChannels) + { + setup.inputChannels.clear(); + setup.outputChannels.clear(); + + setup.inputChannels.setRange (0, numInputChannels, true); + setup.outputChannels.setRange (0, numOutputChannels, true); + + audioError = deviceManager.setAudioDeviceSetup (setup, false); + } + } + else + { + audioError = deviceManager.initialise (numInputChannels, numOutputChannels, xml, true); + } + jassert (audioError.isEmpty()); deviceManager.addAudioCallback (&audioSourcePlayer); @@ -57,7 +82,10 @@ void AudioAppComponent::shutdownAudio() { audioSourcePlayer.setSource (nullptr); deviceManager.removeAudioCallback (&audioSourcePlayer); - deviceManager.closeAudioDevice(); + + // other audio callbacks may still be using the device + if (! usingCustomDeviceManager) + deviceManager.closeAudioDevice(); } } // namespace juce diff --git a/modules/juce_audio_utils/gui/juce_AudioAppComponent.h b/modules/juce_audio_utils/gui/juce_AudioAppComponent.h index 905428451a..238439e8a0 100644 --- a/modules/juce_audio_utils/gui/juce_AudioAppComponent.h +++ b/modules/juce_audio_utils/gui/juce_AudioAppComponent.h @@ -126,6 +126,7 @@ private: //============================================================================= AudioDeviceManager defaultDeviceManager; AudioSourcePlayer audioSourcePlayer; + bool usingCustomDeviceManager; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioAppComponent) };