From 0d80f0c569cd72e748c6e19395e603596dfeaea8 Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Mon, 26 Nov 2012 19:30:26 +0100 Subject: [PATCH] VstPlugin, RemoteVstPlugin: save/restore current program of VST plugin Not all plugins save current program in their chunk (or do not restore it properly). We therefore have to save and restore the current program manually. Closes #3581879. --- plugins/vst_base/RemoteVstPlugin.cpp | 4 ++++ plugins/vst_base/VstPlugin.cpp | 25 ++++++++++++++++++++++++- plugins/vst_base/VstPlugin.h | 2 ++ plugins/vst_base/communication.h | 1 + 4 files changed, 31 insertions(+), 1 deletion(-) diff --git a/plugins/vst_base/RemoteVstPlugin.cpp b/plugins/vst_base/RemoteVstPlugin.cpp index 17405d655..dcffaf996 100644 --- a/plugins/vst_base/RemoteVstPlugin.cpp +++ b/plugins/vst_base/RemoteVstPlugin.cpp @@ -419,6 +419,10 @@ bool RemoteVstPlugin::processMessage( const message & _m ) sendMessage( IdVstSetProgram ); break; + case IdVstCurrentProgram: + sendMessage( message( IdVstCurrentProgram ).addInt( m_currentProgram ) ); + break; + case IdVstRotateProgram: rotateProgram( _m.getInt( 0 ) ); sendMessage( IdVstRotateProgram ); diff --git a/plugins/vst_base/VstPlugin.cpp b/plugins/vst_base/VstPlugin.cpp index ad9e1cdde..7c828fcc0 100644 --- a/plugins/vst_base/VstPlugin.cpp +++ b/plugins/vst_base/VstPlugin.cpp @@ -90,7 +90,8 @@ VstPlugin::VstPlugin( const QString & _plugin ) : m_productString(), m_currentProgramName(), m_allProgramNames(), - p_name() + p_name(), + m_currentProgram() { setSplittedChannels( true ); @@ -279,6 +280,10 @@ void VstPlugin::loadSettings( const QDomElement & _this ) setParameterDump( dump ); } + if( _this.hasAttribute( "program" ) ) + { + setProgram( _this.attribute( "program" ).toInt() ); + } } @@ -309,6 +314,8 @@ void VstPlugin::saveSettings( QDomDocument & _doc, QDomElement & _this ) _this.setAttribute( it.key(), it.value() ); } } + + _this.setAttribute( "program", currentProgram() ); } @@ -335,6 +342,18 @@ void VstPlugin::updateSampleRate() +int VstPlugin::currentProgram() +{ + lock(); + sendMessage( message( IdVstCurrentProgram ) ); + waitForMessage( IdVstCurrentProgram ); + unlock(); + + return m_currentProgram; +} + + + const QMap & VstPlugin::parameterDump() { lock(); @@ -406,6 +425,10 @@ bool VstPlugin::processMessage( const message & _m ) m_productString = _m.getQString(); break; + case IdVstCurrentProgram: + m_currentProgram = _m.getInt(); + break; + case IdVstCurrentProgramName: m_currentProgramName = _m.getQString(); break; diff --git a/plugins/vst_base/VstPlugin.h b/plugins/vst_base/VstPlugin.h index 2dcbbf34a..157788f83 100644 --- a/plugins/vst_base/VstPlugin.h +++ b/plugins/vst_base/VstPlugin.h @@ -145,6 +145,8 @@ private: QMap m_parameterDump; + int m_currentProgram; + } ; diff --git a/plugins/vst_base/communication.h b/plugins/vst_base/communication.h index bc46a8e65..cc6133b68 100644 --- a/plugins/vst_base/communication.h +++ b/plugins/vst_base/communication.h @@ -65,6 +65,7 @@ enum VstRemoteMessageIDs IdVstSetParameterDump, IdVstGetParameterProperties, IdVstProgramNames, + IdVstCurrentProgram, IdVstCurrentProgramName, IdVstSetProgram, IdVstRotateProgram,