Browse Source

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

tags/1.9.4
falkTX 10 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;

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<uint32_t>(fEffect->numOutputs) : 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;
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<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:
@@ -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
}


Loading…
Cancel
Save