Browse Source

More discovery fixes

tags/1.9.4
falkTX 11 years ago
parent
commit
1d71a60a28
1 changed files with 64 additions and 55 deletions
  1. +64
    -55
      source/discovery/carla-discovery.cpp

+ 64
- 55
source/discovery/carla-discovery.cpp View File

@@ -82,9 +82,6 @@ bool gVstNeedsIdle = false;
// Check if plugin wants midi // Check if plugin wants midi
bool gVstWantsMidi = false; bool gVstWantsMidi = false;


// Check if plugin is processing
bool gVstIsProcessing = false;

// Current uniqueId for VST shell plugins // Current uniqueId for VST shell plugins
intptr_t gVstCurrentUniqueId = 0; intptr_t gVstCurrentUniqueId = 0;


@@ -217,7 +214,7 @@ intptr_t VSTCALLBACK vstHostCallback(AEffect* const effect, const int32_t opcode
#endif #endif


case audioMasterGetCurrentProcessLevel: case audioMasterGetCurrentProcessLevel:
ret = gVstIsProcessing ? kVstProcessLevelRealtime : kVstProcessLevelUser;
ret = kVstProcessLevelUser;
break; break;


case audioMasterGetAutomationState: case audioMasterGetAutomationState:
@@ -357,7 +354,7 @@ public:
DISCOVERY_OUT("midi.ins", 1); DISCOVERY_OUT("midi.ins", 1);
DISCOVERY_OUT("midi.total", 1); DISCOVERY_OUT("midi.total", 1);
DISCOVERY_OUT("programs.total", programs); DISCOVERY_OUT("programs.total", programs);
//DISCOVERY_OUT("parameters.ins", 13); // defined in Carla - TODO
//DISCOVERY_OUT("parameters.ins", 13); // defined in Carla, TODO
//DISCOVERY_OUT("parameters.outs", 1); //DISCOVERY_OUT("parameters.outs", 1);
//DISCOVERY_OUT("parameters.total", 14); //DISCOVERY_OUT("parameters.total", 14);
DISCOVERY_OUT("build", BINARY_NATIVE); DISCOVERY_OUT("build", BINARY_NATIVE);
@@ -379,7 +376,7 @@ void do_ladspa_check(void* const libHandle, const bool init)
#ifdef WANT_LADSPA #ifdef WANT_LADSPA
const LADSPA_Descriptor_Function descFn = (LADSPA_Descriptor_Function)lib_symbol(libHandle, "ladspa_descriptor"); const LADSPA_Descriptor_Function descFn = (LADSPA_Descriptor_Function)lib_symbol(libHandle, "ladspa_descriptor");


if (! descFn)
if (descFn == nullptr)
{ {
DISCOVERY_OUT("error", "Not a LADSPA plugin"); DISCOVERY_OUT("error", "Not a LADSPA plugin");
return; return;
@@ -388,19 +385,19 @@ void do_ladspa_check(void* const libHandle, const bool init)
unsigned long i = 0; unsigned long i = 0;
const LADSPA_Descriptor* descriptor; const LADSPA_Descriptor* descriptor;


while ((descriptor = descFn(i++)))
while ((descriptor = descFn(i++)) != nullptr)
{ {
if (! descriptor->instantiate)
if (descriptor->instantiate == nullptr)
{ {
DISCOVERY_OUT("error", "Plugin '" << descriptor->Name << "' has no instantiate()"); DISCOVERY_OUT("error", "Plugin '" << descriptor->Name << "' has no instantiate()");
continue; continue;
} }
if (! descriptor->cleanup)
if (descriptor->cleanup == nullptr)
{ {
DISCOVERY_OUT("error", "Plugin '" << descriptor->Name << "' has no cleanup()"); DISCOVERY_OUT("error", "Plugin '" << descriptor->Name << "' has no cleanup()");
continue; continue;
} }
if (! descriptor->run)
if (descriptor->run == nullptr)
{ {
DISCOVERY_OUT("error", "Plugin '" << descriptor->Name << "' has no run()"); DISCOVERY_OUT("error", "Plugin '" << descriptor->Name << "' has no run()");
continue; continue;
@@ -423,6 +420,7 @@ void do_ladspa_check(void* const libHandle, const bool init)


for (unsigned long j=0; j < descriptor->PortCount; j++) for (unsigned long j=0; j < descriptor->PortCount; j++)
{ {
CARLA_ASSERT(descriptor->PortNames[j] != nullptr);
const LADSPA_PortDescriptor portDescriptor = descriptor->PortDescriptors[j]; const LADSPA_PortDescriptor portDescriptor = descriptor->PortDescriptors[j];


if (LADSPA_IS_PORT_AUDIO(portDescriptor)) if (LADSPA_IS_PORT_AUDIO(portDescriptor))
@@ -452,7 +450,7 @@ void do_ladspa_check(void* const libHandle, const bool init)


const LADSPA_Handle handle = descriptor->instantiate(descriptor, kSampleRate); const LADSPA_Handle handle = descriptor->instantiate(descriptor, kSampleRate);


if (! handle)
if (handle == nullptr)
{ {
DISCOVERY_OUT("error", "Failed to init LADSPA plugin"); DISCOVERY_OUT("error", "Failed to init LADSPA plugin");
continue; continue;
@@ -526,12 +524,12 @@ void do_ladspa_check(void* const libHandle, const bool init)
} }
} }


if (descriptor->activate)
if (descriptor->activate != nullptr)
descriptor->activate(handle); descriptor->activate(handle);


descriptor->run(handle, kBufferSize); descriptor->run(handle, kBufferSize);


if (descriptor->deactivate)
if (descriptor->deactivate != nullptr)
descriptor->deactivate(handle); descriptor->deactivate(handle);


descriptor->cleanup(handle); descriptor->cleanup(handle);
@@ -571,7 +569,7 @@ void do_dssi_check(void* const libHandle, const bool init)
#ifdef WANT_DSSI #ifdef WANT_DSSI
const DSSI_Descriptor_Function descFn = (DSSI_Descriptor_Function)lib_symbol(libHandle, "dssi_descriptor"); const DSSI_Descriptor_Function descFn = (DSSI_Descriptor_Function)lib_symbol(libHandle, "dssi_descriptor");


if (! descFn)
if (descFn == nullptr)
{ {
DISCOVERY_OUT("error", "Not a DSSI plugin"); DISCOVERY_OUT("error", "Not a DSSI plugin");
return; return;
@@ -580,26 +578,31 @@ void do_dssi_check(void* const libHandle, const bool init)
unsigned long i = 0; unsigned long i = 0;
const DSSI_Descriptor* descriptor; const DSSI_Descriptor* descriptor;


while ((descriptor = descFn(i++)))
while ((descriptor = descFn(i++)) != nullptr)
{ {
const LADSPA_Descriptor* const ldescriptor = descriptor->LADSPA_Plugin; const LADSPA_Descriptor* const ldescriptor = descriptor->LADSPA_Plugin;


if (! ldescriptor)
if (ldescriptor == nullptr)
{ {
DISCOVERY_OUT("error", "Plugin '" << ldescriptor->Name << "' has no LADSPA interface"); DISCOVERY_OUT("error", "Plugin '" << ldescriptor->Name << "' has no LADSPA interface");
continue; continue;
} }
if (! ldescriptor->instantiate)
if (descriptor->DSSI_API_Version != DSSI_VERSION_MAJOR)
{
DISCOVERY_OUT("error", "Plugin '" << ldescriptor->Name << "' uses an unsupported DSSI spec version " << descriptor->DSSI_API_Version);
continue;
}
if (ldescriptor->instantiate == nullptr)
{ {
DISCOVERY_OUT("error", "Plugin '" << ldescriptor->Name << "' has no instantiate()"); DISCOVERY_OUT("error", "Plugin '" << ldescriptor->Name << "' has no instantiate()");
continue; continue;
} }
if (! ldescriptor->cleanup)
if (ldescriptor->cleanup == nullptr)
{ {
DISCOVERY_OUT("error", "Plugin '" << ldescriptor->Name << "' has no cleanup()"); DISCOVERY_OUT("error", "Plugin '" << ldescriptor->Name << "' has no cleanup()");
continue; continue;
} }
if (! (ldescriptor->run || descriptor->run_synth || descriptor->run_multiple_synths))
if (ldescriptor->run == nullptr && descriptor->run_synth == nullptr && descriptor->run_multiple_synths == nullptr)
{ {
DISCOVERY_OUT("error", "Plugin '" << ldescriptor->Name << "' has no run(), run_synth() or run_multiple_synths()"); DISCOVERY_OUT("error", "Plugin '" << ldescriptor->Name << "' has no run(), run_synth() or run_multiple_synths()");
continue; continue;
@@ -625,6 +628,7 @@ void do_dssi_check(void* const libHandle, const bool init)


for (unsigned long j=0; j < ldescriptor->PortCount; j++) for (unsigned long j=0; j < ldescriptor->PortCount; j++)
{ {
CARLA_ASSERT(ldescriptor->PortNames[j] != nullptr);
const LADSPA_PortDescriptor portDescriptor = ldescriptor->PortDescriptors[j]; const LADSPA_PortDescriptor portDescriptor = ldescriptor->PortDescriptors[j];


if (LADSPA_IS_PORT_AUDIO(portDescriptor)) if (LADSPA_IS_PORT_AUDIO(portDescriptor))
@@ -660,13 +664,13 @@ void do_dssi_check(void* const libHandle, const bool init)


const LADSPA_Handle handle = ldescriptor->instantiate(ldescriptor, kSampleRate); const LADSPA_Handle handle = ldescriptor->instantiate(ldescriptor, kSampleRate);


if (! handle)
if (handle == nullptr)
{ {
DISCOVERY_OUT("error", "Failed to init DSSI plugin"); DISCOVERY_OUT("error", "Failed to init DSSI plugin");
continue; continue;
} }


if (descriptor->get_program && descriptor->select_program)
if (descriptor->get_program != nullptr && descriptor->select_program != nullptr)
{ {
while (descriptor->get_program(handle, programsTotal++)) while (descriptor->get_program(handle, programsTotal++))
continue; continue;
@@ -747,10 +751,10 @@ void do_dssi_check(void* const libHandle, const bool init)
descriptor->select_program(handle, pDesc->Bank, pDesc->Program); descriptor->select_program(handle, pDesc->Bank, pDesc->Program);
} }


if (ldescriptor->activate)
if (ldescriptor->activate != nullptr)
ldescriptor->activate(handle); ldescriptor->activate(handle);


if (descriptor->run_synth || descriptor->run_multiple_synths)
if (descriptor->run_synth != nullptr || descriptor->run_multiple_synths != nullptr)
{ {
snd_seq_event_t midiEvents[2]; snd_seq_event_t midiEvents[2];
memset(midiEvents, 0, sizeof(snd_seq_event_t)*2); //FIXME memset(midiEvents, 0, sizeof(snd_seq_event_t)*2); //FIXME
@@ -766,7 +770,7 @@ void do_dssi_check(void* const libHandle, const bool init)
midiEvents[1].data.note.velocity = 0; midiEvents[1].data.note.velocity = 0;
midiEvents[1].time.tick = kBufferSize/2; midiEvents[1].time.tick = kBufferSize/2;


if (descriptor->run_multiple_synths && ! descriptor->run_synth)
if (descriptor->run_multiple_synths != nullptr && descriptor->run_synth == nullptr)
{ {
LADSPA_Handle handlePtr[1] = { handle }; LADSPA_Handle handlePtr[1] = { handle };
snd_seq_event_t* midiEventsPtr[1] = { midiEvents }; snd_seq_event_t* midiEventsPtr[1] = { midiEvents };
@@ -779,7 +783,7 @@ void do_dssi_check(void* const libHandle, const bool init)
else else
ldescriptor->run(handle, kBufferSize); ldescriptor->run(handle, kBufferSize);


if (ldescriptor->deactivate)
if (ldescriptor->deactivate != nullptr)
ldescriptor->deactivate(handle); ldescriptor->deactivate(handle);


ldescriptor->cleanup(handle); ldescriptor->cleanup(handle);
@@ -1046,11 +1050,11 @@ void do_vst_check(void* const libHandle, const bool init)
#ifdef WANT_VST #ifdef WANT_VST
VST_Function vstFn = (VST_Function)lib_symbol(libHandle, "VSTPluginMain"); VST_Function vstFn = (VST_Function)lib_symbol(libHandle, "VSTPluginMain");


if (! vstFn)
if (vstFn == nullptr)
{ {
vstFn = (VST_Function)lib_symbol(libHandle, "main"); vstFn = (VST_Function)lib_symbol(libHandle, "main");


if (! vstFn)
if (vstFn == nullptr)
{ {
DISCOVERY_OUT("error", "Not a VST plugin"); DISCOVERY_OUT("error", "Not a VST plugin");
return; return;
@@ -1059,7 +1063,7 @@ void do_vst_check(void* const libHandle, const bool init)


AEffect* const effect = vstFn(vstHostCallback); AEffect* const effect = vstFn(vstHostCallback);


if (! (effect && effect->magic == kEffectMagic))
if (effect == nullptr || effect->magic != kEffectMagic)
{ {
DISCOVERY_OUT("error", "Failed to init VST plugin, or VST magic failed"); DISCOVERY_OUT("error", "Failed to init VST plugin, or VST magic failed");
return; return;
@@ -1072,9 +1076,9 @@ void do_vst_check(void* const libHandle, const bool init)


effect->dispatcher(effect, effOpen, 0, 0, nullptr, 0.0f); effect->dispatcher(effect, effOpen, 0, 0, nullptr, 0.0f);


intptr_t vstCategory = effect->dispatcher(effect, effGetPlugCategory, 0, 0, nullptr, 0.0f);
const intptr_t vstCategory = effect->dispatcher(effect, effGetPlugCategory, 0, 0, nullptr, 0.0f);


if (vstCategory == kPlugCategShell && effect->uniqueID == 0)
if (vstCategory == kPlugCategShell)
{ {
if ((gVstCurrentUniqueId = effect->dispatcher(effect, effShellGetNextPlugin, 0, 0, strBuf, 0.0f)) != 0) if ((gVstCurrentUniqueId = effect->dispatcher(effect, effShellGetNextPlugin, 0, 0, strBuf, 0.0f)) != 0)
cName = strBuf; cName = strBuf;
@@ -1083,27 +1087,26 @@ void do_vst_check(void* const libHandle, const bool init)
{ {
gVstCurrentUniqueId = effect->uniqueID; gVstCurrentUniqueId = effect->uniqueID;


if (effect->dispatcher(effect, effGetEffectName, 0, 0, strBuf, 0.0f) == 1)
if (gVstCurrentUniqueId != 0 && effect->dispatcher(effect, effGetEffectName, 0, 0, strBuf, 0.0f) == 1)
cName = strBuf; cName = strBuf;
} }


carla_zeroMem(strBuf, sizeof(char)*STR_MAX);
if (effect->dispatcher(effect, effGetVendorString, 0, 0, strBuf, 0.0f) == 1)
cVendor = strBuf;

// FIXME: Waves crash during processing
if (cVendor == "Waves")
std::memset((void*)&init, 0, sizeof(bool)); //FIXME

if (gVstCurrentUniqueId == 0) if (gVstCurrentUniqueId == 0)
{ {
DISCOVERY_OUT("error", "Plugin doesn't have an Unique ID"); DISCOVERY_OUT("error", "Plugin doesn't have an Unique ID");
effect->dispatcher(effect, effClose, 0, 0, nullptr, 0.0f);
return; return;
} }


carla_zeroMem(strBuf, sizeof(char)*STR_MAX);

if (effect->dispatcher(effect, effGetVendorString, 0, 0, strBuf, 0.0f) == 1)
cVendor = strBuf;

while (gVstCurrentUniqueId != 0) while (gVstCurrentUniqueId != 0)
{ {
carla_zeroMem(strBuf, sizeof(char)*STR_MAX); carla_zeroMem(strBuf, sizeof(char)*STR_MAX);

if (effect->dispatcher(effect, effGetProductString, 0, 0, strBuf, 0.0f) == 1) if (effect->dispatcher(effect, effGetProductString, 0, 0, strBuf, 0.0f) == 1)
cProduct = strBuf; cProduct = strBuf;
else else
@@ -1141,6 +1144,9 @@ void do_vst_check(void* const libHandle, const bool init)


if (init) if (init)
{ {
if (gVstNeedsIdle)
effect->dispatcher(effect, effIdle, 0, 0, nullptr, 0.0f);

#if ! VST_FORCE_DEPRECATED #if ! VST_FORCE_DEPRECATED
effect->dispatcher(effect, effSetBlockSizeAndSampleRate, 0, kBufferSize, nullptr, kSampleRate); effect->dispatcher(effect, effSetBlockSizeAndSampleRate, 0, kBufferSize, nullptr, kSampleRate);
#endif #endif
@@ -1151,9 +1157,15 @@ void do_vst_check(void* const libHandle, const bool init)
effect->dispatcher(effect, effStopProcess, 0, 0, nullptr, 0.0f); effect->dispatcher(effect, effStopProcess, 0, 0, nullptr, 0.0f);
effect->dispatcher(effect, effMainsChanged, 0, 0, nullptr, 0.0f); effect->dispatcher(effect, effMainsChanged, 0, 0, nullptr, 0.0f);


if (gVstNeedsIdle)
effect->dispatcher(effect, effIdle, 0, 0, nullptr, 0.0f);

effect->dispatcher(effect, effMainsChanged, 0, 1, nullptr, 0.0f); effect->dispatcher(effect, effMainsChanged, 0, 1, nullptr, 0.0f);
effect->dispatcher(effect, effStartProcess, 0, 0, nullptr, 0.0f); effect->dispatcher(effect, effStartProcess, 0, 0, nullptr, 0.0f);


if (gVstNeedsIdle)
effect->dispatcher(effect, effIdle, 0, 0, nullptr, 0.0f);

// Plugin might call wantMidi() during resume // Plugin might call wantMidi() during resume
if (midiIns == 0 && gVstWantsMidi) if (midiIns == 0 && gVstWantsMidi)
{ {
@@ -1204,18 +1216,17 @@ void do_vst_check(void* const libHandle, const bool init)
midiEvents[1].deltaFrames = kBufferSize/2; midiEvents[1].deltaFrames = kBufferSize/2;


events.numEvents = 2; events.numEvents = 2;
events.reserved = 0;
events.data[0] = (VstEvent*)&midiEvents[0]; events.data[0] = (VstEvent*)&midiEvents[0];
events.data[1] = (VstEvent*)&midiEvents[1]; events.data[1] = (VstEvent*)&midiEvents[1];


// processing // processing
{ {
gVstIsProcessing = true;

if (midiIns > 0) if (midiIns > 0)
effect->dispatcher(effect, effProcessEvents, 0, 0, &events, 0.0f); effect->dispatcher(effect, effProcessEvents, 0, 0, &events, 0.0f);


#if ! VST_FORCE_DEPRECATED #if ! VST_FORCE_DEPRECATED
if ((effect->flags & effFlagsCanReplacing) > 0 && effect->processReplacing && effect->processReplacing != effect->process)
if ((effect->flags & effFlagsCanReplacing) > 0 && effect->processReplacing != nullptr && effect->processReplacing != effect->process)
effect->processReplacing(effect, bufferAudioIn, bufferAudioOut, kBufferSize); effect->processReplacing(effect, bufferAudioIn, bufferAudioOut, kBufferSize);
else if (effect->process != nullptr) else if (effect->process != nullptr)
effect->process(effect, bufferAudioIn, bufferAudioOut, kBufferSize); effect->process(effect, bufferAudioIn, bufferAudioOut, kBufferSize);
@@ -1225,7 +1236,7 @@ void do_vst_check(void* const libHandle, const bool init)
CARLA_ASSERT(effect->flags & effFlagsCanReplacing); CARLA_ASSERT(effect->flags & effFlagsCanReplacing);
if (effect->flags & effFlagsCanReplacing) if (effect->flags & effFlagsCanReplacing)
{ {
if (effect->processReplacing)
if (effect->processReplacing != nullptr)
effect->processReplacing(effect, bufferAudioIn, bufferAudioOut, bufferSize); effect->processReplacing(effect, bufferAudioIn, bufferAudioOut, bufferSize);
else else
DISCOVERY_OUT("error", "Plugin doesn't have a process function"); DISCOVERY_OUT("error", "Plugin doesn't have a process function");
@@ -1233,13 +1244,14 @@ void do_vst_check(void* const libHandle, const bool init)
else else
DISCOVERY_OUT("error", "Plugin doesn't have can't do process replacing"); DISCOVERY_OUT("error", "Plugin doesn't have can't do process replacing");
#endif #endif

gVstIsProcessing = false;
} }


effect->dispatcher(effect, effStopProcess, 0, 0, nullptr, 0.0f); effect->dispatcher(effect, effStopProcess, 0, 0, nullptr, 0.0f);
effect->dispatcher(effect, effMainsChanged, 0, 0, nullptr, 0.0f); effect->dispatcher(effect, effMainsChanged, 0, 0, nullptr, 0.0f);


if (gVstNeedsIdle)
effect->dispatcher(effect, effIdle, 0, 0, nullptr, 0.0f);

for (int j=0; j < audioIns; j++) for (int j=0; j < audioIns; j++)
delete[] bufferAudioIn[j]; delete[] bufferAudioIn[j];
for (int j=0; j < audioOuts; j++) for (int j=0; j < audioOuts; j++)
@@ -1268,23 +1280,20 @@ void do_vst_check(void* const libHandle, const bool init)
DISCOVERY_OUT("build", BINARY_NATIVE); DISCOVERY_OUT("build", BINARY_NATIVE);
DISCOVERY_OUT("end", "------------"); DISCOVERY_OUT("end", "------------");


if (vstCategory != kPlugCategShell)
break;

// request next Unique ID
intptr_t nextUniqueId = gVstCurrentUniqueId;

// FIXME: Waves sometimes return the same ID
while (nextUniqueId == gVstCurrentUniqueId)
if (vstCategory == kPlugCategShell)
{ {
carla_zeroMem(strBuf, sizeof(char)*STR_MAX); carla_zeroMem(strBuf, sizeof(char)*STR_MAX);
gVstCurrentUniqueId = effect->dispatcher(effect, effShellGetNextPlugin, 0, 0, strBuf, 0.0f);


if (gVstCurrentUniqueId != 0)
if ((gVstCurrentUniqueId = effect->dispatcher(effect, effShellGetNextPlugin, 0, 0, strBuf, 0.0f)) != 0)
cName = strBuf; cName = strBuf;
} }
else
break;
} }


if (gVstNeedsIdle)
effect->dispatcher(effect, effIdle, 0, 0, nullptr, 0.0f);

effect->dispatcher(effect, effClose, 0, 0, nullptr, 0.0f); effect->dispatcher(effect, effClose, 0, 0, nullptr, 0.0f);
#else #else
DISCOVERY_OUT("error", "VST support not available"); DISCOVERY_OUT("error", "VST support not available");


Loading…
Cancel
Save