From a8311a7b4945055c62f9730f5a601e992473ca58 Mon Sep 17 00:00:00 2001 From: Lukas W Date: Fri, 10 Nov 2017 08:02:29 +0100 Subject: [PATCH] Vst: Fix widget deletion --- plugins/VstEffect/VstEffect.cpp | 29 ++++------------------ plugins/VstEffect/VstEffect.h | 7 +++--- plugins/VstEffect/VstEffectControlDialog.h | 3 ++- plugins/vst_base/VstPlugin.cpp | 2 ++ 4 files changed, 13 insertions(+), 28 deletions(-) diff --git a/plugins/VstEffect/VstEffect.cpp b/plugins/VstEffect/VstEffect.cpp index 88e37ea92..494613e26 100644 --- a/plugins/VstEffect/VstEffect.cpp +++ b/plugins/VstEffect/VstEffect.cpp @@ -55,7 +55,6 @@ Plugin::Descriptor PLUGIN_EXPORT vsteffect_plugin_descriptor = VstEffect::VstEffect( Model * _parent, const Descriptor::SubPluginFeatures::Key * _key ) : Effect( &vsteffect_plugin_descriptor, _parent, _key ), - m_plugin( NULL ), m_pluginMutex(), m_key( *_key ), m_vstControls( this ) @@ -73,7 +72,6 @@ VstEffect::VstEffect( Model * _parent, VstEffect::~VstEffect() { - closePlugin(); } @@ -128,22 +126,20 @@ void VstEffect::openPlugin( const QString & _plugin ) VstPlugin::tr( "Loading plugin" ), VstPlugin::tr( "Please wait while loading VST plugin..." ), PLUGIN_NAME::getIconPixmap( "logo", 24, 24 ), 0 ); - m_pluginMutex.lock(); - m_plugin = new VstPlugin( _plugin ); + + QMutexLocker ml( &m_pluginMutex ); Q_UNUSED( ml ); + m_plugin.reset(new VstPlugin( _plugin )); if( m_plugin->failed() ) { - m_pluginMutex.unlock(); - closePlugin(); + m_plugin.reset(nullptr); delete tf; collectErrorForUI( VstPlugin::tr( "The VST plugin %1 could not be loaded." ).arg( _plugin ) ); return; } - VstPlugin::connect( Engine::getSong(), SIGNAL( tempoChanged( bpm_t ) ), m_plugin, SLOT( setTempo( bpm_t ) ) ); + VstPlugin::connect( Engine::getSong(), SIGNAL( tempoChanged( bpm_t ) ), m_plugin.data(), SLOT( setTempo( bpm_t ) ) ); m_plugin->setTempo( Engine::getSong()->getTempo() ); - m_pluginMutex.unlock(); - delete tf; m_key.attributes["file"] = _plugin; @@ -151,21 +147,6 @@ void VstEffect::openPlugin( const QString & _plugin ) -void VstEffect::closePlugin() -{ - m_pluginMutex.lock(); - if( m_plugin && m_plugin->pluginWidget() != NULL ) - { - delete m_plugin->pluginWidget(); - } - delete m_plugin; - m_plugin = NULL; - m_pluginMutex.unlock(); -} - - - - extern "C" { diff --git a/plugins/VstEffect/VstEffect.h b/plugins/VstEffect/VstEffect.h index b678367d5..95834e862 100644 --- a/plugins/VstEffect/VstEffect.h +++ b/plugins/VstEffect/VstEffect.h @@ -25,13 +25,14 @@ #ifndef _VST_EFFECT_H #define _VST_EFFECT_H -#include +#include +#include #include "Effect.h" -#include "VstPlugin.h" #include "VstEffectControlDialog.h" #include "VstEffectControls.h" +class VstPlugin; class VstEffect : public Effect { @@ -58,7 +59,7 @@ private: void openPlugin( const QString & _plugin ); void closePlugin(); - VstPlugin * m_plugin; + QSharedPointer m_plugin; QMutex m_pluginMutex; EffectKey m_key; diff --git a/plugins/VstEffect/VstEffectControlDialog.h b/plugins/VstEffect/VstEffectControlDialog.h index ae86315ab..ddbbef878 100644 --- a/plugins/VstEffect/VstEffectControlDialog.h +++ b/plugins/VstEffect/VstEffectControlDialog.h @@ -31,6 +31,7 @@ #include #include #include +#include class VstEffectControls; @@ -59,7 +60,7 @@ private: PixmapButton * m_managePluginButton; PixmapButton * m_savePresetButton; - VstPlugin * m_plugin; + QSharedPointer m_plugin; QLabel * tbLabel; diff --git a/plugins/vst_base/VstPlugin.cpp b/plugins/vst_base/VstPlugin.cpp index 35621bb98..518494eab 100644 --- a/plugins/vst_base/VstPlugin.cpp +++ b/plugins/vst_base/VstPlugin.cpp @@ -130,6 +130,8 @@ VstPlugin::VstPlugin( const QString & _plugin ) : VstPlugin::~VstPlugin() { + delete m_pluginSubWindow; + delete m_pluginWidget; }