diff --git a/source/backend/plugin/CarlaPluginNative.cpp b/source/backend/plugin/CarlaPluginNative.cpp index adc42df63..57603d01c 100644 --- a/source/backend/plugin/CarlaPluginNative.cpp +++ b/source/backend/plugin/CarlaPluginNative.cpp @@ -328,9 +328,6 @@ public: uint options = 0x0; - if (hasMidiProgs && (fDescriptor->supports & NATIVE_PLUGIN_SUPPORTS_PROGRAM_CHANGES) == 0) - options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; - if (getMidiInCount() == 0 && (fDescriptor->hints & NATIVE_PLUGIN_NEEDS_FIXED_BUFFERS) == 0) options |= PLUGIN_OPTION_FIXED_BUFFERS; @@ -353,6 +350,11 @@ public: if (fDescriptor->supports & NATIVE_PLUGIN_SUPPORTS_ALL_SOUND_OFF) options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF; + if (fDescriptor->supports & NATIVE_PLUGIN_SUPPORTS_PROGRAM_CHANGES) + options |= PLUGIN_OPTION_SEND_PROGRAM_CHANGES; + else if (hasMidiProgs) + options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; + return options; } @@ -1628,7 +1630,6 @@ public: NativeMidiEvent& nativeEvent(fMidiEvents[fMidiEventCount++]); carla_zeroStruct(nativeEvent); - nativeEvent.port = 0; nativeEvent.time = sampleAccurate ? startTime : event.time; nativeEvent.data[0] = uint8_t(MIDI_STATUS_CONTROL_CHANGE | (event.channel & MIDI_CHANNEL_BIT)); nativeEvent.data[1] = MIDI_CONTROL_ALL_SOUND_OFF; @@ -2140,19 +2141,18 @@ protected: { CARLA_SAFE_ASSERT_RETURN(pData->enabled, false); CARLA_SAFE_ASSERT_RETURN(fIsProcessing, false); - CARLA_SAFE_ASSERT_RETURN(fMidiOut.count > 0, false); - CARLA_SAFE_ASSERT_RETURN(pData->event.portOut != nullptr, false); + CARLA_SAFE_ASSERT_RETURN(fMidiOut.count > 0 || pData->event.portOut != nullptr, false); CARLA_SAFE_ASSERT_RETURN(event != nullptr, false); CARLA_SAFE_ASSERT_RETURN(event->data[0] != 0, false); // reverse-find first free event, and put it there for (uint32_t i=(kPluginMaxMidiEvents*2)-1; i >= fMidiEventCount; --i) { - if (fMidiEvents[i].data[0] == 0) - { - std::memcpy(&fMidiEvents[i], event, sizeof(NativeMidiEvent)); - return true; - } + if (fMidiEvents[i].data[0] != 0) + continue; + + std::memcpy(&fMidiEvents[i], event, sizeof(NativeMidiEvent)); + return true; } carla_stdout("CarlaPluginNative::handleWriteMidiEvent(%p) - buffer full", event); @@ -2346,9 +2346,6 @@ public: pData->options = 0x0; - if (hasMidiProgs && (fDescriptor->supports & NATIVE_PLUGIN_SUPPORTS_PROGRAM_CHANGES) == 0) - pData->options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; - if (getMidiInCount() > 0 || (fDescriptor->hints & NATIVE_PLUGIN_NEEDS_FIXED_BUFFERS) != 0) pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; @@ -2364,6 +2361,17 @@ public: if (fDescriptor->supports & NATIVE_PLUGIN_SUPPORTS_ALL_SOUND_OFF) pData->options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF; + if (fDescriptor->supports & NATIVE_PLUGIN_SUPPORTS_PROGRAM_CHANGES) + { + CARLA_SAFE_ASSERT(! hasMidiProgs); + pData->options |= PLUGIN_OPTION_SEND_PROGRAM_CHANGES; + + if (fDescriptor->supports & NATIVE_PLUGIN_SUPPORTS_CONTROL_CHANGES) + pData->options |= PLUGIN_OPTION_SEND_CONTROL_CHANGES; + } + else if (hasMidiProgs) + pData->options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; + return true; }