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:
parent
da68fe2b60
commit
21df860385
2 changed files with 61 additions and 37 deletions
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue