| @@ -212,13 +212,14 @@ public: | |||||
| options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; | options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; | ||||
| if (getMidiInCount() == 0) | |||||
| options |= PLUGIN_OPTION_FIXED_BUFFERS; | |||||
| if (fEffect->flags & effFlagsProgramChunks) | if (fEffect->flags & effFlagsProgramChunks) | ||||
| options |= PLUGIN_OPTION_USE_CHUNKS; | 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_CONTROL_CHANGES; | ||||
| options |= PLUGIN_OPTION_SEND_CHANNEL_PRESSURE; | options |= PLUGIN_OPTION_SEND_CHANNEL_PRESSURE; | ||||
| @@ -565,7 +566,7 @@ public: | |||||
| aOuts = (fEffect->numOutputs > 0) ? static_cast<uint32_t>(fEffect->numOutputs) : 0; | aOuts = (fEffect->numOutputs > 0) ? static_cast<uint32_t>(fEffect->numOutputs) : 0; | ||||
| params = (fEffect->numParams > 0) ? static_cast<uint32_t>(fEffect->numParams) : 0; | params = (fEffect->numParams > 0) ? static_cast<uint32_t>(fEffect->numParams) : 0; | ||||
| if (vstPluginCanDo(fEffect, "receiveVstEvents") || vstPluginCanDo(fEffect, "receiveVstMidiEvent") || (fEffect->flags & effFlagsIsSynth) > 0 || (pData->hints & PLUGIN_WANTS_MIDI_INPUT)) | |||||
| if (hasMidiInput()) | |||||
| { | { | ||||
| mIns = 1; | mIns = 1; | ||||
| needsCtrlIn = true; | needsCtrlIn = true; | ||||
| @@ -573,7 +574,7 @@ public: | |||||
| else | else | ||||
| mIns = 0; | mIns = 0; | ||||
| if (vstPluginCanDo(fEffect, "sendVstEvents") || vstPluginCanDo(fEffect, "sendVstMidiEvent")) | |||||
| if (hasMidiOutput()) | |||||
| { | { | ||||
| mOuts = 1; | mOuts = 1; | ||||
| needsCtrlOut = true; | needsCtrlOut = true; | ||||
| @@ -2134,6 +2135,23 @@ protected: | |||||
| (void)opt; | (void)opt; | ||||
| } | } | ||||
| bool canDo(const char* const feature) const noexcept | |||||
| { | |||||
| try { | |||||
| return (fEffect->dispatcher(fEffect, effCanDo, 0, 0, const_cast<char*>(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: | public: | ||||
| @@ -2295,19 +2313,19 @@ public: | |||||
| // load plugin settings | // load plugin settings | ||||
| { | { | ||||
| const bool hasMidiIn(hasMidiInput()); | |||||
| // set default options | // set default options | ||||
| pData->options = 0x0; | pData->options = 0x0; | ||||
| pData->options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; | pData->options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; | ||||
| if (getMidiInCount() > 0) | |||||
| pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; | |||||
| if (fEffect->flags & effFlagsProgramChunks) | if (fEffect->flags & effFlagsProgramChunks) | ||||
| pData->options |= PLUGIN_OPTION_USE_CHUNKS; | 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_CHANNEL_PRESSURE; | ||||
| pData->options |= PLUGIN_OPTION_SEND_NOTE_AFTERTOUCH; | pData->options |= PLUGIN_OPTION_SEND_NOTE_AFTERTOUCH; | ||||
| pData->options |= PLUGIN_OPTION_SEND_PITCHBEND; | pData->options |= PLUGIN_OPTION_SEND_PITCHBEND; | ||||
| @@ -2331,7 +2349,7 @@ public: | |||||
| pData->options = pData->loadSettings(pData->options, getOptionsAvailable()); | pData->options = pData->loadSettings(pData->options, getOptionsAvailable()); | ||||
| // ignore settings, we need this anyway | // ignore settings, we need this anyway | ||||
| if (getMidiInCount() > 0) | |||||
| if (hasMidiIn) | |||||
| pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; | pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; | ||||
| #endif | #endif | ||||
| } | } | ||||