From 0f8bd45a7c86b3cba57aa79cade600362185d467 Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Wed, 27 Dec 2017 10:40:38 -0500 Subject: [PATCH] ModuleInterface::RegisterPlugin can report an error message --- include/audacity/ModuleInterface.h | 4 +++- src/ModuleManager.cpp | 6 ++++-- src/ModuleManager.h | 3 ++- src/PluginManager.cpp | 17 ++++++++++++++++- src/effects/LoadEffects.cpp | 9 +++++++-- src/effects/LoadEffects.h | 3 ++- src/effects/VST/VSTEffect.cpp | 4 +++- src/effects/VST/VSTEffect.h | 3 ++- src/effects/audiounits/AudioUnitEffect.cpp | 5 ++++- src/effects/audiounits/AudioUnitEffect.h | 3 ++- src/effects/ladspa/LadspaEffect.cpp | 9 +++++++-- src/effects/ladspa/LadspaEffect.h | 3 ++- src/effects/lv2/LoadLV2.cpp | 4 +++- src/effects/lv2/LoadLV2.h | 3 ++- src/effects/nyquist/LoadNyquist.cpp | 12 +++++++++--- src/effects/nyquist/LoadNyquist.h | 3 ++- src/effects/vamp/LoadVamp.cpp | 4 +++- src/effects/vamp/LoadVamp.h | 3 ++- 18 files changed, 75 insertions(+), 23 deletions(-) diff --git a/include/audacity/ModuleInterface.h b/include/audacity/ModuleInterface.h index e713cf492..7f9f62f4b 100644 --- a/include/audacity/ModuleInterface.h +++ b/include/audacity/ModuleInterface.h @@ -88,8 +88,10 @@ public: // will be made to request registration of that plugin. If the module must create // an instance of the plugin to register it, then then instance should be deleted // after registration. + // Error message does not need to mention the path. virtual bool RegisterPlugin(PluginManagerInterface & pluginManager, - const wxString & path) = 0; + const wxString & path, + wxString &errMsg) = 0; // For modules providing an interface to other dynamically loaded plugins, // the module returns true if the plugin is still valid, otherwise false. diff --git a/src/ModuleManager.cpp b/src/ModuleManager.cpp index 2afbf5b0e..52e637cca 100755 --- a/src/ModuleManager.cpp +++ b/src/ModuleManager.cpp @@ -539,14 +539,16 @@ wxArrayString ModuleManager::FindPluginsForProvider(const PluginID & providerID, return mDynModules[providerID]->FindPlugins(PluginManager::Get()); } -bool ModuleManager::RegisterPlugin(const PluginID & providerID, const wxString & path) +bool ModuleManager::RegisterPlugin(const PluginID & providerID, const wxString & path, wxString &errMsg) { + errMsg.clear(); if (mDynModules.find(providerID) == mDynModules.end()) { return false; } - return mDynModules[providerID]->RegisterPlugin(PluginManager::Get(), path); + return mDynModules[providerID]->RegisterPlugin(PluginManager::Get(), path, + errMsg); } IdentInterface *ModuleManager::CreateProviderInstance(const PluginID & providerID, diff --git a/src/ModuleManager.h b/src/ModuleManager.h index 9db52c5b5..29e6241b8 100644 --- a/src/ModuleManager.h +++ b/src/ModuleManager.h @@ -99,7 +99,8 @@ public: void FindAllPlugins(PluginIDList & providers, wxArrayString & paths); wxArrayString FindPluginsForProvider(const PluginID & provider, const wxString & path); - bool RegisterPlugin(const PluginID & provider, const wxString & path); + bool RegisterPlugin(const PluginID & provider, const wxString & path, + wxString &errMsg); IdentInterface *CreateProviderInstance(const PluginID & provider, const wxString & path); IdentInterface *CreateInstance(const PluginID & provider, const wxString & path); diff --git a/src/PluginManager.cpp b/src/PluginManager.cpp index 0a890328a..f16dcf9bc 100644 --- a/src/PluginManager.cpp +++ b/src/PluginManager.cpp @@ -986,10 +986,14 @@ void PluginRegistrationDialog::OnOK(wxCommandEvent & WXUNUSED(evt)) break; } + wxString errMsgs; + // Try to register the plugin via each provider until one succeeds for (size_t j = 0, cnt = item.plugs.GetCount(); j < cnt; j++) { - if (mm.RegisterPlugin(item.plugs[j]->GetProviderID(), path)) + wxString errMsg; + if (mm.RegisterPlugin(item.plugs[j]->GetProviderID(), path, + errMsg)) { for (size_t j = 0, cnt = item.plugs.GetCount(); j < cnt; j++) { @@ -997,7 +1001,18 @@ void PluginRegistrationDialog::OnOK(wxCommandEvent & WXUNUSED(evt)) } break; } + else + { + if (errMsgs.empty()) + errMsgs += '\n'; + errMsgs += errMsg; + } } + if (!errMsgs.empty()) + ::wxMessageBox( wxString::Format( + _("Effect at %s failed to register:\n%s"), + path, errMsgs + ) ); } else if (item.state == STATE_New) { diff --git a/src/effects/LoadEffects.cpp b/src/effects/LoadEffects.cpp index 529343690..f41361492 100644 --- a/src/effects/LoadEffects.cpp +++ b/src/effects/LoadEffects.cpp @@ -289,13 +289,15 @@ void BuiltinEffectsModule::Terminate() bool BuiltinEffectsModule::AutoRegisterPlugins(PluginManagerInterface & pm) { + wxString ignoredErrMsg; for (size_t i = 0; i < WXSIZEOF(kEffectNames); i++) { wxString path(wxString(BUILTIN_EFFECT_PREFIX) + kEffectNames[i]); if (!pm.IsPluginRegistered(path)) { - RegisterPlugin(pm, path); + // No checking of error ? + RegisterPlugin(pm, path, ignoredErrMsg); } } @@ -308,8 +310,11 @@ wxArrayString BuiltinEffectsModule::FindPlugins(PluginManagerInterface & WXUNUSE return mNames; } -bool BuiltinEffectsModule::RegisterPlugin(PluginManagerInterface & pm, const wxString & path) +bool BuiltinEffectsModule::RegisterPlugin(PluginManagerInterface & pm, + const wxString & path, + wxString &errMsg) { + errMsg.clear(); auto effect = Instantiate(path); if (effect) { diff --git a/src/effects/LoadEffects.h b/src/effects/LoadEffects.h index 0e45cf517..9249f51a6 100644 --- a/src/effects/LoadEffects.h +++ b/src/effects/LoadEffects.h @@ -43,7 +43,8 @@ public: bool AutoRegisterPlugins(PluginManagerInterface & pm) override; wxArrayString FindPlugins(PluginManagerInterface & pm) override; - bool RegisterPlugin(PluginManagerInterface & pm, const wxString & path) override; + bool RegisterPlugin(PluginManagerInterface & pm, + const wxString & path, wxString &errMsg) override; bool IsPluginValid(const wxString & path, bool bFast) override; diff --git a/src/effects/VST/VSTEffect.cpp b/src/effects/VST/VSTEffect.cpp index 116a0007c..e892add5c 100644 --- a/src/effects/VST/VSTEffect.cpp +++ b/src/effects/VST/VSTEffect.cpp @@ -466,8 +466,10 @@ wxArrayString VSTEffectsModule::FindPlugins(PluginManagerInterface & pm) return files; } -bool VSTEffectsModule::RegisterPlugin(PluginManagerInterface & pm, const wxString & path) +bool VSTEffectsModule::RegisterPlugin(PluginManagerInterface & pm, + const wxString & path, wxString &errMsg) { + errMsg.clear(); // TODO: Fix this for external usage const wxString &cmdpath = PlatformCompatibility::GetExecutablePath(); diff --git a/src/effects/VST/VSTEffect.h b/src/effects/VST/VSTEffect.h index 40f0d4303..4ecaee64d 100644 --- a/src/effects/VST/VSTEffect.h +++ b/src/effects/VST/VSTEffect.h @@ -393,7 +393,8 @@ public: bool AutoRegisterPlugins(PluginManagerInterface & pm) override; wxArrayString FindPlugins(PluginManagerInterface & pm) override; - bool RegisterPlugin(PluginManagerInterface & pm, const wxString & path) override; + bool RegisterPlugin(PluginManagerInterface & pm, + const wxString & path, wxString &errMsg) override; bool IsPluginValid(const wxString & path, bool bFast) override; diff --git a/src/effects/audiounits/AudioUnitEffect.cpp b/src/effects/audiounits/AudioUnitEffect.cpp index 03f312032..911dcce97 100644 --- a/src/effects/audiounits/AudioUnitEffect.cpp +++ b/src/effects/audiounits/AudioUnitEffect.cpp @@ -171,8 +171,11 @@ wxArrayString AudioUnitEffectsModule::FindPlugins(PluginManagerInterface & pm) return effects; } -bool AudioUnitEffectsModule::RegisterPlugin(PluginManagerInterface & pm, const wxString & path) +bool AudioUnitEffectsModule::RegisterPlugin(PluginManagerInterface & pm, + const wxString & path, + wxString &errMsg) { + errMsg.clear(); wxString name; AudioComponent component = FindAudioUnit(path, name); if (component == NULL) diff --git a/src/effects/audiounits/AudioUnitEffect.h b/src/effects/audiounits/AudioUnitEffect.h index 3fad9932d..b49a348d9 100644 --- a/src/effects/audiounits/AudioUnitEffect.h +++ b/src/effects/audiounits/AudioUnitEffect.h @@ -245,7 +245,8 @@ public: bool AutoRegisterPlugins(PluginManagerInterface & pm) override; wxArrayString FindPlugins(PluginManagerInterface & pm) override; - bool RegisterPlugin(PluginManagerInterface & pm, const wxString & path) override; + bool RegisterPlugin(PluginManagerInterface & pm, + const wxString & path, wxString &errMsg) override; bool IsPluginValid(const wxString & path, bool bFast) override; diff --git a/src/effects/ladspa/LadspaEffect.cpp b/src/effects/ladspa/LadspaEffect.cpp index d001ca4ce..f8eab948f 100644 --- a/src/effects/ladspa/LadspaEffect.cpp +++ b/src/effects/ladspa/LadspaEffect.cpp @@ -160,6 +160,7 @@ bool LadspaEffectsModule::AutoRegisterPlugins(PluginManagerInterface & pm) // Audacity. A little simplistic, but it should suffice for now. wxArrayString pathList = GetSearchPaths(); wxArrayString files; + wxString ignoredErrMsg; for (int i = 0; i < WXSIZEOF(kShippedEffects); i++) { @@ -169,7 +170,8 @@ bool LadspaEffectsModule::AutoRegisterPlugins(PluginManagerInterface & pm) { if (!pm.IsPluginRegistered(files[j])) { - RegisterPlugin(pm, files[j]); + // No checking for error ? + RegisterPlugin(pm, files[j], ignoredErrMsg); } } } @@ -203,8 +205,11 @@ wxArrayString LadspaEffectsModule::FindPlugins(PluginManagerInterface & pm) return files; } -bool LadspaEffectsModule::RegisterPlugin(PluginManagerInterface & pm, const wxString & path) +bool LadspaEffectsModule::RegisterPlugin(PluginManagerInterface & pm, + const wxString & path, + wxString &errMsg) { + errMsg.clear(); // Since we now have builtin VST support, ignore the VST bridge as it // causes duplicate menu entries to appear. wxFileName ff(path); diff --git a/src/effects/ladspa/LadspaEffect.h b/src/effects/ladspa/LadspaEffect.h index 2f01fe18c..602da74e1 100644 --- a/src/effects/ladspa/LadspaEffect.h +++ b/src/effects/ladspa/LadspaEffect.h @@ -225,7 +225,8 @@ public: bool AutoRegisterPlugins(PluginManagerInterface & pm) override; wxArrayString FindPlugins(PluginManagerInterface & pm) override; - bool RegisterPlugin(PluginManagerInterface & pm, const wxString & path) override; + bool RegisterPlugin(PluginManagerInterface & pm, const wxString & path, + wxString &errMsg) override; bool IsPluginValid(const wxString & path, bool bFast) override; diff --git a/src/effects/lv2/LoadLV2.cpp b/src/effects/lv2/LoadLV2.cpp index 41e78de95..c79993ae1 100644 --- a/src/effects/lv2/LoadLV2.cpp +++ b/src/effects/lv2/LoadLV2.cpp @@ -242,8 +242,10 @@ wxArrayString LV2EffectsModule::FindPlugins(PluginManagerInterface & WXUNUSED(pm return plugins; } -bool LV2EffectsModule::RegisterPlugin(PluginManagerInterface & pm, const wxString & path) +bool LV2EffectsModule::RegisterPlugin(PluginManagerInterface & pm, + const wxString & path, wxString &errMsg) { + errMsg.clear(); const LilvPlugin *plug = GetPlugin(path); if (!plug) { diff --git a/src/effects/lv2/LoadLV2.h b/src/effects/lv2/LoadLV2.h index 7d09ad9f2..ea9da07dd 100644 --- a/src/effects/lv2/LoadLV2.h +++ b/src/effects/lv2/LoadLV2.h @@ -90,7 +90,8 @@ public: bool AutoRegisterPlugins(PluginManagerInterface & pm) override; wxArrayString FindPlugins(PluginManagerInterface & pm) override; - bool RegisterPlugin(PluginManagerInterface & pm, const wxString & path) override; + bool RegisterPlugin(PluginManagerInterface & pm, + const wxString & path, wxString &errMsg) override; bool IsPluginValid(const wxString & path, bool bFast) override; diff --git a/src/effects/nyquist/LoadNyquist.cpp b/src/effects/nyquist/LoadNyquist.cpp index 6de3d510c..a4e1c8588 100644 --- a/src/effects/nyquist/LoadNyquist.cpp +++ b/src/effects/nyquist/LoadNyquist.cpp @@ -165,10 +165,12 @@ bool NyquistEffectsModule::AutoRegisterPlugins(PluginManagerInterface & pm) // Audacity. A little simplistic, but it should suffice for now. wxArrayString pathList = NyquistEffect::GetNyquistSearchPath(); wxArrayString files; + wxString ignoredErrMsg; if (!pm.IsPluginRegistered(NYQUIST_PROMPT_ID)) { - RegisterPlugin(pm, NYQUIST_PROMPT_ID); + // No checking of error ? + RegisterPlugin(pm, NYQUIST_PROMPT_ID, ignoredErrMsg); } for (size_t i = 0; i < WXSIZEOF(kShippedEffects); i++) @@ -179,7 +181,8 @@ bool NyquistEffectsModule::AutoRegisterPlugins(PluginManagerInterface & pm) { if (!pm.IsPluginRegistered(files[j])) { - RegisterPlugin(pm, files[j]); + // No checking of error ? + RegisterPlugin(pm, files[j], ignoredErrMsg); } } } @@ -204,8 +207,11 @@ wxArrayString NyquistEffectsModule::FindPlugins(PluginManagerInterface & pm) return files; } -bool NyquistEffectsModule::RegisterPlugin(PluginManagerInterface & pm, const wxString & path) +bool NyquistEffectsModule::RegisterPlugin(PluginManagerInterface & pm, + const wxString & path, + wxString &errMsg) { + errMsg.clear(); NyquistEffect effect(path); if (effect.IsOk()) { diff --git a/src/effects/nyquist/LoadNyquist.h b/src/effects/nyquist/LoadNyquist.h index f4024eab0..81da38c1b 100644 --- a/src/effects/nyquist/LoadNyquist.h +++ b/src/effects/nyquist/LoadNyquist.h @@ -40,7 +40,8 @@ public: bool AutoRegisterPlugins(PluginManagerInterface & pm) override; wxArrayString FindPlugins(PluginManagerInterface & pm) override; - bool RegisterPlugin(PluginManagerInterface & pm, const wxString & path) override; + bool RegisterPlugin(PluginManagerInterface & pm, + const wxString & path, wxString &errMsg) override; bool IsPluginValid(const wxString & path, bool bFast) override; diff --git a/src/effects/vamp/LoadVamp.cpp b/src/effects/vamp/LoadVamp.cpp index 326c31f69..bd186a72d 100644 --- a/src/effects/vamp/LoadVamp.cpp +++ b/src/effects/vamp/LoadVamp.cpp @@ -199,8 +199,10 @@ wxArrayString VampEffectsModule::FindPlugins(PluginManagerInterface & WXUNUSED(p return names; } -bool VampEffectsModule::RegisterPlugin(PluginManagerInterface & pm, const wxString & path) +bool VampEffectsModule::RegisterPlugin(PluginManagerInterface & pm, + const wxString & path, wxString &errMsg) { + errMsg.clear(); int output; bool hasParameters; diff --git a/src/effects/vamp/LoadVamp.h b/src/effects/vamp/LoadVamp.h index eb5d01ba7..f24fd8fe5 100644 --- a/src/effects/vamp/LoadVamp.h +++ b/src/effects/vamp/LoadVamp.h @@ -44,7 +44,8 @@ public: bool AutoRegisterPlugins(PluginManagerInterface & pm) override; wxArrayString FindPlugins(PluginManagerInterface & pm) override; - bool RegisterPlugin(PluginManagerInterface & pm, const wxString & path) override; + bool RegisterPlugin(PluginManagerInterface & pm, + const wxString & path, wxString &errMsg) override; bool IsPluginValid(const wxString & path, bool bFast) override;