Load and save controllers to project

git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/trunk/lmms@1015 0778d3d1-df1d-0410-868b-ea421aaaa00d
This commit is contained in:
Paul Giblock
2008-05-25 05:28:15 +00:00
parent 7a6fb18e86
commit 6bb836464a
7 changed files with 180 additions and 6 deletions

View File

@@ -1,3 +1,17 @@
2008-05-25 Paul Giblock <drfaygo/at/gmail/dot/com>
* include/embed.h:
Fix missing distructor warning
* include/controller.h:
* include/song.h:
* include/lfo_controller.h:
* src/core/song.cpp:
* src/core/controller.cpp:
* src/core/lfo_controller.cpp:
Save and load controllers to project files. Doesn't clear them on
load/new yet though
2008-05-24 Tobias Doerffel <tobydox/at/users/dot/sourceforge/dot/net>
* include/song.h:

View File

@@ -34,17 +34,29 @@
#include "mixer.h"
#include "mv_base.h"
#include "templates.h"
#include "journalling_object.h"
class controllerDialog;
class controller;
typedef QVector<controller *> controllerVector;
class controller : public model
class controller : public model, public journallingObject
{
Q_OBJECT
public:
controller( model * _parent );
enum ControllerTypes
{
LfoController,
/*
MidiController,
XYController,
PeakController,
*/
NumControllerTypes
} ;
controller( ControllerTypes _type, model * _parent );
virtual ~controller();
@@ -67,6 +79,26 @@ public:
return "Dummy Controller";
}
ControllerTypes type( void ) const
{
return( m_type );
}
virtual const QString & name( void ) const
{
return( m_name );
}
virtual void saveSettings( QDomDocument & _doc, QDomElement & _this );
virtual void loadSettings( const QDomElement & _this );
virtual QString nodeName( void ) const;
static controller * create( ControllerTypes _tt, model * _parent );
static controller * create( const QDomElement & _this,
model * _parent );
inline static float fittedValue( float _val )
{
return tLimit<float>( _val, 0.0f, 1.0f );
@@ -81,6 +113,11 @@ public:
public slots:
virtual controllerDialog * createDialog( QWidget * _parent );
virtual void setName( const QString & _new_name )
{
m_name = _new_name;
}
protected:
// The internal per-controller get-value function
@@ -89,6 +126,8 @@ protected:
float m_currentValue;
bool m_sampleExact;
QString m_name;
ControllerTypes m_type;
static controllerVector s_controllers;

View File

@@ -86,6 +86,10 @@ public:
return( QPixmap() );
}
virtual ~pixmapLoader()
{
}
protected:
QString m_name;
} ;

View File

@@ -54,6 +54,9 @@ public:
return "LFO Controller";
}
virtual void saveSettings( QDomDocument & _doc, QDomElement & _this );
virtual void loadSettings( const QDomElement & _this );
virtual QString nodeName( void ) const;
public slots:
virtual controllerDialog * createDialog( QWidget * _parent );

View File

@@ -179,6 +179,8 @@ public:
}
void addController( controller * _c );
void removeController( controller * _c );
// QT will implicitly share the Vector I believe..
const controllerVector & controllers( void ) const
@@ -242,6 +244,8 @@ private:
}
void setPlayPos( tact _tact_num, tick _tick, PlayModes _play_mode );
void saveControllerStates( QDomDocument & _doc, QDomElement & _this );
void restoreControllerStates( const QDomElement & _this );
track * m_automationTrack;

View File

@@ -35,25 +35,36 @@
#include "mixer.h"
#include "controller.h"
#include "controller_dialog.h"
#include "lfo_controller.h"
unsigned int controller::s_frames = 0;
QVector<controller *> controller::s_controllers;
controller::controller( model * _parent ) :
model( _parent )
controller::controller( ControllerTypes _type, model * _parent ) :
model( _parent ),
m_type( _type )
{
s_controllers.append( this );
}
controller::~controller()
{
printf("controller dtor\n");
s_controllers.remove( s_controllers.indexOf( this ) );
if( engine::getSong() )
{
engine::getSong()->removeController( this );
}
}
// Get current value, with an offset into the current buffer for sample exactness
float controller::currentValue( int _offset )
{
@@ -66,6 +77,7 @@ float controller::currentValue( int _offset )
}
float controller::value( int _offset )
{
return 0.5f;
@@ -79,6 +91,8 @@ unsigned int controller::runningFrames()
return s_frames;
}
// Get position in seconds
float controller::runningTime()
{
@@ -86,6 +100,7 @@ float controller::runningTime()
}
void controller::triggerFrameCounter( void )
{
for( int i = 0; i < s_controllers.size(); ++i )
@@ -101,11 +116,72 @@ void controller::triggerFrameCounter( void )
//emit s_signaler.triggerValueChanged();
}
void controller::resetFrameCounter( void )
{
s_frames = 0;
}
controller * controller::create( ControllerTypes _ct, model * _parent )
{
controller * c = NULL;
switch( _ct )
{
case LfoController: c = new lfoController( _parent ); break;
default: break;
}
return( c );
}
controller * controller::create( const QDomElement & _this, model * _parent )
{
controller * c = create(
static_cast<ControllerTypes>( _this.attribute( "type" ).toInt() ),
_parent );
if( c != NULL )
{
c->restoreState( _this );
}
return( c );
}
void controller::saveSettings( QDomDocument & _doc, QDomElement & _this )
{
_this.setAttribute( "type", type() );
_this.setAttribute( "name", name() );
}
void controller::loadSettings( const QDomElement & _this )
{
if( _this.attribute( "type" ).toInt() != type() )
{
qWarning( "controller-type does not match controller-type of "
"settings-node!\n" );
}
setName( _this.attribute( "muted" ) );
}
QString controller::nodeName( void ) const
{
return( "controller" );
}
controllerDialog * controller::createDialog( QWidget * _parent )
{
controllerDialog * d = new controllerDialog( this, _parent );

View File

@@ -40,7 +40,7 @@
const float TWO_PI = 6.28318531f;
lfoController::lfoController( model * _parent ) :
controller( _parent ),
controller( LfoController, _parent ),
m_lfoBaseModel( 0.5, 0.0, 1.0, 0.001, this ),
m_lfoSpeedModel( 0.1, 0.01, 5.0, 0.0001, 20000.0, this ),
m_lfoAmountModel( 1.0, -1.0, 1.0, 0.005, this ),
@@ -64,8 +64,8 @@ lfoController::~lfoController()
m_lfoBaseModel.disconnect( this );
m_lfoSpeedModel.disconnect( this );
m_lfoAmountModel.disconnect( this );
m_lfoWaveModel.disconnect( this );
m_lfoPhaseModel.disconnect( this );
m_lfoWaveModel.disconnect( this );
}
@@ -166,6 +166,40 @@ void lfoController::updateSampleFunction( void )
void lfoController::saveSettings( QDomDocument & _doc, QDomElement & _this )
{
controller::saveSettings( _doc, _this );
m_lfoBaseModel.saveSettings( _doc, _this, "base" );
m_lfoSpeedModel.saveSettings( _doc, _this, "speed" );
m_lfoAmountModel.saveSettings( _doc, _this, "amount" );
m_lfoPhaseModel.saveSettings( _doc, _this, "phase" );
m_lfoWaveModel.saveSettings( _doc, _this, "wave" );
}
void lfoController::loadSettings( const QDomElement & _this )
{
controller::loadSettings( _this );
m_lfoBaseModel.loadSettings( _this, "base" );
m_lfoSpeedModel.loadSettings( _this, "speed" );
m_lfoAmountModel.loadSettings( _this, "amount" );
m_lfoPhaseModel.loadSettings( _this, "phase" );
m_lfoWaveModel.loadSettings( _this, "wave" );
updateSampleFunction();
}
QString lfoController::nodeName( void ) const
{
return( "lfocontroller" );
}
controllerDialog * lfoController::createDialog( QWidget * _parent )
{