From 21df8603852fb9c5001c6da85c08e074133e6b3b Mon Sep 17 00:00:00 2001 From: Anthony Nicholls Date: Fri, 10 Nov 2023 12:11:38 +0000 Subject: [PATCH] AudioDeviceSelector: Correctly display when there is no MIDI output device selected --- .../gui/juce_AudioDeviceSelectorComponent.cpp | 93 ++++++++++++------- .../gui/juce_AudioDeviceSelectorComponent.h | 5 +- 2 files changed, 61 insertions(+), 37 deletions(-) diff --git a/modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.cpp b/modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.cpp index 2d505b606d..6d964bb0ef 100644 --- a/modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.cpp +++ b/modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.cpp @@ -207,6 +207,63 @@ struct AudioDeviceSetupDetails static String getNoDeviceString() { return "<< " + TRANS ("none") + " >>"; } +//============================================================================== +class AudioDeviceSelectorComponent::MidiOutputSelector final : public Component, + private ChangeListener +{ +public: + explicit MidiOutputSelector (AudioDeviceManager& dm) + : deviceManager (dm) + { + deviceManager.addChangeListener (this); + selector.onChange = [&] + { + const auto selectedId = selector.getSelectedId(); + jassert (selectedId != 0); + + const auto deviceId = selectedId == -1 + ? String{} + : MidiOutput::getAvailableDevices()[selectedId - 1].identifier; + deviceManager.setDefaultMidiOutputDevice (deviceId); + }; + + updateListOfDevices(); + addAndMakeVisible (selector); + } + + ~MidiOutputSelector() final + { + deviceManager.removeChangeListener (this); + } + + void resized() final { selector.setBounds (getLocalBounds()); } + +private: + void updateListOfDevices() + { + selector.clear(); + + const auto midiOutputs = MidiOutput::getAvailableDevices(); + + selector.addItem (getNoDeviceString(), -1); + selector.setSelectedId (-1, dontSendNotification); + selector.addSeparator(); + + for (auto [id, midiOutput] : enumerate (midiOutputs, 1)) + { + selector.addItem (midiOutput.name, id); + + if (midiOutput.identifier == deviceManager.getDefaultMidiOutputIdentifier()) + selector.setSelectedId (id, dontSendNotification); + } + } + + void changeListenerCallback (ChangeBroadcaster*) final { updateListOfDevices(); } + + ComboBox selector; + AudioDeviceManager& deviceManager; +}; + //============================================================================== class AudioDeviceSettingsPanel : public Component, private ChangeListener @@ -1036,9 +1093,8 @@ AudioDeviceSelectorComponent::AudioDeviceSelectorComponent (AudioDeviceManager& if (showMidiOutputSelector) { - midiOutputSelector = std::make_unique(); + midiOutputSelector = std::make_unique (deviceManager); addAndMakeVisible (midiOutputSelector.get()); - midiOutputSelector->onChange = [this] { updateMidiOutput(); }; midiOutputLabel = std::make_unique