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

MIDI: Add support for MIDI 2.0 I/O using Universal MIDI Packets

Includes support for communication with USB and Bluetooth devices, as well as virtual devices.
This commit is contained in:
reuk 2025-04-01 20:32:54 +01:00
parent 3636f2c666
commit ba7593df26
No known key found for this signature in database
65 changed files with 16609 additions and 5301 deletions

View file

@ -87,7 +87,8 @@ struct MidiDeviceListEntry final : ReferenceCountedObject
class MidiDemo final : public Component,
private MidiKeyboardState::Listener,
private MidiInputCallback,
private AsyncUpdater
private AsyncUpdater,
private ump::EndpointsListener
{
public:
//==============================================================================
@ -134,13 +135,16 @@ public:
setSize (732, 520);
updateDeviceLists();
updateVirtualPorts();
if (virtualIn != nullptr)
virtualIn->start();
ump::Endpoints::getInstance()->setVirtualMidiBytestreamServiceActive (true);
ump::Endpoints::getInstance()->addListener (*this);
}
~MidiDemo() override
{
ump::Endpoints::getInstance()->removeListener (*this);
midiInputs .clear();
midiOutputs.clear();
keyboardState.removeListener (this);
@ -478,6 +482,34 @@ private:
updateDeviceList (isInput);
}
void endpointsChanged() override
{
updateDeviceLists();
}
void virtualMidiServiceActiveChanged() override
{
if (ump::Endpoints::getInstance()->isVirtualMidiBytestreamServiceActive())
{
if (virtualIn == nullptr || virtualOut == nullptr)
updateVirtualPorts();
}
else
{
virtualIn = nullptr;
virtualOut = nullptr;
}
}
void updateVirtualPorts()
{
virtualIn = MidiInput::createNewDevice ("MidiDemo Virtual In", this);
virtualOut = MidiOutput::createNewDevice ("MidiDemo Virtual Out");
if (virtualIn != nullptr)
virtualIn->start();
}
//==============================================================================
Label midiInputLabel { "Midi Input Label", "MIDI Input:" };
Label midiOutputLabel { "Midi Output Label", "MIDI Output:" };
@ -494,13 +526,8 @@ private:
CriticalSection midiMonitorLock;
Array<MidiMessage> incomingMessages;
std::unique_ptr<MidiInput> virtualIn = MidiInput::createNewDevice ("MidiDemo Virtual In", this);
std::unique_ptr<MidiOutput> virtualOut = MidiOutput::createNewDevice ("MidiDemo Virtual Out");
MidiDeviceListConnection connection = MidiDeviceListConnection::make ([this]
{
updateDeviceLists();
});
std::unique_ptr<MidiInput> virtualIn;
std::unique_ptr<MidiOutput> virtualOut;
//==============================================================================
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MidiDemo)