From 972f7316d9cf2d5b807501e2519b7a3bef906695 Mon Sep 17 00:00:00 2001 From: falkTX Date: Sat, 7 Jun 2014 19:15:49 +0100 Subject: [PATCH] Some tests for rtmidi output, not working yet --- source/backend/engine/CarlaEngineJack.cpp | 26 ++++--- source/backend/engine/CarlaEngineJuce.cpp | 7 +- source/backend/engine/CarlaEngineRtAudio.cpp | 74 +++++++++++++++++--- 3 files changed, 80 insertions(+), 27 deletions(-) diff --git a/source/backend/engine/CarlaEngineJack.cpp b/source/backend/engine/CarlaEngineJack.cpp index 901f4998c..c65f86771 100644 --- a/source/backend/engine/CarlaEngineJack.cpp +++ b/source/backend/engine/CarlaEngineJack.cpp @@ -1521,27 +1521,24 @@ protected: { jackbridge_midi_clear_buffer(eventOut); + uint8_t size = 0; + uint8_t data[3] = { 0, 0, 0 }; + const uint8_t* dataPtr = data; + for (ushort i=0; i < kMaxEngineEventInternalCount; ++i) { const EngineEvent& engineEvent(pData->events.out[i]); - uint8_t size = 0; - uint8_t data[3] = { 0, 0, 0 }; - const uint8_t* dataPtr = data; - - switch (engineEvent.type) - { - case kEngineEventTypeNull: + if (engineEvent.type == kEngineEventTypeNull) break; - case kEngineEventTypeControl: + else if (engineEvent.type == kEngineEventTypeControl) { const EngineControlEvent& ctrlEvent(engineEvent.ctrl); ctrlEvent.convertToMidiData(engineEvent.channel, size, data); - break; + dataPtr = data; } - - case kEngineEventTypeMidi: + else if (engineEvent.type == kEngineEventTypeMidi) { const EngineMidiEvent& midiEvent(engineEvent.midi); @@ -1550,10 +1547,11 @@ protected: if (size > EngineMidiEvent::kDataSize && midiEvent.dataExt != nullptr) dataPtr = midiEvent.dataExt; else - dataPtr = midiEvent.dataExt; - - break; + dataPtr = midiEvent.data; } + else + { + continue; } if (size > 0) diff --git a/source/backend/engine/CarlaEngineJuce.cpp b/source/backend/engine/CarlaEngineJuce.cpp index 5f45023f9..1dc883b07 100644 --- a/source/backend/engine/CarlaEngineJuce.cpp +++ b/source/backend/engine/CarlaEngineJuce.cpp @@ -497,7 +497,8 @@ protected: FloatVectorOperations::clear(outputChannelData[i], numSamples); // initialize input events - carla_zeroStruct(pData->events.in, kMaxEngineEventInternalCount); + carla_zeroStruct(pData->events.in, kMaxEngineEventInternalCount); + carla_zeroStruct(pData->events.out, kMaxEngineEventInternalCount); if (fMidiInEvents.mutex.tryLock()) { @@ -589,7 +590,7 @@ protected: for (; i < EngineMidiEvent::kDataSize; ++i) midiEvent.data[i] = 0; - fMidiInEvents.appendNonRT(midiEvent); + fMidiInEvents.append(midiEvent); } // ------------------------------------------------------------------- @@ -740,7 +741,7 @@ private: clear(); } - void appendNonRT(const RtMidiEvent& event) + void append(const RtMidiEvent& event) { mutex.lock(); dataPending.append(event); diff --git a/source/backend/engine/CarlaEngineRtAudio.cpp b/source/backend/engine/CarlaEngineRtAudio.cpp index 5402caa92..c8244d3bf 100644 --- a/source/backend/engine/CarlaEngineRtAudio.cpp +++ b/source/backend/engine/CarlaEngineRtAudio.cpp @@ -637,8 +637,9 @@ protected: FLOAT_CLEAR(outsPtr, nframes*fAudioOutCount); - // initialize input events - carla_zeroStruct(pData->events.in, kMaxEngineEventInternalCount); + // initialize events + carla_zeroStruct(pData->events.in, kMaxEngineEventInternalCount); + carla_zeroStruct(pData->events.out, kMaxEngineEventInternalCount); if (fMidiInEvents.mutex.tryLock()) { @@ -680,10 +681,59 @@ protected: { } - // output events + //if (fMidiOuts.count() > 0) { - // TODO - //fMidiOutEvents... + // FIXME - use lock + + uint8_t size = 0; + uint8_t data[3] = { 0, 0, 0 }; + const uint8_t* dataPtr = data; + std::vector vector; + + for (ushort i=0; i < kMaxEngineEventInternalCount; ++i) + { + const EngineEvent& engineEvent(pData->events.out[i]); + + if (engineEvent.type == kEngineEventTypeNull) + break; + + if (engineEvent.type == kEngineEventTypeControl) + { + const EngineControlEvent& ctrlEvent(engineEvent.ctrl); + ctrlEvent.convertToMidiData(engineEvent.channel, size, data); + dataPtr = data; + } + else if (engineEvent.type == kEngineEventTypeMidi) + { + const EngineMidiEvent& midiEvent(engineEvent.midi); + + size = midiEvent.size; + + if (size > EngineMidiEvent::kDataSize && midiEvent.dataExt != nullptr) + dataPtr = midiEvent.dataExt; + else + dataPtr = midiEvent.data; + } + else + { + continue; + } + + if (size > 0) + { + vector.reserve(size); + std::memcpy(vector.data(), dataPtr, size); + + for (LinkedList::Itenerator it=fMidiOuts.begin(); it.valid(); it.next()) + { + MidiOutPort& outPort(it.getValue()); + CARLA_SAFE_ASSERT_CONTINUE(outPort.port != nullptr); + + outPort.port->sendMessage(&vector); + } + vector.clear(); + } + } } runPendingRtEvents(); @@ -727,7 +777,7 @@ protected: for (; i < EngineMidiEvent::kDataSize; ++i) midiEvent.data[i] = 0; - fMidiInEvents.appendNonRT(midiEvent); + fMidiInEvents.append(midiEvent); } // ------------------------------------------------------------------- @@ -820,7 +870,13 @@ protected: return false; } - rtMidiOut->openPort(rtMidiPortIndex, portName); + try { + rtMidiOut->openPort(rtMidiPortIndex, portName); + } + catch(...) { + delete rtMidiOut; + return false; + }; MidiOutPort midiPort; midiPort.port = rtMidiOut; @@ -923,7 +979,6 @@ private: RtLinkedList data; RtLinkedList dataPending; - // FIXME - 32, 512 + append_sleepy? check plugin code RtMidiEvents() : dataPool(512, 512), data(dataPool), @@ -934,7 +989,7 @@ private: clear(); } - void appendNonRT(const RtMidiEvent& event) + void append(const RtMidiEvent& event) { mutex.lock(); dataPending.append(event); @@ -956,7 +1011,6 @@ private: }; RtMidiEvents fMidiInEvents; - //RtMidiEvents fMidiOutEvents; #define handlePtr ((CarlaEngineRtAudio*)userData)