Browse Source

Proper VST midi-in check for available settings, fixes Vex

tags/1.9.4
falkTX 11 years ago
parent
commit
bc855c9495
1 changed files with 29 additions and 11 deletions
  1. +29
    -11
      source/backend/plugin/VstPlugin.cpp

+ 29
- 11
source/backend/plugin/VstPlugin.cpp View File

@@ -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
} }


Loading…
Cancel
Save