diff --git a/source/backend/plugin/VstPlugin.cpp b/source/backend/plugin/VstPlugin.cpp index 7c7298696..5cc0675fb 100644 --- a/source/backend/plugin/VstPlugin.cpp +++ b/source/backend/plugin/VstPlugin.cpp @@ -212,13 +212,14 @@ public: options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; - if (getMidiInCount() == 0) - options |= PLUGIN_OPTION_FIXED_BUFFERS; - if (fEffect->flags & effFlagsProgramChunks) options |= PLUGIN_OPTION_USE_CHUNKS; - if (vstPluginCanDo(fEffect, "receiveVstEvents") || vstPluginCanDo(fEffect, "receiveVstMidiEvent") || (fEffect->flags & effFlagsIsSynth) > 0 || (pData->hints & PLUGIN_WANTS_MIDI_INPUT)) + if (getMidiInCount() == 0) + { + options |= PLUGIN_OPTION_FIXED_BUFFERS; + } + else { options |= PLUGIN_OPTION_SEND_CONTROL_CHANGES; options |= PLUGIN_OPTION_SEND_CHANNEL_PRESSURE; @@ -565,7 +566,7 @@ public: aOuts = (fEffect->numOutputs > 0) ? static_cast(fEffect->numOutputs) : 0; params = (fEffect->numParams > 0) ? static_cast(fEffect->numParams) : 0; - if (vstPluginCanDo(fEffect, "receiveVstEvents") || vstPluginCanDo(fEffect, "receiveVstMidiEvent") || (fEffect->flags & effFlagsIsSynth) > 0 || (pData->hints & PLUGIN_WANTS_MIDI_INPUT)) + if (hasMidiInput()) { mIns = 1; needsCtrlIn = true; @@ -573,7 +574,7 @@ public: else mIns = 0; - if (vstPluginCanDo(fEffect, "sendVstEvents") || vstPluginCanDo(fEffect, "sendVstMidiEvent")) + if (hasMidiOutput()) { mOuts = 1; needsCtrlOut = true; @@ -2134,6 +2135,23 @@ protected: (void)opt; } + bool canDo(const char* const feature) const noexcept + { + try { + return (fEffect->dispatcher(fEffect, effCanDo, 0, 0, const_cast(feature), 0.0f) == 1); + } CARLA_SAFE_EXCEPTION_RETURN("vstPluginCanDo", false); + } + + bool hasMidiInput() const noexcept + { + return (canDo("receiveVstEvents") || canDo("receiveVstMidiEvent") || (fEffect->flags & effFlagsIsSynth) > 0 || (pData->hints & PLUGIN_WANTS_MIDI_INPUT)); + } + + bool hasMidiOutput() const noexcept + { + return (canDo("sendVstEvents") || canDo("sendVstMidiEvent")); + } + // ------------------------------------------------------------------- public: @@ -2295,19 +2313,19 @@ public: // load plugin settings { + const bool hasMidiIn(hasMidiInput()); + // set default options pData->options = 0x0; pData->options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; - if (getMidiInCount() > 0) - pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; - if (fEffect->flags & effFlagsProgramChunks) pData->options |= PLUGIN_OPTION_USE_CHUNKS; - if (vstPluginCanDo(fEffect, "receiveVstEvents") || vstPluginCanDo(fEffect, "receiveVstMidiEvent") || (fEffect->flags & effFlagsIsSynth) > 0 || (pData->hints & PLUGIN_WANTS_MIDI_INPUT)) + if (hasMidiIn) { + pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; pData->options |= PLUGIN_OPTION_SEND_CHANNEL_PRESSURE; pData->options |= PLUGIN_OPTION_SEND_NOTE_AFTERTOUCH; pData->options |= PLUGIN_OPTION_SEND_PITCHBEND; @@ -2331,7 +2349,7 @@ public: pData->options = pData->loadSettings(pData->options, getOptionsAvailable()); // ignore settings, we need this anyway - if (getMidiInCount() > 0) + if (hasMidiIn) pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; #endif }