1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-11-21 16:37:12 +01:00

Fix for bug #857

Even though this is only a P2, I felt it would be
quite bothersome for the users and might cause some
confusion.

The problem was the the wxLocale was being deleted
before all usage of it was complete.  The fix was
to explicitly delete the plugin and module managers.
This commit is contained in:
lllucius@gmail.com
2015-02-12 02:30:30 +00:00
parent c88c1738bb
commit e73b7e70a3
5 changed files with 39 additions and 10 deletions

View File

@@ -1908,6 +1908,10 @@ int AudacityApp::OnExit()
// Terminate the PluginManager (must be done before deleting the locale) // Terminate the PluginManager (must be done before deleting the locale)
PluginManager::Get().Terminate(); PluginManager::Get().Terminate();
// Done with plugins and modules
PluginManager::Destroy();
ModuleManager::Destroy();
if (mLocale) if (mLocale)
delete mLocale; delete mLocale;

View File

@@ -178,7 +178,7 @@ void * Module::GetSymbol(wxString name)
// ============================================================================ // ============================================================================
// The one and only ModuleManager // The one and only ModuleManager
ModuleManager ModuleManager::mInstance; ModuleManager *ModuleManager::mInstance = NULL;
// Provide builtin modules a means to identify themselves // Provide builtin modules a means to identify themselves
static wxArrayPtrVoid *pBuiltinModuleList = NULL; static wxArrayPtrVoid *pBuiltinModuleList = NULL;
@@ -358,7 +358,21 @@ int ModuleManager::Dispatch(ModuleDispatchTypes type)
// ============================================================================ // ============================================================================
ModuleManager & ModuleManager::Get() ModuleManager & ModuleManager::Get()
{ {
return mInstance; if (!mInstance)
{
mInstance = new ModuleManager();
}
return *mInstance;
}
void ModuleManager::Destroy()
{
if (mInstance)
{
delete mInstance;
mInstance = NULL;
}
} }
bool ModuleManager::DiscoverProviders() bool ModuleManager::DiscoverProviders()

View File

@@ -82,6 +82,7 @@ public:
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
static ModuleManager & Get(); static ModuleManager & Get();
static void Destroy();
void Initialize(CommandHandler & cmdHandler); void Initialize(CommandHandler & cmdHandler);
int Dispatch(ModuleDispatchTypes type); int Dispatch(ModuleDispatchTypes type);
@@ -106,7 +107,7 @@ private:
void UnloadModule(ModuleInterface *module); void UnloadModule(ModuleInterface *module);
private: private:
static ModuleManager mInstance; static ModuleManager *mInstance;
ModuleMainMap mModuleMains; ModuleMainMap mModuleMains;
ModuleMap mDynModules; ModuleMap mDynModules;

View File

@@ -1360,7 +1360,7 @@ bool PluginManager::RemovePrivateConfig(const PluginID & ID, const wxString & gr
// ============================================================================ // ============================================================================
// The one and only PluginManager // The one and only PluginManager
PluginManager PluginManager::mInstance; PluginManager *PluginManager::mInstance = NULL;
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// Creation/Destruction // Creation/Destruction
@@ -1392,7 +1392,20 @@ PluginManager::~PluginManager()
PluginManager & PluginManager::Get() PluginManager & PluginManager::Get()
{ {
return mInstance; if (!mInstance)
{
mInstance = new PluginManager();
}
return *mInstance;
}
void PluginManager::Destroy()
{
if (mInstance)
{
delete mInstance;
}
} }
void PluginManager::Initialize() void PluginManager::Initialize()
@@ -1947,10 +1960,6 @@ const PluginDescriptor *PluginManager::GetFirstPluginForEffectType(EffectType ty
PluginDescriptor & plug = mPluginsIter->second; PluginDescriptor & plug = mPluginsIter->second;
bool familyEnabled; bool familyEnabled;
if (type == PluginTypeEffect)
{
gPrefs->Read(plug.GetEffectFamily() + wxT("/Enable"), &familyEnabled, true);
}
gPrefs->Read(plug.GetEffectFamily() + wxT("/Enable"), &familyEnabled, true); gPrefs->Read(plug.GetEffectFamily() + wxT("/Enable"), &familyEnabled, true);
if (plug.IsValid() && plug.IsEnabled() && plug.GetEffectType() == type && familyEnabled) if (plug.IsValid() && plug.IsEnabled() && plug.GetEffectType() == type && familyEnabled)
{ {

View File

@@ -226,6 +226,7 @@ public:
void Terminate(); void Terminate();
static PluginManager & Get(); static PluginManager & Get();
static void Destroy();
static PluginID GetID(ModuleInterface *module); static PluginID GetID(ModuleInterface *module);
static PluginID GetID(EffectIdentInterface *effect); static PluginID GetID(EffectIdentInterface *effect);
@@ -301,7 +302,7 @@ private:
int b64decode(wxString in, void *out); int b64decode(wxString in, void *out);
private: private:
static PluginManager mInstance; static PluginManager *mInstance;
bool IsDirty(); bool IsDirty();
void SetDirty(bool dirty = true); void SetDirty(bool dirty = true);