mirror of
https://github.com/juce-framework/JUCE.git
synced 2026-01-10 23:44:24 +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:
parent
3636f2c666
commit
ba7593df26
65 changed files with 16609 additions and 5301 deletions
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue