From c200a024ac1e4e856b25767c137a98c72282bbec Mon Sep 17 00:00:00 2001 From: ibuki2003 Date: Fri, 15 Nov 2019 18:27:32 +0900 Subject: [PATCH 01/12] Add getting parameter text --- include/aeffectx.h | 2 ++ plugins/vst_base/RemoteVstPlugin.cpp | 52 ++++++++++++++++++++++++++++ plugins/vst_base/VstPlugin.cpp | 30 ++++++++++++++++ plugins/vst_base/VstPlugin.h | 14 ++++++++ plugins/vst_base/communication.h | 2 ++ 5 files changed, 100 insertions(+) diff --git a/include/aeffectx.h b/include/aeffectx.h index 133d925acd8..b7a78dfad2b 100644 --- a/include/aeffectx.h +++ b/include/aeffectx.h @@ -97,6 +97,8 @@ const int effClose = 1; // currently unused const int effSetProgram = 2; // currently unused const int effGetProgram = 3; // currently unused const int effGetProgramName = 5; // currently unused +const int effGetParamLabel = 6; +const int effGetParamDisplay = 7; const int effGetParamName = 8; // currently unused const int effSetSampleRate = 10; const int effSetBlockSize = 11; diff --git a/plugins/vst_base/RemoteVstPlugin.cpp b/plugins/vst_base/RemoteVstPlugin.cpp index 5b4bbbd9b5e..d526fa053bb 100644 --- a/plugins/vst_base/RemoteVstPlugin.cpp +++ b/plugins/vst_base/RemoteVstPlugin.cpp @@ -70,6 +70,7 @@ #include #include #include +#include #include @@ -223,6 +224,10 @@ class RemoteVstPlugin : public RemotePluginClient // determine name of current program const char * programName(); + void getParameterDisplays(); + + void getParameterLabels(); + // send name of current program back to host void sendCurrentProgramName(); @@ -660,6 +665,14 @@ bool RemoteVstPlugin::processMessage( const message & _m ) //sendMessage( IdVstSetParameter ); break; + case IdVstParameterDisplays: + getParameterDisplays(); + break; + + case IdVstParameterLabels: + getParameterLabels(); + break; + case IdVstIdleUpdate: { @@ -1068,6 +1081,45 @@ const char * RemoteVstPlugin::programName() + +void RemoteVstPlugin::getParameterDisplays() +{ + std::string presName; + static char buf[9]; + for (int i=0; i< m_plugin->numParams; ++i) + { + memset( buf, 0, sizeof( buf ) ); + pluginDispatch( effGetParamDisplay, i, 0, buf ); + buf[8] = 0; + if (i != 0) presName += '|'; + presName += buf; + } + + sendMessage( message( IdVstParameterDisplays ).addString( presName.c_str() ) ); +} + + + + +void RemoteVstPlugin::getParameterLabels() +{ + std::string presName; + static char buf[9]; + for (int i=0; i< m_plugin->numParams; ++i) + { + memset( buf, 0, sizeof( buf ) ); + pluginDispatch( effGetParamLabel, i, 0, buf ); + buf[8] = 0; + if (i != 0) presName += '|'; + presName += buf; + } + + sendMessage( message( IdVstParameterLabels ).addString( presName.c_str() ) ); +} + + + + void RemoteVstPlugin::sendCurrentProgramName() { char presName[64]; diff --git a/plugins/vst_base/VstPlugin.cpp b/plugins/vst_base/VstPlugin.cpp index 8d86f576f33..cd4844b8128 100644 --- a/plugins/vst_base/VstPlugin.cpp +++ b/plugins/vst_base/VstPlugin.cpp @@ -438,6 +438,14 @@ bool VstPlugin::processMessage( const message & _m ) m_allProgramNames = _m.getQString(); break; + case IdVstParameterLabels: + m_allParameterLabels = _m.getQString(); + break; + + case IdVstParameterDisplays: + m_allParameterDisplays = _m.getQString(); + break; + case IdVstPluginUniqueID: // TODO: display graphically in case of failure printf("unique ID: %s\n", _m.getString().c_str() ); @@ -531,6 +539,28 @@ void VstPlugin::loadProgramNames() +void VstPlugin::loadParameterLabels() +{ + lock(); + sendMessage( message( IdVstParameterLabels ) ); + waitForMessage( IdVstParameterLabels, true ); + unlock(); +} + + + + +void VstPlugin::loadParameterDisplays() +{ + lock(); + sendMessage( message( IdVstParameterDisplays ) ); + waitForMessage( IdVstParameterDisplays, true ); + unlock(); +} + + + + void VstPlugin::savePreset( ) { QString presName = currentProgramName().isEmpty() ? tr(": default") : currentProgramName(); diff --git a/plugins/vst_base/VstPlugin.h b/plugins/vst_base/VstPlugin.h index 26e7fec369a..e05031256eb 100644 --- a/plugins/vst_base/VstPlugin.h +++ b/plugins/vst_base/VstPlugin.h @@ -91,6 +91,16 @@ class VSTBASE_EXPORT VstPlugin : public RemotePlugin, public JournallingObject return m_allProgramNames; } + inline const QString& allParameterLabels() const + { + return m_allParameterLabels; + } + + inline const QString& allParameterDisplays() const + { + return m_allParameterDisplays; + } + int currentProgram(); const QMap & parameterDump(); @@ -120,6 +130,8 @@ public slots: void setProgram( int index ); void rotateProgram( int offset ); void loadProgramNames(); + void loadParameterLabels(); + void loadParameterDisplays(); void savePreset( void ); void setParam( int i, float f ); void idleUpdate(); @@ -148,6 +160,8 @@ public slots: QString m_productString; QString m_currentProgramName; QString m_allProgramNames; + QString m_allParameterLabels; + QString m_allParameterDisplays; QString p_name; diff --git a/plugins/vst_base/communication.h b/plugins/vst_base/communication.h index 756fd75573e..c25b213d18d 100644 --- a/plugins/vst_base/communication.h +++ b/plugins/vst_base/communication.h @@ -67,6 +67,8 @@ enum VstRemoteMessageIDs IdVstSetProgram, IdVstRotateProgram, IdVstIdleUpdate, + IdVstParameterDisplays, + IdVstParameterLabels, // remoteVstPlugin -> vstPlugin IdVstFailedLoadingPlugin, From 9f43b843b91f00f5785ca06026d0649b586e92a6 Mon Sep 17 00:00:00 2001 From: ibuki2003 Date: Fri, 15 Nov 2019 18:29:21 +0900 Subject: [PATCH 02/12] Add CustomTextKnob --- include/CustomTextKnob.h | 37 +++++++++++++++++++++++++++++++++++++ include/Knob.h | 2 +- 2 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 include/CustomTextKnob.h diff --git a/include/CustomTextKnob.h b/include/CustomTextKnob.h new file mode 100644 index 00000000000..b57de1ce5ab --- /dev/null +++ b/include/CustomTextKnob.h @@ -0,0 +1,37 @@ +/* Text customizable knob */ +#ifndef CUSTOM_TEXT_KNOB_H +#define CUSTOM_TEXT_KNOB_H + +#include "Knob.h" + +class LMMS_EXPORT CustomTextKnob : public Knob +{ +protected: + inline void setHintText( const QString & _txt_before, const QString & _txt_after ) {} // inaccessible +public: + CustomTextKnob( knobTypes _knob_num, QWidget * _parent = NULL, const QString & _name = QString(), const QString & _value_text = QString() ) : + Knob( _knob_num, _parent, _name ), + m_value_text( _value_text ) {} + + CustomTextKnob( QWidget * _parent = NULL, const QString & _name = QString(), const QString & _value_text = QString() ) : //!< default ctor + Knob( _parent, _name ), + m_value_text( _value_text ) {} + + CustomTextKnob( const Knob& other ) = delete; + + inline void setValueText(const QString & _value_text) + { + m_value_text = _value_text; + } + +private: + virtual QString displayValue() const + { + return m_description.trimmed() + m_value_text; + } + +protected: + QString m_value_text; +} ; + +#endif diff --git a/include/Knob.h b/include/Knob.h index 4f806473118..0bba58afd44 100644 --- a/include/Knob.h +++ b/include/Knob.h @@ -143,7 +143,7 @@ private slots: void toggleScale(); private: - QString displayValue() const; + virtual QString displayValue() const; void doConnections() override; From 7bfd9c1390d0f85d48602127dc6d2643bf53ae45 Mon Sep 17 00:00:00 2001 From: ibuki2003 Date: Fri, 15 Nov 2019 18:29:58 +0900 Subject: [PATCH 03/12] Replace Knob raw value with VST Parameter string --- plugins/vestige/vestige.cpp | 29 ++++++++++++++++++++++++++--- plugins/vestige/vestige.h | 5 +++-- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/plugins/vestige/vestige.cpp b/plugins/vestige/vestige.cpp index fc61a248441..dc4e77d1a1b 100644 --- a/plugins/vestige/vestige.cpp +++ b/plugins/vestige/vestige.cpp @@ -38,6 +38,9 @@ #include #include +#include +#include + #include "ConfigManager.h" #include "BufferManager.h" #include "ConfigManager.h" @@ -951,7 +954,7 @@ manageVestigeInstrumentView::manageVestigeInstrumentView( Instrument * _instrume const QMap & dump = m_vi->m_plugin->parameterDump(); m_vi->paramCount = dump.size(); - vstKnobs = new Knob *[ m_vi->paramCount ]; + vstKnobs = new CustomTextKnob *[ m_vi->paramCount ]; bool hasKnobModel = true; if (m_vi->knobFModel == NULL) { @@ -967,8 +970,8 @@ manageVestigeInstrumentView::manageVestigeInstrumentView( Instrument * _instrume sprintf( paramStr, "param%d", i); s_dumpValues = dump[ paramStr ].split( ":" ); - vstKnobs[ i ] = new Knob( knobBright_26, this, s_dumpValues.at( 1 ) ); - vstKnobs[ i ]->setHintText( s_dumpValues.at( 1 ) + ":", "" ); + vstKnobs[ i ] = new CustomTextKnob( knobBright_26, this, s_dumpValues.at( 1 ) ); + vstKnobs[ i ]->setDescription( s_dumpValues.at( 1 ) + ":" ); vstKnobs[ i ]->setLabel( s_dumpValues.at( 1 ).left( 15 ) ); if( !hasKnobModel ) @@ -983,6 +986,7 @@ manageVestigeInstrumentView::manageVestigeInstrumentView( Instrument * _instrume [this, model]() { setParameter( model ); }, Qt::DirectConnection); vstKnobs[i] ->setModel( model ); } + syncParameterText(); int i = 0; for( int lrow = 1; lrow < ( int( m_vi->paramCount / 10 ) + 1 ) + 1; lrow++ ) @@ -1043,6 +1047,7 @@ void manageVestigeInstrumentView::syncPlugin( void ) m_vi->knobFModel[ i ]->setInitValue( f_value ); } } + syncParameterText(); } @@ -1118,6 +1123,24 @@ void manageVestigeInstrumentView::setParameter( Model * action ) if ( m_vi->m_plugin != NULL ) { m_vi->m_plugin->setParam( knobUNID, m_vi->knobFModel[knobUNID]->value() ); + syncParameterText(); + } +} + +void manageVestigeInstrumentView::syncParameterText() +{ + m_vi->m_plugin->loadParameterLabels(); + m_vi->m_plugin->loadParameterDisplays(); + + QString paramLabelStr = m_vi->m_plugin->allParameterLabels(); + QString paramDisplayStr = m_vi->m_plugin->allParameterDisplays(); + + QStringList paramLabelList = paramLabelStr.split("|"); + QStringList paramDisplayList = paramDisplayStr.split("|"); + + for( int i = 0; i < paramLabelList.size(); ++i ) + { + vstKnobs[i]->setValueText(paramDisplayList[i] + ' ' + paramLabelList[i]); } } diff --git a/plugins/vestige/vestige.h b/plugins/vestige/vestige.h index 7090fee1e29..ae4f803cf14 100644 --- a/plugins/vestige/vestige.h +++ b/plugins/vestige/vestige.h @@ -34,7 +34,7 @@ #include "Instrument.h" #include "InstrumentView.h" #include "Note.h" -#include "Knob.h" +#include "CustomTextKnob.h" #include "SubWindow.h" #include "AutomatableModel.h" @@ -109,6 +109,7 @@ protected slots: void syncPlugin( void ); void displayAutomatedOnly( void ); void setParameter( Model * action ); + void syncParameterText(); void closeWindow(); @@ -128,7 +129,7 @@ protected slots: QPushButton * m_syncButton; QPushButton * m_displayAutomatedOnly; QPushButton * m_closeButton; - Knob ** vstKnobs; + CustomTextKnob ** vstKnobs; } ; From 2c1223650fbf4a3e6a0524b42dce436aa266e993 Mon Sep 17 00:00:00 2001 From: ibuki2003 Date: Sat, 16 Nov 2019 01:32:12 +0900 Subject: [PATCH 04/12] remove unused including --- plugins/vestige/vestige.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/plugins/vestige/vestige.cpp b/plugins/vestige/vestige.cpp index dc4e77d1a1b..46489dd1f25 100644 --- a/plugins/vestige/vestige.cpp +++ b/plugins/vestige/vestige.cpp @@ -38,7 +38,6 @@ #include #include -#include #include #include "ConfigManager.h" From 1c7e160561cf87168c04c69ff18ab190a9c79891 Mon Sep 17 00:00:00 2001 From: ibuki2003 Date: Sat, 16 Nov 2019 02:59:55 +0900 Subject: [PATCH 05/12] split methods into cpp file --- include/CustomTextKnob.h | 13 +++---------- src/gui/CMakeLists.txt | 1 + src/gui/widgets/CustomTextKnob.cpp | 14 ++++++++++++++ 3 files changed, 18 insertions(+), 10 deletions(-) create mode 100644 src/gui/widgets/CustomTextKnob.cpp diff --git a/include/CustomTextKnob.h b/include/CustomTextKnob.h index b57de1ce5ab..baaf8820599 100644 --- a/include/CustomTextKnob.h +++ b/include/CustomTextKnob.h @@ -9,13 +9,9 @@ class LMMS_EXPORT CustomTextKnob : public Knob protected: inline void setHintText( const QString & _txt_before, const QString & _txt_after ) {} // inaccessible public: - CustomTextKnob( knobTypes _knob_num, QWidget * _parent = NULL, const QString & _name = QString(), const QString & _value_text = QString() ) : - Knob( _knob_num, _parent, _name ), - m_value_text( _value_text ) {} + CustomTextKnob( knobTypes _knob_num, QWidget * _parent = NULL, const QString & _name = QString(), const QString & _value_text = QString() ); - CustomTextKnob( QWidget * _parent = NULL, const QString & _name = QString(), const QString & _value_text = QString() ) : //!< default ctor - Knob( _parent, _name ), - m_value_text( _value_text ) {} + CustomTextKnob( QWidget * _parent = NULL, const QString & _name = QString(), const QString & _value_text = QString() ); //!< default ctor CustomTextKnob( const Knob& other ) = delete; @@ -25,10 +21,7 @@ class LMMS_EXPORT CustomTextKnob : public Knob } private: - virtual QString displayValue() const - { - return m_description.trimmed() + m_value_text; - } + virtual QString displayValue() const; protected: QString m_value_text; diff --git a/src/gui/CMakeLists.txt b/src/gui/CMakeLists.txt index af316fddb01..7f24f9f437b 100644 --- a/src/gui/CMakeLists.txt +++ b/src/gui/CMakeLists.txt @@ -53,6 +53,7 @@ SET(LMMS_SRCS gui/widgets/ControllerRackView.cpp gui/widgets/ControllerView.cpp gui/widgets/CPULoadWidget.cpp + gui/widgets/CustomTextKnob.cpp gui/widgets/EffectRackView.cpp gui/widgets/EffectView.cpp gui/widgets/EnvelopeAndLfoView.cpp diff --git a/src/gui/widgets/CustomTextKnob.cpp b/src/gui/widgets/CustomTextKnob.cpp new file mode 100644 index 00000000000..149b3494be6 --- /dev/null +++ b/src/gui/widgets/CustomTextKnob.cpp @@ -0,0 +1,14 @@ +#include "CustomTextKnob.h" + +CustomTextKnob::CustomTextKnob( knobTypes _knob_num, QWidget * _parent, const QString & _name, const QString & _value_text ) : + Knob( _knob_num, _parent, _name ), + m_value_text( _value_text ) {} + +CustomTextKnob::CustomTextKnob( QWidget * _parent, const QString & _name, const QString & _value_text ) : //!< default ctor + Knob( _parent, _name ), + m_value_text( _value_text ) {} + +QString CustomTextKnob::displayValue() const +{ + return m_description.trimmed() + m_value_text; +} From 6f0ebd5e9b22c82696a8466d80a20b9f6c2a5016 Mon Sep 17 00:00:00 2001 From: ibuki2003 Date: Sat, 16 Nov 2019 05:25:17 +0900 Subject: [PATCH 06/12] Replace Knob with CustomTextKnob on VstEffect --- plugins/VstEffect/VstEffectControls.cpp | 45 ++++++++++++++++--------- plugins/VstEffect/VstEffectControls.h | 5 +-- 2 files changed, 32 insertions(+), 18 deletions(-) diff --git a/plugins/VstEffect/VstEffectControls.cpp b/plugins/VstEffect/VstEffectControls.cpp index a0f97ce715e..5224aa63372 100644 --- a/plugins/VstEffect/VstEffectControls.cpp +++ b/plugins/VstEffect/VstEffectControls.cpp @@ -162,7 +162,7 @@ void VstEffectControls::managePlugin( void ) manageVSTEffectView * tt = new manageVSTEffectView( m_effect, this); ctrHandle = (QObject *)tt; } else if (m_subWindow != NULL) { - if (m_subWindow->widget()->isVisible() == false ) { + if (m_subWindow->widget()->isVisible() == false ) { m_scrollArea->show(); m_subWindow->show(); } else { @@ -308,7 +308,7 @@ manageVSTEffectView::manageVSTEffectView( VstEffect * _eff, VstEffectControls * m_vi->m_scrollArea = new QScrollArea( widget ); l = new QGridLayout( widget ); - m_vi->m_subWindow = gui->mainWindow()->addWindowedWidget(NULL, Qt::SubWindow | + m_vi->m_subWindow = gui->mainWindow()->addWindowedWidget(NULL, Qt::SubWindow | Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowSystemMenuHint); m_vi->m_subWindow->setSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed ); m_vi->m_subWindow->setFixedSize( 960, 300); @@ -350,7 +350,7 @@ manageVSTEffectView::manageVSTEffectView( VstEffect * _eff, VstEffectControls * const QMap & dump = m_effect->m_plugin->parameterDump(); m_vi->paramCount = dump.size(); - vstKnobs = new Knob *[ m_vi->paramCount ]; + vstKnobs = new CustomTextKnob *[ m_vi->paramCount ]; bool hasKnobModel = true; if (m_vi->knobFModel == NULL) { @@ -366,8 +366,8 @@ manageVSTEffectView::manageVSTEffectView( VstEffect * _eff, VstEffectControls * sprintf( paramStr, "param%d", i); s_dumpValues = dump[ paramStr ].split( ":" ); - vstKnobs[ i ] = new Knob( knobBright_26, widget, s_dumpValues.at( 1 ) ); - vstKnobs[ i ]->setHintText( s_dumpValues.at( 1 ) + ":", "" ); + vstKnobs[ i ] = new CustomTextKnob( knobBright_26, widget, s_dumpValues.at( 1 ) ); + vstKnobs[ i ]->setDescription( s_dumpValues.at( 1 ) + ":" ); vstKnobs[ i ]->setLabel( s_dumpValues.at( 1 ).left( 15 ) ); if( !hasKnobModel ) @@ -382,6 +382,7 @@ manageVSTEffectView::manageVSTEffectView( VstEffect * _eff, VstEffectControls * [this, model]() { setParameter( model ); }, Qt::DirectConnection); vstKnobs[ i ] ->setModel( model ); } + syncParameterText(); int i = 0; for( int lrow = 1; lrow < ( int( m_vi->paramCount / 10 ) + 1 ) + 1; lrow++ ) @@ -444,6 +445,7 @@ void manageVSTEffectView::syncPlugin( void ) m_vi2->knobFModel[ i ]->setInitValue( f_value ); } } + syncParameterText(); } @@ -462,7 +464,7 @@ void manageVSTEffectView::displayAutomatedOnly( void ) { vstKnobs[ i ]->hide(); m_displayAutomatedOnly->setText( "All" ); - } else { + } else { vstKnobs[ i ]->show(); m_displayAutomatedOnly->setText( "Automated" ); } @@ -479,16 +481,33 @@ void manageVSTEffectView::setParameter( Model * action ) if ( m_effect->m_plugin != NULL ) { m_effect->m_plugin->setParam( knobUNID, m_vi2->knobFModel[knobUNID]->value() ); + syncParameterText(); } } +void manageVSTEffectView::syncParameterText() +{ + m_effect->m_plugin->loadParameterLabels(); + m_effect->m_plugin->loadParameterDisplays(); + + QString paramLabelStr = m_effect->m_plugin->allParameterLabels(); + QString paramDisplayStr = m_effect->m_plugin->allParameterDisplays(); + + QStringList paramLabelList = paramLabelStr.split("|"); + QStringList paramDisplayList = paramDisplayStr.split("|"); + + for( int i = 0; i < paramLabelList.size(); ++i ) + { + vstKnobs[i]->setValueText(paramDisplayList[i] + ' ' + paramLabelList[i]); + } +} manageVSTEffectView::~manageVSTEffectView() { if( m_vi2->knobFModel != NULL ) - { + { for( int i = 0; i < m_vi2->paramCount; i++ ) { delete m_vi2->knobFModel[ i ]; @@ -507,18 +526,18 @@ manageVSTEffectView::~manageVSTEffectView() delete [] m_vi2->knobFModel; m_vi2->knobFModel = NULL; } - + if( m_vi2->m_scrollArea != NULL ) { delete m_vi2->m_scrollArea; m_vi2->m_scrollArea = NULL; } - + if( m_vi2->m_subWindow != NULL ) { m_vi2->m_subWindow->setAttribute( Qt::WA_DeleteOnClose ); m_vi2->m_subWindow->close(); - + if( m_vi2->m_subWindow != NULL ) { delete m_vi2->m_subWindow; @@ -528,9 +547,3 @@ manageVSTEffectView::~manageVSTEffectView() //delete m_vi2->m_subWindow; //m_vi2->m_subWindow = NULL; } - - - - - - diff --git a/plugins/VstEffect/VstEffectControls.h b/plugins/VstEffect/VstEffectControls.h index 092669f949f..cb98d0f439a 100644 --- a/plugins/VstEffect/VstEffectControls.h +++ b/plugins/VstEffect/VstEffectControls.h @@ -34,7 +34,7 @@ #include #include -#include "Knob.h" +#include "CustomTextKnob.h" #include #include #include @@ -111,6 +111,7 @@ protected slots: void syncPlugin( void ); void displayAutomatedOnly( void ); void setParameter( Model * action ); + void syncParameterText(); void closeWindow(); private: @@ -129,7 +130,7 @@ protected slots: QPushButton * m_syncButton; QPushButton * m_displayAutomatedOnly; QPushButton * m_closeButton; - Knob ** vstKnobs; + CustomTextKnob ** vstKnobs; } ; From 5625a58a515bc084949224b75effb0b6c248df64 Mon Sep 17 00:00:00 2001 From: ibuki2003 Date: Sat, 4 Jan 2020 18:02:30 +0900 Subject: [PATCH 07/12] add comments to cryptic code --- plugins/vst_base/RemoteVstPlugin.cpp | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/plugins/vst_base/RemoteVstPlugin.cpp b/plugins/vst_base/RemoteVstPlugin.cpp index d526fa053bb..a7810b48c3f 100644 --- a/plugins/vst_base/RemoteVstPlugin.cpp +++ b/plugins/vst_base/RemoteVstPlugin.cpp @@ -1081,14 +1081,14 @@ const char * RemoteVstPlugin::programName() - +// join the ParameterDisplays (stringified values without units) and send them to host void RemoteVstPlugin::getParameterDisplays() { std::string presName; - static char buf[9]; + static char buf[9]; // buffer for getting string for (int i=0; i< m_plugin->numParams; ++i) { - memset( buf, 0, sizeof( buf ) ); + memset( buf, 0, sizeof( buf ) ); // fill with '\0' because got string may not to be ended with '\0' pluginDispatch( effGetParamDisplay, i, 0, buf ); buf[8] = 0; if (i != 0) presName += '|'; @@ -1100,14 +1100,14 @@ void RemoteVstPlugin::getParameterDisplays() - +// join the ParameterLabels (units) and send them to host void RemoteVstPlugin::getParameterLabels() { std::string presName; - static char buf[9]; + static char buf[9]; // buffer for getting string for (int i=0; i< m_plugin->numParams; ++i) { - memset( buf, 0, sizeof( buf ) ); + memset( buf, 0, sizeof( buf ) ); // fill with '\0' because got string may not to be ended with '\0' pluginDispatch( effGetParamLabel, i, 0, buf ); buf[8] = 0; if (i != 0) presName += '|'; @@ -1394,7 +1394,7 @@ void RemoteVstPlugin::savePreset( const std::string & _file ) } fclose( stream ); - if ( !chunky ) + if ( !chunky ) delete[] data; delete[] (sBank*)pBank; @@ -1544,7 +1544,7 @@ int RemoteVstPlugin::updateInOutCount() { return 1; } - + if( GetCurrentThreadId() == __processingThreadId ) { debugMessage( "Plugin requested I/O change from processing " @@ -1682,7 +1682,7 @@ intptr_t RemoteVstPlugin::hostCallback( AEffect * _effect, int32_t _opcode, _timeInfo.flags |= kVstTransportCycleActive; } - if( __plugin->m_vstSyncData->ppqPos != + if( __plugin->m_vstSyncData->ppqPos != __plugin->m_in->m_Timestamp ) { _timeInfo.ppqPos = __plugin->m_vstSyncData->ppqPos; @@ -1714,7 +1714,7 @@ intptr_t RemoteVstPlugin::hostCallback( AEffect * _effect, int32_t _opcode, { _timeInfo.flags |= kVstTransportPlaying; } - _timeInfo.barStartPos = ( (int) ( _timeInfo.ppqPos / + _timeInfo.barStartPos = ( (int) ( _timeInfo.ppqPos / ( 4 *__plugin->m_vstSyncData->timeSigNumer / (float) __plugin->m_vstSyncData->timeSigDenom ) ) ) * ( 4 * __plugin->m_vstSyncData->timeSigNumer @@ -2277,4 +2277,3 @@ int main( int _argc, char * * _argv ) return 0; } - From 9bb7ceca0a91e841f020a61f8ba7b5c72fcb62b8 Mon Sep 17 00:00:00 2001 From: ibuki2003 Date: Sat, 4 Jan 2020 18:07:09 +0900 Subject: [PATCH 08/12] remove minor style changes --- plugins/VstEffect/VstEffectControls.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/plugins/VstEffect/VstEffectControls.cpp b/plugins/VstEffect/VstEffectControls.cpp index 5224aa63372..761273f7cb8 100644 --- a/plugins/VstEffect/VstEffectControls.cpp +++ b/plugins/VstEffect/VstEffectControls.cpp @@ -507,37 +507,37 @@ void manageVSTEffectView::syncParameterText() manageVSTEffectView::~manageVSTEffectView() { if( m_vi2->knobFModel != NULL ) - { + { for( int i = 0; i < m_vi2->paramCount; i++ ) { delete m_vi2->knobFModel[ i ]; delete vstKnobs[ i ]; } } - + if( vstKnobs != NULL ) { delete [] vstKnobs; vstKnobs = NULL; } - + if( m_vi2->knobFModel != NULL ) { delete [] m_vi2->knobFModel; m_vi2->knobFModel = NULL; } - + if( m_vi2->m_scrollArea != NULL ) { delete m_vi2->m_scrollArea; m_vi2->m_scrollArea = NULL; } - + if( m_vi2->m_subWindow != NULL ) { m_vi2->m_subWindow->setAttribute( Qt::WA_DeleteOnClose ); m_vi2->m_subWindow->close(); - + if( m_vi2->m_subWindow != NULL ) { delete m_vi2->m_subWindow; From 98cd5f4e190dbe6f8e6bbf77020201bd1ec43364 Mon Sep 17 00:00:00 2001 From: Shmuel H Date: Sat, 11 Jan 2020 22:27:01 +0200 Subject: [PATCH 09/12] Fixup multiple style changes. --- plugins/VstEffect/VstEffectControls.cpp | 22 ++++++++++++++-------- plugins/vst_base/RemoteVstPlugin.cpp | 9 +++++---- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/plugins/VstEffect/VstEffectControls.cpp b/plugins/VstEffect/VstEffectControls.cpp index 761273f7cb8..17a57e10c89 100644 --- a/plugins/VstEffect/VstEffectControls.cpp +++ b/plugins/VstEffect/VstEffectControls.cpp @@ -162,7 +162,7 @@ void VstEffectControls::managePlugin( void ) manageVSTEffectView * tt = new manageVSTEffectView( m_effect, this); ctrHandle = (QObject *)tt; } else if (m_subWindow != NULL) { - if (m_subWindow->widget()->isVisible() == false ) { + if (m_subWindow->widget()->isVisible() == false ) { m_scrollArea->show(); m_subWindow->show(); } else { @@ -308,7 +308,7 @@ manageVSTEffectView::manageVSTEffectView( VstEffect * _eff, VstEffectControls * m_vi->m_scrollArea = new QScrollArea( widget ); l = new QGridLayout( widget ); - m_vi->m_subWindow = gui->mainWindow()->addWindowedWidget(NULL, Qt::SubWindow | + m_vi->m_subWindow = gui->mainWindow()->addWindowedWidget(NULL, Qt::SubWindow | Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowSystemMenuHint); m_vi->m_subWindow->setSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed ); m_vi->m_subWindow->setFixedSize( 960, 300); @@ -464,7 +464,7 @@ void manageVSTEffectView::displayAutomatedOnly( void ) { vstKnobs[ i ]->hide(); m_displayAutomatedOnly->setText( "All" ); - } else { + } else { vstKnobs[ i ]->show(); m_displayAutomatedOnly->setText( "Automated" ); } @@ -514,30 +514,30 @@ manageVSTEffectView::~manageVSTEffectView() delete vstKnobs[ i ]; } } - + if( vstKnobs != NULL ) { delete [] vstKnobs; vstKnobs = NULL; } - + if( m_vi2->knobFModel != NULL ) { delete [] m_vi2->knobFModel; m_vi2->knobFModel = NULL; } - + if( m_vi2->m_scrollArea != NULL ) { delete m_vi2->m_scrollArea; m_vi2->m_scrollArea = NULL; } - + if( m_vi2->m_subWindow != NULL ) { m_vi2->m_subWindow->setAttribute( Qt::WA_DeleteOnClose ); m_vi2->m_subWindow->close(); - + if( m_vi2->m_subWindow != NULL ) { delete m_vi2->m_subWindow; @@ -547,3 +547,9 @@ manageVSTEffectView::~manageVSTEffectView() //delete m_vi2->m_subWindow; //m_vi2->m_subWindow = NULL; } + + + + + + diff --git a/plugins/vst_base/RemoteVstPlugin.cpp b/plugins/vst_base/RemoteVstPlugin.cpp index a7810b48c3f..1e725d0827a 100644 --- a/plugins/vst_base/RemoteVstPlugin.cpp +++ b/plugins/vst_base/RemoteVstPlugin.cpp @@ -1394,7 +1394,7 @@ void RemoteVstPlugin::savePreset( const std::string & _file ) } fclose( stream ); - if ( !chunky ) + if ( !chunky ) delete[] data; delete[] (sBank*)pBank; @@ -1544,7 +1544,7 @@ int RemoteVstPlugin::updateInOutCount() { return 1; } - + if( GetCurrentThreadId() == __processingThreadId ) { debugMessage( "Plugin requested I/O change from processing " @@ -1682,7 +1682,7 @@ intptr_t RemoteVstPlugin::hostCallback( AEffect * _effect, int32_t _opcode, _timeInfo.flags |= kVstTransportCycleActive; } - if( __plugin->m_vstSyncData->ppqPos != + if( __plugin->m_vstSyncData->ppqPos != __plugin->m_in->m_Timestamp ) { _timeInfo.ppqPos = __plugin->m_vstSyncData->ppqPos; @@ -1714,7 +1714,7 @@ intptr_t RemoteVstPlugin::hostCallback( AEffect * _effect, int32_t _opcode, { _timeInfo.flags |= kVstTransportPlaying; } - _timeInfo.barStartPos = ( (int) ( _timeInfo.ppqPos / + _timeInfo.barStartPos = ( (int) ( _timeInfo.ppqPos / ( 4 *__plugin->m_vstSyncData->timeSigNumer / (float) __plugin->m_vstSyncData->timeSigDenom ) ) ) * ( 4 * __plugin->m_vstSyncData->timeSigNumer @@ -2277,3 +2277,4 @@ int main( int _argc, char * * _argv ) return 0; } + From 21f2dc14498059852019d090b637c61f187e177d Mon Sep 17 00:00:00 2001 From: ibuki2003 Date: Tue, 5 May 2020 10:55:56 +0900 Subject: [PATCH 10/12] rename presName to paramDisplays that has parameterDisplays --- plugins/vst_base/RemoteVstPlugin.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/vst_base/RemoteVstPlugin.cpp b/plugins/vst_base/RemoteVstPlugin.cpp index 1e725d0827a..772856287f9 100644 --- a/plugins/vst_base/RemoteVstPlugin.cpp +++ b/plugins/vst_base/RemoteVstPlugin.cpp @@ -1084,18 +1084,18 @@ const char * RemoteVstPlugin::programName() // join the ParameterDisplays (stringified values without units) and send them to host void RemoteVstPlugin::getParameterDisplays() { - std::string presName; + std::string paramDisplays; static char buf[9]; // buffer for getting string for (int i=0; i< m_plugin->numParams; ++i) { memset( buf, 0, sizeof( buf ) ); // fill with '\0' because got string may not to be ended with '\0' pluginDispatch( effGetParamDisplay, i, 0, buf ); buf[8] = 0; - if (i != 0) presName += '|'; - presName += buf; + if (i != 0) paramDisplays += '|'; + paramDisplays += buf; } - sendMessage( message( IdVstParameterDisplays ).addString( presName.c_str() ) ); + sendMessage( message( IdVstParameterDisplays ).addString( paramDisplays.c_str() ) ); } From a53a3a6a6bb1fc0f6b07dcb997ae478bfb1d1230 Mon Sep 17 00:00:00 2001 From: ibuki2003 Date: Tue, 5 May 2020 10:57:46 +0900 Subject: [PATCH 11/12] rename presName to paramLabels that has parameterLabels --- plugins/vst_base/RemoteVstPlugin.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/plugins/vst_base/RemoteVstPlugin.cpp b/plugins/vst_base/RemoteVstPlugin.cpp index 772856287f9..e79980be8fb 100644 --- a/plugins/vst_base/RemoteVstPlugin.cpp +++ b/plugins/vst_base/RemoteVstPlugin.cpp @@ -1103,18 +1103,18 @@ void RemoteVstPlugin::getParameterDisplays() // join the ParameterLabels (units) and send them to host void RemoteVstPlugin::getParameterLabels() { - std::string presName; + std::string paramLabels; static char buf[9]; // buffer for getting string for (int i=0; i< m_plugin->numParams; ++i) { memset( buf, 0, sizeof( buf ) ); // fill with '\0' because got string may not to be ended with '\0' - pluginDispatch( effGetParamLabel, i, 0, buf ); + pluginDispatch( effGetParamLabels, i, 0, buf ); buf[8] = 0; - if (i != 0) presName += '|'; - presName += buf; + if (i != 0) paramLabels += '|'; + paramLabels += buf; } - sendMessage( message( IdVstParameterLabels ).addString( presName.c_str() ) ); + sendMessage( message( IdVstParameterLabels ).addString( paramLabels.c_str() ) ); } From 3fee6e5b0d69c6f53cfc91cd8919e254ddb8f4f1 Mon Sep 17 00:00:00 2001 From: ibuki2003 Date: Tue, 5 May 2020 12:10:13 +0900 Subject: [PATCH 12/12] use length descriptor instead of delimiter for splitting --- plugins/VstEffect/VstEffectControls.cpp | 18 ++++++++++++++++-- plugins/vestige/vestige.cpp | 18 ++++++++++++++++-- plugins/vst_base/RemoteVstPlugin.cpp | 11 ++++++++--- 3 files changed, 40 insertions(+), 7 deletions(-) diff --git a/plugins/VstEffect/VstEffectControls.cpp b/plugins/VstEffect/VstEffectControls.cpp index 17a57e10c89..ab740838855 100644 --- a/plugins/VstEffect/VstEffectControls.cpp +++ b/plugins/VstEffect/VstEffectControls.cpp @@ -493,8 +493,22 @@ void manageVSTEffectView::syncParameterText() QString paramLabelStr = m_effect->m_plugin->allParameterLabels(); QString paramDisplayStr = m_effect->m_plugin->allParameterDisplays(); - QStringList paramLabelList = paramLabelStr.split("|"); - QStringList paramDisplayList = paramDisplayStr.split("|"); + QStringList paramLabelList; + QStringList paramDisplayList; + + for( int i = 0; i < paramLabelStr.size(); ) + { + const int length = paramLabelStr[i].digitValue(); + paramLabelList.append(paramLabelStr.mid(i + 1, length)); + i += length + 1; + } + + for( int i = 0; i < paramDisplayStr.size(); ) + { + const int length = paramDisplayStr[i].digitValue(); + paramDisplayList.append(paramDisplayStr.mid(i + 1, length)); + i += length + 1; + } for( int i = 0; i < paramLabelList.size(); ++i ) { diff --git a/plugins/vestige/vestige.cpp b/plugins/vestige/vestige.cpp index 46489dd1f25..91e8b9d7dd7 100644 --- a/plugins/vestige/vestige.cpp +++ b/plugins/vestige/vestige.cpp @@ -1134,8 +1134,22 @@ void manageVestigeInstrumentView::syncParameterText() QString paramLabelStr = m_vi->m_plugin->allParameterLabels(); QString paramDisplayStr = m_vi->m_plugin->allParameterDisplays(); - QStringList paramLabelList = paramLabelStr.split("|"); - QStringList paramDisplayList = paramDisplayStr.split("|"); + QStringList paramLabelList; + QStringList paramDisplayList; + + for( int i = 0; i < paramLabelStr.size(); ) + { + const int length = paramLabelStr[i].digitValue(); + paramLabelList.append(paramLabelStr.mid(i + 1, length)); + i += length + 1; + } + + for( int i = 0; i < paramDisplayStr.size(); ) + { + const int length = paramDisplayStr[i].digitValue(); + paramDisplayList.append(paramDisplayStr.mid(i + 1, length)); + i += length + 1; + } for( int i = 0; i < paramLabelList.size(); ++i ) { diff --git a/plugins/vst_base/RemoteVstPlugin.cpp b/plugins/vst_base/RemoteVstPlugin.cpp index e79980be8fb..4ffb88d14a6 100644 --- a/plugins/vst_base/RemoteVstPlugin.cpp +++ b/plugins/vst_base/RemoteVstPlugin.cpp @@ -71,6 +71,7 @@ #include #include #include +#include #include @@ -1091,7 +1092,9 @@ void RemoteVstPlugin::getParameterDisplays() memset( buf, 0, sizeof( buf ) ); // fill with '\0' because got string may not to be ended with '\0' pluginDispatch( effGetParamDisplay, i, 0, buf ); buf[8] = 0; - if (i != 0) paramDisplays += '|'; + + // each field shaped like: [length:number][content:string] + paramDisplays += '0' + strlen(buf); // add length descriptor (length is up to 8) paramDisplays += buf; } @@ -1108,9 +1111,11 @@ void RemoteVstPlugin::getParameterLabels() for (int i=0; i< m_plugin->numParams; ++i) { memset( buf, 0, sizeof( buf ) ); // fill with '\0' because got string may not to be ended with '\0' - pluginDispatch( effGetParamLabels, i, 0, buf ); + pluginDispatch( effGetParamLabel, i, 0, buf ); buf[8] = 0; - if (i != 0) paramLabels += '|'; + + // each field shaped like: [length:number][content:string] + paramLabels += '0' + strlen(buf); // add length descriptor (length is up to 8) paramLabels += buf; }