|
|
@@ -28,6 +28,33 @@ using namespace juce; |
|
|
|
|
|
|
|
CARLA_BACKEND_START_NAMESPACE |
|
|
|
|
|
|
|
// ------------------------------------------------------------------------------------------------------------------- |
|
|
|
|
|
|
|
struct MidiInPort { |
|
|
|
MidiInput* port; |
|
|
|
char name[STR_MAX+1]; |
|
|
|
}; |
|
|
|
|
|
|
|
struct MidiOutPort { |
|
|
|
MidiOutput* port; |
|
|
|
char name[STR_MAX+1]; |
|
|
|
}; |
|
|
|
|
|
|
|
struct RtMidiEvent { |
|
|
|
uint64_t time; // needs to compare to internal time |
|
|
|
uint8_t size; |
|
|
|
uint8_t data[EngineMidiEvent::kDataSize]; |
|
|
|
}; |
|
|
|
|
|
|
|
// ------------------------------------------------------------------------------------------------------------------- |
|
|
|
// Fallback data |
|
|
|
|
|
|
|
static const MidiInPort kMidiInPortFallback = { nullptr, { '\0' } }; |
|
|
|
static /* */ MidiInPort kMidiInPortFallbackNC = { nullptr, { '\0' } }; |
|
|
|
static const MidiOutPort kMidiOutPortFallback = { nullptr, { '\0' } }; |
|
|
|
static /* */ MidiOutPort kMidiOutPortFallbackNC = { nullptr, { '\0' } }; |
|
|
|
static const RtMidiEvent kRtMidiEventFallback = { 0, 0, { 0 } }; |
|
|
|
|
|
|
|
// ------------------------------------------------------------------------------------------------------------------- |
|
|
|
// Global static data |
|
|
|
|
|
|
@@ -204,7 +231,7 @@ public: |
|
|
|
|
|
|
|
for (LinkedList<MidiInPort>::Itenerator it = fMidiIns.begin2(); it.valid(); it.next()) |
|
|
|
{ |
|
|
|
MidiInPort& inPort(it.getValue()); |
|
|
|
MidiInPort& inPort(it.getValue(kMidiInPortFallbackNC)); |
|
|
|
CARLA_SAFE_ASSERT_CONTINUE(inPort.port != nullptr); |
|
|
|
|
|
|
|
inPort.port->stop(); |
|
|
@@ -218,7 +245,7 @@ public: |
|
|
|
|
|
|
|
for (LinkedList<MidiOutPort>::Itenerator it = fMidiOuts.begin2(); it.valid(); it.next()) |
|
|
|
{ |
|
|
|
MidiOutPort& outPort(it.getValue()); |
|
|
|
MidiOutPort& outPort(it.getValue(kMidiOutPortFallbackNC)); |
|
|
|
CARLA_SAFE_ASSERT_CONTINUE(outPort.port != nullptr); |
|
|
|
|
|
|
|
outPort.port->stopBackgroundThread(); |
|
|
@@ -349,7 +376,8 @@ public: |
|
|
|
|
|
|
|
for (LinkedList<MidiInPort>::Itenerator it=fMidiIns.begin2(); it.valid(); it.next()) |
|
|
|
{ |
|
|
|
const MidiInPort& inPort(it.getValue()); |
|
|
|
const MidiInPort& inPort(it.getValue(kMidiInPortFallback)); |
|
|
|
CARLA_SAFE_ASSERT_CONTINUE(inPort.port != nullptr); |
|
|
|
|
|
|
|
const uint portId(extGraph.midiPorts.getPortId(true, inPort.name)); |
|
|
|
CARLA_SAFE_ASSERT_CONTINUE(portId < extGraph.midiPorts.ins.count()); |
|
|
@@ -368,7 +396,8 @@ public: |
|
|
|
|
|
|
|
for (LinkedList<MidiOutPort>::Itenerator it=fMidiOuts.begin2(); it.valid(); it.next()) |
|
|
|
{ |
|
|
|
const MidiOutPort& outPort(it.getValue()); |
|
|
|
const MidiOutPort& outPort(it.getValue(kMidiOutPortFallback)); |
|
|
|
CARLA_SAFE_ASSERT_CONTINUE(outPort.port != nullptr); |
|
|
|
|
|
|
|
const uint portId(extGraph.midiPorts.getPortId(false, outPort.name)); |
|
|
|
CARLA_SAFE_ASSERT_CONTINUE(portId < extGraph.midiPorts.outs.count()); |
|
|
@@ -439,8 +468,10 @@ protected: |
|
|
|
|
|
|
|
for (LinkedList<RtMidiEvent>::Itenerator it = fMidiInEvents.data.begin2(); it.valid(); it.next()) |
|
|
|
{ |
|
|
|
const RtMidiEvent& midiEvent(it.getValue()); |
|
|
|
EngineEvent& engineEvent(pData->events.in[engineEventIndex++]); |
|
|
|
const RtMidiEvent& midiEvent(it.getValue(kRtMidiEventFallback)); |
|
|
|
CARLA_SAFE_ASSERT_CONTINUE(midiEvent.size > 0); |
|
|
|
|
|
|
|
EngineEvent& engineEvent(pData->events.in[engineEventIndex++]); |
|
|
|
|
|
|
|
if (midiEvent.time < pData->timeInfo.frame) |
|
|
|
{ |
|
|
@@ -509,7 +540,7 @@ protected: |
|
|
|
|
|
|
|
for (LinkedList<MidiOutPort>::Itenerator it=fMidiOuts.begin2(); it.valid(); it.next()) |
|
|
|
{ |
|
|
|
MidiOutPort& outPort(it.getValue()); |
|
|
|
MidiOutPort& outPort(it.getValue(kMidiOutPortFallbackNC)); |
|
|
|
CARLA_SAFE_ASSERT_CONTINUE(outPort.port != nullptr); |
|
|
|
|
|
|
|
outPort.port->sendMessageNow(message); |
|
|
@@ -634,7 +665,7 @@ protected: |
|
|
|
case kExternalGraphConnectionMidiInput: |
|
|
|
for (LinkedList<MidiInPort>::Itenerator it=fMidiIns.begin2(); it.valid(); it.next()) |
|
|
|
{ |
|
|
|
MidiInPort& inPort(it.getValue()); |
|
|
|
MidiInPort& inPort(it.getValue(kMidiInPortFallbackNC)); |
|
|
|
CARLA_SAFE_ASSERT_CONTINUE(inPort.port != nullptr); |
|
|
|
|
|
|
|
if (std::strcmp(inPort.name, portName) != 0) |
|
|
@@ -653,7 +684,7 @@ protected: |
|
|
|
|
|
|
|
for (LinkedList<MidiOutPort>::Itenerator it=fMidiOuts.begin2(); it.valid(); it.next()) |
|
|
|
{ |
|
|
|
MidiOutPort& outPort(it.getValue()); |
|
|
|
MidiOutPort& outPort(it.getValue(kMidiOutPortFallbackNC)); |
|
|
|
CARLA_SAFE_ASSERT_CONTINUE(outPort.port != nullptr); |
|
|
|
|
|
|
|
if (std::strcmp(outPort.name, portName) != 0) |
|
|
@@ -677,22 +708,6 @@ private: |
|
|
|
ScopedPointer<AudioIODevice> fDevice; |
|
|
|
AudioIODeviceType* const fDeviceType; |
|
|
|
|
|
|
|
struct MidiInPort { |
|
|
|
MidiInput* port; |
|
|
|
char name[STR_MAX+1]; |
|
|
|
}; |
|
|
|
|
|
|
|
struct MidiOutPort { |
|
|
|
MidiOutput* port; |
|
|
|
char name[STR_MAX+1]; |
|
|
|
}; |
|
|
|
|
|
|
|
struct RtMidiEvent { |
|
|
|
uint64_t time; // needs to compare to internal time |
|
|
|
uint8_t size; |
|
|
|
uint8_t data[EngineMidiEvent::kDataSize]; |
|
|
|
}; |
|
|
|
|
|
|
|
struct RtMidiEvents { |
|
|
|
CarlaMutex mutex; |
|
|
|
RtLinkedList<RtMidiEvent>::Pool dataPool; |
|
|
|