diff --git a/source/backend/engine/CarlaEngineBridge.cpp b/source/backend/engine/CarlaEngineBridge.cpp index 0f2f1cf06..d133a8a54 100644 --- a/source/backend/engine/CarlaEngineBridge.cpp +++ b/source/backend/engine/CarlaEngineBridge.cpp @@ -682,6 +682,50 @@ protected: break; } + case kPluginBridgeRtAllSoundOff: { + const uint32_t time(fShmRtControl.readUInt()); + + CARLA_SAFE_ASSERT_BREAK(pData->events.in != nullptr); + + for (ushort i=0; i < kMaxEngineEventInternalCount; ++i) + { + EngineEvent& event(pData->events.in[i]); + + if (event.type != kEngineEventTypeNull) + continue; + + event.type = kEngineEventTypeControl; + event.time = time; + event.channel = 0; + event.ctrl.type = kEngineControlEventTypeAllSoundOff; + event.ctrl.param = 0; + event.ctrl.value = 0.0f; + break; + } + } + + case kPluginBridgeRtAllNotesOff: { + const uint32_t time(fShmRtControl.readUInt()); + + CARLA_SAFE_ASSERT_BREAK(pData->events.in != nullptr); + + for (ushort i=0; i < kMaxEngineEventInternalCount; ++i) + { + EngineEvent& event(pData->events.in[i]); + + if (event.type != kEngineEventTypeNull) + continue; + + event.type = kEngineEventTypeControl; + event.time = time; + event.channel = 0; + event.ctrl.type = kEngineControlEventTypeAllNotesOff; + event.ctrl.param = 0; + event.ctrl.value = 0.0f; + break; + } + } + case kPluginBridgeRtProcess: { CARLA_SAFE_ASSERT_BREAK(fShmAudioPool.data != nullptr); diff --git a/source/backend/plugin/BridgePlugin.cpp b/source/backend/plugin/BridgePlugin.cpp index 415b20fb5..33f73fe74 100644 --- a/source/backend/plugin/BridgePlugin.cpp +++ b/source/backend/plugin/BridgePlugin.cpp @@ -995,7 +995,11 @@ public: value = std::rint(value); } - setParameterValue(k, value, false, false, false); + fShmRtControl.writeOpcode(kPluginBridgeRtSetParameter); + fShmRtControl.writeInt(static_cast(k)); + fShmRtControl.writeFloat(value); + fShmRtControl.commitWrite(); + pData->postponeRtEvent(kPluginPostRtEventParameterChange, static_cast(k), 0, value); break; } @@ -1035,7 +1039,11 @@ public: if (pData->midiprog.data[k].bank == nextBankId && pData->midiprog.data[k].program == nextProgramId) { const int32_t index(static_cast(k)); - setMidiProgram(index, false, false, false); + + fShmRtControl.writeOpcode(kPluginBridgeRtSetMidiProgram); + fShmRtControl.writeInt(index); + fShmRtControl.commitWrite(); + pData->postponeRtEvent(kPluginPostRtEventMidiProgramChange, index, 0, 0.0f); break; } @@ -1050,7 +1058,9 @@ public: case kEngineControlEventTypeAllSoundOff: if (pData->options & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) { - // TODO + fShmRtControl.writeOpcode(kPluginBridgeRtAllSoundOff); + fShmRtControl.writeInt(static_cast(event.time)); + fShmRtControl.commitWrite(); } break; @@ -1063,7 +1073,9 @@ public: sendMidiAllNotesOffToCallback(); } - // TODO + fShmRtControl.writeOpcode(kPluginBridgeRtAllNotesOff); + fShmRtControl.writeInt(static_cast(event.time)); + fShmRtControl.commitWrite(); } break; } // switch (ctrlEvent.type) @@ -1092,18 +1104,16 @@ public: if (status == MIDI_STATUS_PITCH_WHEEL_CONTROL && (pData->options & PLUGIN_OPTION_SEND_PITCHBEND) == 0) continue; - { - fShmRtControl.writeOpcode(kPluginBridgeRtMidiEvent); - fShmRtControl.writeInt(static_cast(event.time)); - fShmRtControl.writeInt(midiEvent.size); + fShmRtControl.writeOpcode(kPluginBridgeRtMidiEvent); + fShmRtControl.writeInt(static_cast(event.time)); + fShmRtControl.writeInt(midiEvent.size); - fShmRtControl.writeByte(static_cast(status + channel)); + fShmRtControl.writeByte(static_cast(status + channel)); - for (uint8_t j=1; j < midiEvent.size; ++j) - fShmRtControl.writeByte(midiEvent.data[j]); + for (uint8_t j=1; j < midiEvent.size; ++j) + fShmRtControl.writeByte(midiEvent.data[j]); - fShmRtControl.commitWrite(); - } + fShmRtControl.commitWrite(); if (status == MIDI_STATUS_NOTE_ON) pData->postponeRtEvent(kPluginPostRtEventNoteOn, channel, midiEvent.data[1], midiEvent.data[2]); @@ -1975,18 +1985,6 @@ public: return false; } - // --------------------------------------------------------------- - // set default options - - pData->options = 0x0; - pData->options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; - pData->options |= PLUGIN_OPTION_USE_CHUNKS; - pData->options |= PLUGIN_OPTION_SEND_CONTROL_CHANGES; - pData->options |= PLUGIN_OPTION_SEND_CHANNEL_PRESSURE; - pData->options |= PLUGIN_OPTION_SEND_NOTE_AFTERTOUCH; - pData->options |= PLUGIN_OPTION_SEND_PITCHBEND; - pData->options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF; - return true; } diff --git a/source/utils/CarlaBridgeUtils.hpp b/source/utils/CarlaBridgeUtils.hpp index 5146bf376..d29b1c10c 100644 --- a/source/utils/CarlaBridgeUtils.hpp +++ b/source/utils/CarlaBridgeUtils.hpp @@ -59,6 +59,8 @@ enum PluginBridgeRtOpcode { kPluginBridgeRtSetProgram, // int kPluginBridgeRtSetMidiProgram, // int kPluginBridgeRtMidiEvent, // uint/frame, uint/size, char[] + kPluginBridgeRtAllSoundOff, // uint/frame + kPluginBridgeRtAllNotesOff, // uint/frame kPluginBridgeRtProcess }; @@ -207,6 +209,10 @@ const char* PluginBridgeRtOpcode2str(const PluginBridgeRtOpcode opcode) noexcept return "kPluginBridgeRtSetMidiProgram"; case kPluginBridgeRtMidiEvent: return "kPluginBridgeRtMidiEvent"; + case kPluginBridgeRtAllSoundOff: + return "kPluginBridgeRtAllSoundOff"; + case kPluginBridgeRtAllNotesOff: + return "kPluginBridgeRtAllNotesOff"; case kPluginBridgeRtProcess: return "kPluginBridgeRtProcess"; }