diff --git a/source/backend/engine/CarlaEngineBridge.cpp b/source/backend/engine/CarlaEngineBridge.cpp index 4d706d6a1..9636978dc 100644 --- a/source/backend/engine/CarlaEngineBridge.cpp +++ b/source/backend/engine/CarlaEngineBridge.cpp @@ -652,7 +652,7 @@ protected: const PluginBridgeRtOpcode opcode(fShmRtControl.readOpcode()); CarlaPlugin* const plugin(pData->plugins[0].plugin); - if (opcode != kPluginBridgeRtProcess) { + if (opcode != kPluginBridgeRtProcess && opcode != kPluginBridgeRtMidiEvent) { carla_stdout("CarlaEngineBridgeRtThread::run() - got opcode: %s", PluginBridgeRtOpcode2str(opcode)); } @@ -752,18 +752,41 @@ protected: case kPluginBridgeRtMidiEvent: { const uint32_t time(fShmRtControl.readUInt()); + const uint8_t port(fShmRtControl.readByte()); const uint8_t size(fShmRtControl.readByte()); CARLA_SAFE_ASSERT_BREAK(size > 0); uint8_t data[size]; - for (uint32_t i=0; i < size; ++i) + for (uint8_t i=0; itime = time; - event->fillFromMidiData(size, data); + event->type = kEngineEventTypeMidi; + event->time = time; + event->channel = MIDI_GET_CHANNEL_FROM_DATA(data); + + event->midi.port = port; + event->midi.size = size; + + if (size > EngineMidiEvent::kDataSize) + { + event->midi.dataExt = data; + std::memset(event->midi.data, 0, sizeof(uint8_t)*EngineMidiEvent::kDataSize); + } + else + { + event->midi.data[0] = MIDI_GET_STATUS_FROM_DATA(data); + + uint8_t i=1; + for (; i < size; ++i) + event->midi.data[i] = data[i]; + for (; i < EngineMidiEvent::kDataSize; ++i) + event->midi.data[i] = 0; + + event->midi.dataExt = nullptr; + } } break; } diff --git a/source/backend/engine/CarlaEngineData.cpp b/source/backend/engine/CarlaEngineData.cpp index 5e6a24338..4a0683f6c 100644 --- a/source/backend/engine/CarlaEngineData.cpp +++ b/source/backend/engine/CarlaEngineData.cpp @@ -169,7 +169,7 @@ void EngineEvent::fillFromMidiData(const uint8_t size, const uint8_t* const data midi.data[0] = midiStatus; uint8_t i=1; - for (; i < midi.size; ++i) + for (; i < size; ++i) midi.data[i] = data[i]; for (; i < EngineMidiEvent::kDataSize; ++i) midi.data[i] = 0; diff --git a/source/backend/plugin/BridgePlugin.cpp b/source/backend/plugin/BridgePlugin.cpp index f5133fb3a..7eacc11bc 100644 --- a/source/backend/plugin/BridgePlugin.cpp +++ b/source/backend/plugin/BridgePlugin.cpp @@ -936,6 +936,7 @@ public: fShmRtControl.writeOpcode(kPluginBridgeRtMidiEvent); fShmRtControl.writeUInt(0); // time + fShmRtControl.writeByte(0); // port fShmRtControl.writeByte(3); // size fShmRtControl.writeByte(data1); fShmRtControl.writeByte(data2); @@ -1104,11 +1105,10 @@ public: fShmRtControl.writeOpcode(kPluginBridgeRtMidiEvent); fShmRtControl.writeUInt(event.time); + fShmRtControl.writeByte(midiEvent.port); fShmRtControl.writeByte(midiEvent.size); - fShmRtControl.writeByte(static_cast(status + channel)); - - for (uint8_t j=1; j < midiEvent.size; ++j) + for (uint8_t j=0; j < midiEvent.size; ++j) fShmRtControl.writeByte(midiEvent.data[j]); fShmRtControl.commitWrite(); diff --git a/source/utils/CarlaBridgeUtils.hpp b/source/utils/CarlaBridgeUtils.hpp index 08b949c5c..53b5bba36 100644 --- a/source/utils/CarlaBridgeUtils.hpp +++ b/source/utils/CarlaBridgeUtils.hpp @@ -60,7 +60,7 @@ enum PluginBridgeRtOpcode { kPluginBridgeRtControlEventMidiProgram, // uint/frame, byte/chan, ushort kPluginBridgeRtControlEventAllSoundOff, // uint/frame, byte/chan kPluginBridgeRtControlEventAllNotesOff, // uint/frame, byte/chan - kPluginBridgeRtMidiEvent, // uint/frame, byte/size, byte[]/data + kPluginBridgeRtMidiEvent, // uint/frame, byte/port, byte/size, byte[]/data kPluginBridgeRtProcess }; diff --git a/source/utils/CarlaRingBuffer.hpp b/source/utils/CarlaRingBuffer.hpp index 5cbf8c6c5..761103129 100644 --- a/source/utils/CarlaRingBuffer.hpp +++ b/source/utils/CarlaRingBuffer.hpp @@ -147,8 +147,8 @@ public: uint8_t readByte() noexcept { - int8_t ub = -1; - return (tryRead(&ub, sizeof(int8_t)) && ub >= 0 && ub <= INT_LEAST8_MAX) ? static_cast(ub) : 0; + uint8_t B = 0; + return tryRead(&B, sizeof(uint8_t)) ? B : 0; } int16_t readShort() noexcept @@ -159,8 +159,8 @@ public: uint16_t readUShort() noexcept { - int16_t us = -1; - return (tryRead(&us, sizeof(int16_t)) && us >= 0 && us <= INT_LEAST16_MAX) ? static_cast(us) : 0; + uint16_t us = 0; + return tryRead(&us, sizeof(uint16_t)) ? us : 0; } int32_t readInt() noexcept @@ -171,8 +171,8 @@ public: uint32_t readUInt() noexcept { - int32_t ui = -1; - return (tryRead(&ui, sizeof(int32_t)) && ui >= 0 && ui <= INT_LEAST32_MAX) ? static_cast(ui) : 0; + uint32_t ui = 0; + return tryRead(&ui, sizeof(int32_t)) ? ui : 0; } int64_t readLong() noexcept @@ -183,8 +183,8 @@ public: uint64_t readULong() noexcept { - int64_t ul = -1; - return (tryRead(&ul, sizeof(int64_t)) && ul >= 0 && ul <= INT_LEAST64_MAX) ? static_cast(ul) : 0; + uint64_t ul = 0; + return tryRead(&ul, sizeof(int64_t)) ? ul : 0; } float readFloat() noexcept