From 859315fe4f38c398f7d970639d70df8347a3c2a2 Mon Sep 17 00:00:00 2001 From: ed Date: Wed, 18 Dec 2019 09:25:38 +0000 Subject: [PATCH] Added a removeAudioDeviceType() method to AudioDeviceManager and made the ownership semantics of addAudioDeviceType() clearer --- .../audio_io/juce_AudioDeviceManager.cpp | 25 ++++++++++++++++--- .../audio_io/juce_AudioDeviceManager.h | 9 ++++--- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.cpp b/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.cpp index 49bca57364..7c8625c567 100644 --- a/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.cpp +++ b/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.cpp @@ -105,7 +105,7 @@ void AudioDeviceManager::createDeviceTypesIfNeeded() createAudioDeviceTypes (types); for (auto* t : types) - addAudioDeviceType (t); + addAudioDeviceType (std::unique_ptr (t)); types.clear (false); @@ -180,15 +180,32 @@ void AudioDeviceManager::createAudioDeviceTypes (OwnedArray& addIfNotNull (list, AudioIODeviceType::createAudioIODeviceType_Android()); } -void AudioDeviceManager::addAudioDeviceType (AudioIODeviceType* newDeviceType) +void AudioDeviceManager::addAudioDeviceType (std::unique_ptr newDeviceType) { if (newDeviceType != nullptr) { jassert (lastDeviceTypeConfigs.size() == availableDeviceTypes.size()); - availableDeviceTypes.add (newDeviceType); + + availableDeviceTypes.add (newDeviceType.release()); lastDeviceTypeConfigs.add (new AudioDeviceSetup()); - newDeviceType->addListener (callbackHandler.get()); + availableDeviceTypes.getLast()->addListener (callbackHandler.get()); + } +} + +void AudioDeviceManager::removeAudioDeviceType (AudioIODeviceType* deviceTypeToRemove) +{ + if (deviceTypeToRemove != nullptr) + { + jassert (lastDeviceTypeConfigs.size() == availableDeviceTypes.size()); + + auto index = availableDeviceTypes.indexOf (deviceTypeToRemove); + + if (auto removed = std::unique_ptr (availableDeviceTypes.removeAndReturn (index))) + { + removed->removeListener (callbackHandler.get()); + lastDeviceTypeConfigs.remove (index, true); + } } } diff --git a/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.h b/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.h index 83b49c1e51..b855d51e46 100644 --- a/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.h +++ b/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.h @@ -391,10 +391,11 @@ public: */ virtual void createAudioDeviceTypes (OwnedArray& types); - /** Adds a new device type to the list of types. - The manager will take ownership of the object that is passed-in. - */ - void addAudioDeviceType (AudioIODeviceType* newDeviceType); + /** Adds a new device type to the list of types. */ + void addAudioDeviceType (std::unique_ptr newDeviceType); + + /** Removes a previously added device type from the manager. */ + void removeAudioDeviceType (AudioIODeviceType* deviceTypeToRemove); //============================================================================== /** Plays a beep through the current audio device.