| @@ -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; i<size; ++i) | |||
| data[i] = fShmRtControl.readByte(); | |||
| if (EngineEvent* const event = getNextFreeInputEvent()) | |||
| { | |||
| event->time = 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; | |||
| } | |||
| @@ -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; | |||
| @@ -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<uint8_t>(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(); | |||
| @@ -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 | |||
| }; | |||
| @@ -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<uint8_t>(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<uint16_t>(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<uint32_t>(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<uint64_t>(ul) : 0; | |||
| uint64_t ul = 0; | |||
| return tryRead(&ul, sizeof(int64_t)) ? ul : 0; | |||
| } | |||
| float readFloat() noexcept | |||