1
0
Fork 0
mirror of https://github.com/juce-framework/JUCE.git synced 2026-01-09 23:34:20 +00:00

AudioDeviceSelector: Correctly display when there is no MIDI output device selected

This commit is contained in:
Anthony Nicholls 2023-11-10 12:11:38 +00:00
parent da68fe2b60
commit 21df860385
2 changed files with 61 additions and 37 deletions

View file

@ -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<ComboBox>();
midiOutputSelector = std::make_unique<MidiOutputSelector> (deviceManager);
addAndMakeVisible (midiOutputSelector.get());
midiOutputSelector->onChange = [this] { updateMidiOutput(); };
midiOutputLabel = std::make_unique<Label> ("lm", TRANS ("MIDI Output:"));
midiOutputLabel->attachToComponent (midiOutputSelector.get(), true);
@ -1120,16 +1176,6 @@ void AudioDeviceSelectorComponent::updateDeviceType()
}
}
void AudioDeviceSelectorComponent::updateMidiOutput()
{
auto selectedId = midiOutputSelector->getSelectedId();
if (selectedId == -1)
deviceManager.setDefaultMidiOutputDevice ({});
else
deviceManager.setDefaultMidiOutputDevice (currentMidiOutputs[selectedId - 1].identifier);
}
void AudioDeviceSelectorComponent::changeListenerCallback (ChangeBroadcaster*)
{
updateAllControls();
@ -1169,29 +1215,6 @@ void AudioDeviceSelectorComponent::updateAllControls()
midiInputsList->repaint();
}
if (midiOutputSelector != nullptr)
{
midiOutputSelector->clear();
currentMidiOutputs = MidiOutput::getAvailableDevices();
midiOutputSelector->addItem (getNoDeviceString(), -1);
midiOutputSelector->addSeparator();
auto defaultOutputIdentifier = deviceManager.getDefaultMidiOutputIdentifier();
int i = 0;
for (auto& out : currentMidiOutputs)
{
midiOutputSelector->addItem (out.name, i + 1);
if (defaultOutputIdentifier.isNotEmpty() && out.identifier == defaultOutputIdentifier)
midiOutputSelector->setSelectedId (i + 1);
++i;
}
}
resized();
}

View file

@ -96,7 +96,6 @@ private:
//==============================================================================
void handleBluetoothButton();
void updateDeviceType();
void updateMidiOutput();
void changeListenerCallback (ChangeBroadcaster*) override;
void updateAllControls();
@ -110,9 +109,11 @@ private:
const bool hideAdvancedOptionsWithButton;
class MidiInputSelectorComponentListBox;
class MidiOutputSelector;
Array<MidiDeviceInfo> currentMidiOutputs;
std::unique_ptr<MidiInputSelectorComponentListBox> midiInputsList;
std::unique_ptr<ComboBox> midiOutputSelector;
std::unique_ptr<MidiOutputSelector> midiOutputSelector;
std::unique_ptr<Label> midiInputsLabel, midiOutputLabel;
std::unique_ptr<TextButton> bluetoothButton;