VstBase: initial support for saving/restoring chunks

Some VST plugins save their state as chunks rather than parameters.
According code to save/restore those chunks has been taken from FST 1.9.
However restore currently is disabled as it mostly fails for whatever
reason.
(cherry picked from commit 0abd4aad70)
This commit is contained in:
Tobias Doerffel
2009-04-09 23:40:04 +02:00
parent cfe9c35f41
commit 12aaffe149
3 changed files with 109 additions and 1 deletions

View File

@@ -38,6 +38,10 @@
#include <pthread.h>
#endif
#ifdef LMMS_HAVE_FCNTL_H
#include <fcntl.h>
#endif
#ifdef LMMS_BUILD_LINUX
#ifdef LMMS_HAVE_SCHED_H
@@ -184,6 +188,12 @@ public:
// post properties of specified parameter
void getParameterProperties( const int _idx );
// save settings chunk of plugin into file
void saveChunkToFile( const std::string & _file );
// restore settings chunk of plugin from file
void loadChunkFromFile( const std::string & _file, int _len );
// number of inputs
virtual int inputCount( void ) const
{
@@ -350,6 +360,16 @@ bool remoteVstPlugin::processMessage( const message & _m )
getParameterProperties( _m.getInt() );
break;
case IdSaveSettingsToFile:
saveChunkToFile( _m.getString() );
sendMessage( IdSaveSettingsToFile );
break;
case IdLoadSettingsFromFile:
loadChunkFromFile( _m.getString( 0 ), _m.getInt( 1 ) );
sendMessage( IdLoadSettingsFromFile );
break;
default:
return remotePluginClient::processMessage( _m );
}
@@ -800,6 +820,40 @@ void remoteVstPlugin::getParameterProperties( const int _idx )
void remoteVstPlugin::saveChunkToFile( const std::string & _file )
{
if( m_plugin->flags & 32 )
{
void * chunk = NULL;
int len = m_plugin->dispatcher( m_plugin, 23, 0, 0, &chunk, 0 );
if( len > 0 )
{
int fd = open( _file.c_str(), O_WRONLY );
write( fd, chunk, len );
close( fd );
}
}
}
void remoteVstPlugin::loadChunkFromFile( const std::string & _file, int _len )
{
char * buf = new char[_len];
const int fd = open( _file.c_str(), O_RDONLY );
read( fd, buf, _len );
close( fd );
// doesn't work for various plugins for some reason :-(
// m_plugin->dispatcher( m_plugin, 24, 0, _len, buf, 0 );
delete[] buf;
}
void remoteVstPlugin::updateInOutCount( void )
{
delete[] m_inputs;

View File

@@ -28,6 +28,7 @@
#include <QtCore/QDir>
#include <QtCore/QFileInfo>
#include <QtCore/QLocale>
#include <QtCore/QTemporaryFile>
#include <QtGui/QCloseEvent>
#include <QtGui/QMdiArea>
#include <QtGui/QMdiSubWindow>
@@ -250,6 +251,12 @@ void vstPlugin::loadSettings( const QDomElement & _this )
}
setParameterDump( dump );
}
if( _this.hasAttribute( "chunk" ) )
{
loadChunk( QByteArray::fromBase64(
_this.attribute( "chunk" ).toAscii() ) );
}
}
@@ -268,6 +275,11 @@ void vstPlugin::saveSettings( QDomDocument & _doc, QDomElement & _this )
{
_this.setAttribute( it.key(), it.value() );
}
QByteArray chunk = saveChunk();
if( !chunk.isEmpty() )
{
_this.setAttribute( "chunk", QString( chunk.toBase64() ) );
}
}
@@ -393,5 +405,44 @@ bool vstPlugin::processMessage( const message & _m )
void vstPlugin::loadChunk( const QByteArray & _chunk )
{
QTemporaryFile tf;
if( tf.open() )
{
tf.write( _chunk );
lock();
sendMessage( message( IdLoadSettingsFromFile ).
addString( QDir::toNativeSeparators(
tf.fileName() ).toStdString() ).
addInt( _chunk.size() ) );
waitForMessage( IdLoadSettingsFromFile );
unlock();
}
}
QByteArray vstPlugin::saveChunk( void )
{
QByteArray a;
QTemporaryFile tf;
if( tf.open() )
{
lock();
sendMessage( message( IdSaveSettingsToFile ).
addString( QDir::toNativeSeparators(
tf.fileName() ).toStdString() ) );
waitForMessage( IdSaveSettingsToFile );
unlock();
a = tf.readAll();
}
return a;
}
#include "moc_vst_plugin.cxx"

View File

@@ -1,7 +1,7 @@
/*
* vst_plugin.h - declaration of vstPlugin class
*
* Copyright (c) 2005-2008 Tobias Doerffel <tobydox/at/users.sourceforge.net>
* Copyright (c) 2005-2009 Tobias Doerffel <tobydox/at/users.sourceforge.net>
*
* This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net
*
@@ -106,6 +106,9 @@ public slots:
private:
void loadChunk( const QByteArray & _chunk );
QByteArray saveChunk( void );
QString m_plugin;
QWidget * m_pluginWidget;
int m_pluginWindowID;