rewrote effect-framework, changes in plugin-instantiation

git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/branches/lmms-mv@656 0778d3d1-df1d-0410-868b-ea421aaaa00d
This commit is contained in:
Tobias Doerffel
2008-01-06 12:47:21 +00:00
parent 784a7991d6
commit dc5d949af4
61 changed files with 886 additions and 938 deletions

View File

@@ -1,3 +1,76 @@
2008-01-06 Tobias Doerffel <tobydox/at/users/dot/sourceforge/dot/net>
* plugins/ladspa_effect/ladspa_effect.cpp:
* plugins/ladspa_effect/ladspa_effect.h:
* plugins/bass_booster/bass_booster.cpp:
* plugins/bass_booster/bass_booster.h:
* plugins/vst_effect/vst_effect.cpp:
changes for making effects work again with new effect-framework
* plugins/audio_file_processor/audio_file_processor.cpp:
* plugins/audio_file_processor/audio_file_processor.h:
* plugins/stk/mallets/mallets.cpp:
* plugins/stk/mallets/mallets.h:
* plugins/ladspa_browser/ladspa_browser.cpp:
* plugins/ladspa_browser/ladspa_browser.h:
* plugins/kicker/kicker.cpp:
* plugins/kicker/kicker.h:
* include/dummy_plugin.h:
* include/instrument.h:
* include/plugin.h:
* include/tool.h:
* include/main_window.h:
* include/mv_base.h:
* include/dummy_instrument.h:
* src/core/plugin.cpp:
* src/core/tool.cpp:
* src/core/import_filter.cpp:
* src/core/instrument.cpp:
* src/core/surround_area.cpp:
* src/core/main_window.cpp:
moved createView()-functionality from instrument- to plugin-class
* include/tab_widget.h:
code-formatting stuff
* include/audio_port.h:
* include/instrument_track.h:
* include/sample_track.h:
* src/audio/audio_port.cpp:
* src/core/sample_play_handle.cpp:
* src/tracks/instrument_track.cpp:
* src/tracks/sample_track.cpp:
integrated new effect-framework
* Makefile.am:
* include/dummy_effect.h:
* include/effect.h:
* include/effect_chain.h:
* include/effect_control_dialog.h:
* include/effect_label.h:
* include/effect_rack_view.h:
* include/effect_select_dialog.h:
* include/effect_tab_widget.h:
* include/effect_view.h:
* src/core/effect.cpp:
* src/core/effect_chain.cpp:
* src/core/effect_control_dialog.cpp:
* src/core/effect_select_dialog.cpp:
* src/core/effect_tab_widget.cpp:
* src/widgets/effect_label.cpp:
* src/widgets/effect_view.cpp:
* src/widgets/effect_rack_view.cpp:
rewrote view-component of effect-framework and removed effectTabWidget
* include/automatable_model.h:
* src/widgets/automatable_slider.cpp:
* src/widgets/group_box.cpp:
* src/widgets/lcd_spinbox.cpp:
* src/widgets/combobox.cpp:
* src/widgets/knob.cpp:
* src/widgets/automatable_button.cpp:
pass model-pointer to modelView-constructor
2008-01-05 Tobias Doerffel <tobydox/at/users/dot/sourceforge/dot/net>
* plugins/organic/organic.cpp:

View File

@@ -63,7 +63,6 @@ lmms_MOC = \
./effect_control_dialog.moc \
./effect_label.moc \
./effect_select_dialog.moc \
./effect_tab_widget.moc \
./envelope_and_lfo_widget.moc \
./envelope_tab_widget.moc \
./export_project_dialog.moc \
@@ -89,8 +88,8 @@ lmms_MOC = \
./pixmap_button.moc \
./plugin_browser.moc \
./project_notes.moc \
./rack_plugin.moc \
./rack_view.moc \
./effect_view.moc \
./effect_rack_view.moc \
./rubberband.moc \
./rename_dialog.moc \
./sample_buffer.moc \
@@ -159,7 +158,6 @@ lmms_SOURCES = \
$(srcdir)/src/core/effect_chain.cpp \
$(srcdir)/src/core/effect_control_dialog.cpp \
$(srcdir)/src/core/effect_select_dialog.cpp \
$(srcdir)/src/core/effect_tab_widget.cpp \
$(srcdir)/src/core/effect.cpp \
$(srcdir)/src/core/engine.cpp \
$(srcdir)/src/core/envelope_and_lfo_widget.cpp \
@@ -221,6 +219,8 @@ lmms_SOURCES = \
$(srcdir)/src/widgets/combobox.cpp \
$(srcdir)/src/widgets/cpuload_widget.cpp \
$(srcdir)/src/widgets/effect_label.cpp \
$(srcdir)/src/widgets/effect_rack_view.cpp \
$(srcdir)/src/widgets/effect_view.cpp \
$(srcdir)/src/widgets/fade_button.cpp \
$(srcdir)/src/widgets/group_box.cpp \
$(srcdir)/src/widgets/kmultitabbar.cpp \
@@ -230,8 +230,6 @@ lmms_SOURCES = \
$(srcdir)/src/widgets/nstate_button.cpp \
$(srcdir)/src/widgets/pixmap_button.cpp \
$(srcdir)/src/widgets/project_notes.cpp \
$(srcdir)/src/widgets/rack_plugin.cpp \
$(srcdir)/src/widgets/rack_view.cpp \
$(srcdir)/src/widgets/rubberband.cpp \
$(srcdir)/src/widgets/rename_dialog.cpp \
$(srcdir)/src/widgets/side_bar_widget.cpp \
@@ -273,7 +271,9 @@ lmms_SOURCES = \
$(srcdir)/include/panning.h \
$(srcdir)/include/song_editor.h \
$(srcdir)/include/plugin.h \
$(srcdir)/include/plugin_view.h \
$(srcdir)/include/instrument.h \
$(srcdir)/include/instrument_view.h \
$(srcdir)/include/bb_editor.h \
$(srcdir)/include/piano_widget.h \
$(srcdir)/include/effect_board.h \
@@ -372,10 +372,9 @@ lmms_SOURCES = \
$(srcdir)/include/effect_chain.h \
$(srcdir)/include/effect_control_dialog.h \
$(srcdir)/include/effect_label.h \
$(srcdir)/include/effect_tab_widget.h \
$(srcdir)/include/rack_plugin.h \
$(srcdir)/include/rack_view.h \
$(srcdir)/include/effect_rack_view.h \
$(srcdir)/include/effect_select_dialog.h \
$(srcdir)/include/effect_view.h \
$(srcdir)/include/dummy_effect.h \
$(srcdir)/include/ladspa-1.1.h \
$(srcdir)/include/sweep_oscillator.h \

View File

@@ -2,8 +2,8 @@
# Process this file with autoconf to produce a configure script.
AC_PREREQ(2.50)
AC_INIT(lmms, 0.4.0-svn20080104-mv, lmms-devel/at/lists/dot/sf/dot/net)
AM_INIT_AUTOMAKE(lmms, 0.4.0-svn20080104-mv)
AC_INIT(lmms, 0.4.0-svn20080106-mv, lmms-devel/at/lists/dot/sf/dot/net)
AM_INIT_AUTOMAKE(lmms, 0.4.0-svn20080106-mv)
AM_CONFIG_HEADER(config.h)

View File

@@ -1,7 +1,7 @@
/*
* audio_port.h - base-class for objects providing sound at a port
*
* Copyright (c) 2005-2007 Tobias Doerffel <tobydox/at/users.sourceforge.net>
* Copyright (c) 2005-2008 Tobias Doerffel <tobydox/at/users.sourceforge.net>
*
* This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net
*
@@ -34,7 +34,7 @@
class audioPort
{
public:
audioPort( const QString & _name );
audioPort( const QString & _name, track * _track );
~audioPort();
inline surroundSampleFrame * firstBuffer( void )
@@ -66,7 +66,7 @@ public:
inline effectChain * getEffects( void )
{
return( m_effects );
return( &m_effects );
}
void setNextFxChannel( const fx_ch_t _chnl )
@@ -88,7 +88,11 @@ public:
NONE, FIRST, BOTH
} m_bufferUsage;
inline bool processEffects( void ) { return( m_effects->processAudioBuffer( m_firstBuffer, m_frames ) ); };
inline bool processEffects( void )
{
return( m_effects.processAudioBuffer( m_firstBuffer,
m_frames ) );
}
private:
surroundSampleFrame * m_firstBuffer;
@@ -98,7 +102,7 @@ private:
QString m_name;
effectChain * m_effects;
effectChain m_effects;
fpp_t m_frames;
} ;

View File

@@ -1,7 +1,7 @@
/*
* automatable_model.h - declaration of class automatableModel
*
* Copyright (c) 2007 Tobias Doerffel <tobydox/at/users.sourceforge.net>
* Copyright (c) 2007-2008 Tobias Doerffel <tobydox/at/users.sourceforge.net>
*
* This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net
*
@@ -247,7 +247,8 @@ public:
typedef automatableModel<T, EDIT_STEP_TYPE> autoModel;
typedef automatableModelView<T, EDIT_STEP_TYPE> autoModelView;
automatableModelView( void ) : modelView()
automatableModelView( ::model * _model ) :
modelView( _model )
{
}

View File

@@ -55,8 +55,8 @@ public:
class dummyEffect : public effect
{
public:
inline dummyEffect( void ) :
effect( NULL, NULL )
inline dummyEffect( model * _parent ) :
effect( NULL, _parent, NULL )
{
}

View File

@@ -56,7 +56,7 @@ public:
return( "dummyinstrument" );
}
virtual instrumentView * createView( QWidget * _parent )
virtual pluginView * instantiateView( QWidget * _parent )
{
return( new instrumentView( this, _parent ) );
}

View File

@@ -2,7 +2,7 @@
* dummy_plugin.h - empty plugin which is used as fallback if a plugin couldn't
* be found
*
* Copyright (c) 2005-2007 Tobias Doerffel <tobydox/at/users.sourceforge.net>
* Copyright (c) 2005-2008 Tobias Doerffel <tobydox/at/users.sourceforge.net>
*
* This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net
*
@@ -28,13 +28,14 @@
#define _DUMMY_PLUGIN_H
#include "plugin.h"
#include "plugin_view.h"
class dummyPlugin : public plugin
{
public:
inline dummyPlugin( void ) :
plugin( NULL )
plugin( NULL, NULL )
{
}
@@ -56,6 +57,12 @@ public:
return( "dummyplugin" );
}
protected:
virtual pluginView * instantiateView( QWidget * _parent )
{
return( new pluginView( this, _parent ) );
}
} ;

View File

@@ -2,7 +2,7 @@
* effect.h - base class for effects
*
* Copyright (c) 2006-2007 Danny McRae <khjklujn/at/users.sourceforge.net>
* Copyright (c) 2006-2007 Tobias Doerffel <tobydox/at/users.sourceforge.net>
* Copyright (c) 2006-2008 Tobias Doerffel <tobydox/at/users.sourceforge.net>
*
* This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net
*
@@ -39,83 +39,91 @@
#include "automatable_model.h"
class effectChain;
class effectControlDialog;
class track;
class rackPlugin;
class effect : public plugin
{
public:
effect( const plugin::descriptor * _desc,
model * _parent,
const descriptor::subPluginFeatures::key * _key );
virtual ~effect();
virtual void saveSettings( QDomDocument & _doc, QDomElement & _parent );
virtual void loadSettings( const QDomElement & _this );
inline virtual QString nodeName( void ) const
{
return( "effect" );
}
virtual bool FASTCALL processAudioBuffer(
virtual bool processAudioBuffer(
surroundSampleFrame * _buf, const fpp_t _frames );
inline ch_cnt_t getProcessorCount( void ) const
{
return( m_processors );
}
inline void setProcessorCount( ch_cnt_t _processors )
{
m_processors = _processors;
}
inline bool isOkay( void ) const
{
return( m_okay );
}
inline void setOkay( bool _state )
{
m_okay = _state;
}
inline bool isRunning( void ) const
{
return( m_running );
}
inline void startRunning( void )
{
m_bufferCount = 0;
m_running = TRUE;
}
inline void stopRunning( void )
{
m_running = FALSE;
}
inline bool isEnabled( void ) const
{
return( m_enabledModel.value() );
}
inline Uint32 getTimeout( void ) const
inline f_cnt_t getTimeout( void ) const
{
return( m_silenceTimeout );
const float samples = engine::getMixer()->sampleRate() *
m_autoQuitModel.value() / 1000.0f;
return( 1 + ( static_cast<Uint32>( samples ) /
engine::getMixer()->framesPerPeriod() ) );
}
inline void setTimeout( Uint32 _time_out )
{
m_silenceTimeout = _time_out;
}
inline float getWetLevel( void ) const
{
return( m_wetDryModel.value() );
}
inline float getDryLevel( void ) const
{
return( 1.0f - m_wetDryModel.value() );
}
inline float getGate( void ) const
{
const float level = m_gateModel.value();
@@ -123,7 +131,7 @@ public:
engine::getMixer()->framesPerPeriod() );
}
inline Uint32 getBufferCount( void ) const
inline f_cnt_t getBufferCount( void ) const
{
return( m_bufferCount );
}
@@ -135,7 +143,7 @@ public:
inline void incrementBufferCount( void )
{
m_bufferCount++;
++m_bufferCount;
}
inline bool dontRun( void ) const
@@ -156,9 +164,14 @@ public:
virtual effectControlDialog * createControlDialog( track * _track ) = 0;
static effect * instantiate( const QString & _plugin_name,
model * _parent,
descriptor::subPluginFeatures::key * _key );
protected:
virtual pluginView * instantiateView( QWidget * );
private:
descriptor::subPluginFeatures::key m_key;
@@ -167,16 +180,16 @@ private:
bool m_okay;
bool m_noRun;
bool m_running;
f_cnt_t m_bufferCount;
boolModel m_enabledModel;
Uint32 m_bufferCount;
Uint32 m_silenceTimeout;
floatModel m_wetDryModel;
floatModel m_gateModel;
floatModel m_autoQuitModel;
friend class rackPlugin;
friend class effectView;
friend class effectChain;
} ;

View File

@@ -2,6 +2,7 @@
* effect_chain.h - class for processing and effects chain
*
* Copyright (c) 2006-2008 Danny McRae <khjklujn/at/users.sourceforge.net>
* Copyright (c) 2008 Tobias Doerffel <tobydox/at/users.sourceforge.net>
*
* This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net
*
@@ -28,37 +29,48 @@
#include "effect.h"
typedef QVector<effect *> effect_list_t;
class effectChain
class effectChain : public journallingObject, public model
{
public:
effectChain( void );
effectChain( audioPort * _port, track * _track );
virtual ~effectChain();
void FASTCALL appendEffect( effect * _effect );
void FASTCALL removeEffect( effect * _effect );
void FASTCALL moveDown( effect * _effect );
void FASTCALL moveUp( effect * _effect );
bool FASTCALL processAudioBuffer( surroundSampleFrame * _buf,
virtual void saveSettings( QDomDocument & _doc, QDomElement & _parent );
virtual void loadSettings( const QDomElement & _this );
inline virtual QString nodeName( void ) const
{
return( "fxchain" );
}
void appendEffect( effect * _effect );
void removeEffect( effect * _effect );
void moveDown( effect * _effect );
void moveUp( effect * _effect );
bool processAudioBuffer( surroundSampleFrame * _buf,
const fpp_t _frames );
void startRunning( void );
bool isRunning( void );
inline const effect_list_t & getEffects( void )
/* inline const effect_list_t & getEffects( void )
{
return( m_effects );
}
}*/
void deleteAllPlugins( void );
private:
effect_list_t m_effects;
typedef QVector<effect *> effectList;
effectList m_effects;
audioPort * m_port;
track * m_track;
boolModel m_enabledModel;
friend class effectTabWidget;
friend class effectRackView;
} ;

View File

@@ -2,7 +2,7 @@
* effect_control_dialog.h - base-class for effect-dialogs for displaying and
* editing control port values
*
* Copyright (c) 2006-2007 Tobias Doerffel <tobydox/at/users.sourceforge.net>
* Copyright (c) 2006-2008 Tobias Doerffel <tobydox/at/users.sourceforge.net>
*
* This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net
*
@@ -28,14 +28,15 @@
#include <QtGui/QWidget>
#include "journalling_object.h"
#include "mv_base.h"
#include "types.h"
class effect;
class track;
class effectControlDialog : public QWidget, public journallingObject
class effectControlDialog : public QWidget, public modelView
{
Q_OBJECT
public:

View File

@@ -3,6 +3,7 @@
* offers access to an effect rack
*
* Copyright (c) 2006-2007 Danny McRae <khjklujn/at/users.sourceforge.net>
* Copyright (c) 2008 Tobias Doerffel <tobydox/at/users.sourceforge.net>
*
* This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net
*
@@ -28,18 +29,15 @@
#include <QtGui/QWidget>
#include "journalling_object.h"
class QLabel;
class QPushButton;
class effectTabWidget;
class effectRackView;
class sampleTrack;
class tabWidget;
class effectLabel: public QWidget, public journallingObject
class effectLabel: public QWidget
{
Q_OBJECT
public:
@@ -48,22 +46,14 @@ public:
virtual ~effectLabel();
QString text( void ) const;
void FASTCALL setText( const QString & _text );
virtual void FASTCALL saveSettings( QDomDocument & _doc,
QDomElement & _parent );
virtual void FASTCALL loadSettings( const QDomElement & _this );
inline virtual QString nodeName( void ) const
{
return( "sample_track" );
}
void setText( const QString & _text );
public slots:
void showEffects( void );
void rename( void );
signals:
void clicked( void );
void nameChanged( void );
@@ -78,13 +68,12 @@ protected:
private:
sampleTrack * m_track;
QLabel * m_label;
QPushButton * m_effectBtn;
tabWidget * m_tabWidget;
effectTabWidget * m_effWidget;
QWidget * m_effWindow;
effectRackView * m_effectRack;
};
} ;
#endif

View File

@@ -1,7 +1,8 @@
/*
* right_frame.h - provides the display for the rackInsert instances
* effect_rack_view.h - view for effectChain-model
*
* Copyright (c) 2006-2007 Danny McRae <khjklujn@netscape.net>
* Copyright (c) 2008 Tobias Doerffel <tobydox/at/users.sourceforge.net>
*
* This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net
*
@@ -22,63 +23,61 @@
*
*/
#ifndef _RACK_VIEW_H
#define _RACK_VIEW_H
#ifndef _EFFECT_RACK_VIEW_H
#define _EFFECT_RACK_VIEW_H
#include <QtGui/QWidget>
#include <QtGui/QLayout>
#include <QtGui/QScrollArea>
#include <QtGui/QVBoxLayout>
#include "effect_chain.h"
#include "types.h"
#include "journalling_object.h"
class QPushButton;
class QScrollArea;
class QVBoxLayout;
class effectView;
class groupBox;
class audioPort;
class effect;
class rackPlugin;
class track;
class rackView: public QWidget, public journallingObject
class effectRackView : public QWidget, public modelView
{
Q_OBJECT
public:
rackView( QWidget * _parent, track * _track, audioPort * _port );
~rackView();
void addEffect( effect * _e );
virtual void FASTCALL saveSettings( QDomDocument & _doc,
QDomElement & _parent );
virtual void FASTCALL loadSettings( const QDomElement & _this );
inline virtual QString nodeName( void ) const
{
return( "rack" );
}
void deleteAllPlugins( void );
effectRackView( effectChain * _model, QWidget * _parent );
virtual ~effectRackView();
public slots:
void moveUp( rackPlugin * _plugin );
void moveDown( rackPlugin * _plugin );
void deletePlugin( rackPlugin * _plugin );
void moveUp( effectView * _view );
void moveDown( effectView * _view );
void deletePlugin( effectView * _view );
private slots:
void updateView( void );
void addEffect( void );
private:
void redraw();
virtual void modelChanged( void );
inline effectChain * fxChain( void )
{
return( castModel<effectChain>() );
}
inline const effectChain * fxChain( void ) const
{
return( castModel<effectChain>() );
}
QVector<rackPlugin *> m_rackInserts;
QVector<effectView *> m_effectViews;
QVBoxLayout * m_mainLayout;
groupBox * m_effectsGroupBox;
QScrollArea * m_scrollArea;
track * m_track;
audioPort * m_port;
QPushButton * m_addButton;
Uint32 m_lastY;

View File

@@ -29,7 +29,7 @@
#include <QtGui/QDialog>
#include <QtGui/QListWidget>
#include "effect.h"
#include "effect_chain.h"
class effectSelectDialog : public QDialog
@@ -39,7 +39,7 @@ public:
effectSelectDialog( QWidget * _parent );
virtual ~effectSelectDialog();
effect * instantiateSelectedPlugin( void );
effect * instantiateSelectedPlugin( effectChain * _parent );
public slots:
void showPorts( void );
@@ -53,13 +53,13 @@ private:
class effectList : public QWidget
class effectListWidget : public QWidget
{
Q_OBJECT
public:
effectList( QWidget * _parent );
effectListWidget( QWidget * _parent );
virtual ~effectList();
virtual ~effectListWidget();
inline effectKey getSelected( void )
{

View File

@@ -1,86 +0,0 @@
/*
* effect_tab_widget.h - tab-widget in channel-track-window for setting up
* effects
*
* Copyright (c) 2006-2008 Danny McRae <khjklujn/at/users.sourceforge.net>
*
* This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program (see COPYING); if not, write to the
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301 USA.
*
*/
#ifndef _EFFECT_TAB_WIDGET_H
#define _EFFECT_TAB_WIDGET_H
#include <QtGui/QWidget>
#include "journalling_object.h"
#include "rack_view.h"
class QPushButton;
class audioPort;
class groupBox;
class instrumentTrack;
class sampleTrack;
class track;
class effectTabWidget : public QWidget, public journallingObject
{
Q_OBJECT
public:
effectTabWidget( instrumentTrack * _track, audioPort * _port );
effectTabWidget( QWidget * _parent, sampleTrack * _track,
audioPort * _port );
virtual ~effectTabWidget();
virtual void FASTCALL saveSettings( QDomDocument & _doc,
QDomElement & _parent );
virtual void FASTCALL loadSettings( const QDomElement & _this );
inline virtual QString nodeName( void ) const
{
return( "fx" );
}
void setupWidget( void );
inline void deleteAllEffects( void )
{
m_rack->deleteAllPlugins();
}
private slots:
void addEffect( void );
private:
track * m_track;
audioPort * m_port;
groupBox * m_effectsGroupBox;
QPushButton * m_addButton;
rackView * m_rack;
} ;
#endif

View File

@@ -1,8 +1,8 @@
/*
* rack_plugin.h - tab-widget in channel-track-window for setting up
* effects
* effect_view.h - view-component for an effect
*
* Copyright (c) 2006-2007 Danny McRae <khjklujn/at/users.sourceforge.net>
* Copyright (c) 2007-2008 Tobias Doerffel <tobydox/at/users.sourceforge.net>
*
* This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net
*
@@ -23,13 +23,11 @@
*
*/
#ifndef _RACK_PLUGIN_H
#define _RACK_PLUGIN_H
#include <QtGui/QWidget>
#ifndef _EFFECT_VIEW_H
#define _EFFECT_VIEW_H
#include "automatable_model.h"
#include "plugin_view.h"
class QGroupBox;
class QLabel;
@@ -45,51 +43,44 @@ class tempoSyncKnob;
class track;
class rackPlugin: public QWidget, public journallingObject
class effectView : public pluginView
{
Q_OBJECT
public:
rackPlugin( QWidget * _parent, effect * _eff, track * _track,
audioPort * _port );
virtual ~rackPlugin();
effectView( effect * _model, QWidget * _parent );
virtual ~effectView();
inline effect * getEffect()
inline effect * getEffect( void )
{
return( m_effect );
return( castModel<effect>() );
}
inline const effect * getEffect( void ) const
{
return( castModel<effect>() );
}
virtual void FASTCALL saveSettings( QDomDocument & _doc,
QDomElement & _parent );
virtual void FASTCALL loadSettings( const QDomElement & _this );
inline virtual QString nodeName( void ) const
{
return( "effect" );
}
public slots:
void editControls( void );
void updateAutoQuit( void );
/* void bypassChanged( void );
void updateWetDry( void );
void updateGate( void );*/
void moveUp( void );
void moveDown( void );
void deletePlugin( void );
void displayHelp( void );
void closeEffects( void );
signals:
void moveUp( rackPlugin * _plugin );
void moveDown( rackPlugin * _plugin );
void deletePlugin( rackPlugin * _plugin );
void moveUp( effectView * _plugin );
void moveDown( effectView * _plugin );
void deletePlugin( effectView * _plugin );
protected:
void contextMenuEvent( QContextMenuEvent * _me );
private:
floatModel m_autoQuitModel;
virtual void modelChanged( void );
private:
ledCheckBox * m_bypass;
knob * m_wetDry;
tempoSyncKnob * m_autoQuit;
@@ -99,10 +90,7 @@ private:
QLabel * m_label;
QPushButton * m_editButton;
QMdiSubWindow * m_subWindow;
effect * m_effect;
effectControlDialog * m_controlView;
track * m_track;
audioPort * m_port;
bool m_show;
} ;

View File

@@ -31,7 +31,6 @@
#include "plugin.h"
#include "mixer.h"
#include "mv_base.h"
// forward-declarations
@@ -43,7 +42,7 @@ class notePlayHandle;
class track;
class instrument : public plugin, public model
class instrument : public plugin
{
public:
instrument( instrumentTrack * _instrument_track,
@@ -117,8 +116,6 @@ public:
virtual bool isFromTrack( const track * _track ) const;
instrumentView * createEditor( QWidget * _parent );
protected:
inline instrumentTrack * getInstrumentTrack( void ) const
@@ -131,38 +128,10 @@ protected:
// desiredReleaseFrames() frames are left
void applyRelease( sampleFrame * buf, const notePlayHandle * _n );
// instruments have to implement this to create an according view for
// themselves
virtual instrumentView * createView( QWidget * _parent ) = 0;
private:
instrumentTrack * m_instrumentTrack;
} ;
class instrumentView : public QWidget, public modelView
{
public:
instrumentView( instrument * _instrument, QWidget * _parent );
virtual ~instrumentView();
instrument * model( void )
{
return( castModel<instrument>() );
}
const instrument * model( void ) const
{
return( castModel<instrument>() );
}
virtual void setModel( ::model * _model, bool = FALSE );
} ;
#endif

View File

@@ -2,7 +2,7 @@
* instrument_track.h - declaration of class instrumentTrack, a track + window
* which holds an instrument-plugin
*
* Copyright (c) 2004-2007 Tobias Doerffel <tobydox/at/users.sourceforge.net>
* Copyright (c) 2004-2008 Tobias Doerffel <tobydox/at/users.sourceforge.net>
*
* This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net
*
@@ -30,18 +30,20 @@
#include <QtGui/QPushButton>
#include <QtGui/QPainter>
#include "audio_port.h"
#include "automatable_model.h"
#include "lcd_spinbox.h"
#include "midi_event_processor.h"
#include "mixer.h"
#include "effect_chain.h"
#include "surround_area.h"
#include "tab_widget.h"
#include "track.h"
class QLineEdit;
class arpAndChordsTabWidget;
class audioPort;
class effectTabWidget;
class effectRackView;
class envelopeTabWidget;
class fadeButton;
class instrument;
@@ -158,7 +160,7 @@ public:
inline audioPort * getAudioPort( void )
{
return( m_audioPort );
return( &m_audioPort );
}
intModel * baseNoteModel( void )
@@ -207,7 +209,7 @@ private:
midiPort * m_midiPort;
audioPort * m_audioPort;
audioPort m_audioPort;
notePlayHandle * m_notes[NOTES_PER_OCTAVE * OCTAVES];
@@ -237,7 +239,11 @@ private:
envelopeTabWidget * m_envWidget;
arpAndChordsTabWidget * m_arpWidget;
midiTabWidget * m_midiWidget;
effectTabWidget * m_effWidget;
pluginView * m_instrumentView;
effectRackView * m_effectRack;
// effectChain m_effects;
// test-piano at the bottom of every instrument-settings-window
pianoWidget * m_pianoWidget;

View File

@@ -37,7 +37,7 @@ class QMdiArea;
class QSplashScreen;
class configManager;
class tool;
class pluginView;
class toolButton;
@@ -155,8 +155,8 @@ private:
bool m_alt;
} m_keyMods;
QMenu * m_tools_menu;
QList<tool *> m_tools;
QMenu * m_toolsMenu;
QList<pluginView *> m_tools;
bool m_modified;

View File

@@ -28,6 +28,8 @@
#include <QtCore/QObject>
class modelView;
class model : public QObject
{
@@ -71,8 +73,8 @@ signals:
class modelView
{
public:
modelView() :
m_model( NULL )
modelView( model * _model ) :
m_model( _model )
{
}

View File

@@ -32,6 +32,7 @@
#include <QtCore/QVector>
#include "journalling_object.h"
#include "mv_base.h"
#include "base64.h"
@@ -42,8 +43,10 @@
class QPixmap;
class QWidget;
class pluginView;
class plugin : public journallingObject
class plugin : public journallingObject, public model
{
public:
enum pluginTypes
@@ -150,7 +153,7 @@ public:
} ;
// contructor of a plugin
plugin( const descriptor * _descriptor );
plugin( const descriptor * _descriptor, model * _parent );
virtual ~plugin();
// returns public-name out of descriptor
@@ -184,6 +187,7 @@ public:
// returns an instance of a plugin whose name matches to given one
// if specified plugin couldn't be loaded, it creates a dummy-plugin
static plugin * FASTCALL instantiate( const QString & _plugin_name,
model * _parent,
void * _data );
// some plugins run external programs for doing their actual work
@@ -194,21 +198,29 @@ public:
// of course isn't that efficient
virtual bool supportsParallelizing( void ) const;
// plugins supporting parallelizing, should re-implement that as the
// plugins supporting parallelization, should re-implement that as the
// mixer will call this at the end of processing according chain
// of plugins
virtual void waitForWorkerThread( void );
// fills given vector with descriptors of all available plugins
static void FASTCALL getDescriptorsOfAvailPlugins(
QVector<descriptor> & _plugin_descs );
// create a view for the model
pluginView * createView( QWidget * _parent );
protected:
// create a view for the model
virtual pluginView * instantiateView( QWidget * ) = 0;
private:
const descriptor * m_descriptor;
// pointer to instantiation-function in plugin
typedef plugin * ( * instantiationHook )( void * );
typedef plugin * ( * instantiationHook )( model *, void * );
} ;

View File

@@ -2,7 +2,7 @@
* sample_track.h - class sampleTrack, a track which provides arrangement of
* samples
*
* Copyright (c) 2005-2007 Tobias Doerffel <tobydox/at/users.sourceforge.net>
* Copyright (c) 2005-2008 Tobias Doerffel <tobydox/at/users.sourceforge.net>
*
* This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net
*
@@ -29,11 +29,11 @@
#include <QtGui/QDialog>
#include "audio_port.h"
#include "track.h"
#include "volume_knob.h"
class QLabel;
class audioPort;
class effectLabel;
class sampleBuffer;
@@ -133,7 +133,7 @@ public:
inline audioPort * getAudioPort( void )
{
return( m_audioPort );
return( &m_audioPort );
}
virtual QString nodeName( void ) const
@@ -144,7 +144,7 @@ public:
private:
effectLabel * m_trackLabel;
audioPort * m_audioPort;
audioPort m_audioPort;
volumeKnob * m_volumeKnob;
knobModel m_volumeModel;

View File

@@ -1,7 +1,7 @@
/*
* tab_widget.h - LMMS-tabwidget
*
* Copyright (c) 2005-2007 Tobias Doerffel <tobydox/at/users.sourceforge.net>
* Copyright (c) 2005-2008 Tobias Doerffel <tobydox/at/users.sourceforge.net>
*
* This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net
*
@@ -35,10 +35,9 @@ class tabWidget : public QWidget
Q_OBJECT
public:
tabWidget( const QString & _caption, QWidget * _parent );
~tabWidget();
virtual ~tabWidget();
void addTab( QWidget * _w, const QString & _name,
int _idx = -1 );
void addTab( QWidget * _w, const QString & _name, int _idx = -1 );
void setActiveTab( int _idx );

View File

@@ -2,6 +2,7 @@
* tool.h - declaration of class tool, standard interface for all tool plugins
*
* Copyright (c) 2006-2007 Javier Serrano Polo <jasp00/at/users.sourceforge.net>
* Copyright (c) 2008 Tobias Doerffel <tobydox/at/users.sourceforge.net>
*
* This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net
*
@@ -26,24 +27,31 @@
#ifndef _TOOL_H
#define _TOOL_H
#include <QtGui/QWidget>
#include "plugin.h"
#include "plugin_view.h"
class tool : public QWidget, public plugin
class tool : public plugin
{
public:
tool( const descriptor * _descriptor );
tool( const descriptor * _descriptor, model * _parent );
virtual ~tool();
// instantiate tool-plugin with given name or return NULL
// on failure
static tool * FASTCALL instantiate( const QString & _plugin_name );
static tool * FASTCALL instantiate( const QString & _plugin_name,
model * _parent );
} ;
class toolView : public pluginView
{
public:
toolView( tool * _tool, QWidget * _parent );
} ;
#endif

View File

@@ -216,7 +216,7 @@ Uint32 audioFileProcessor::getBeatLen( notePlayHandle * _n ) const
instrumentView * audioFileProcessor::createView( QWidget * _parent )
pluginView * audioFileProcessor::instantiateView( QWidget * _parent )
{
return( new audioFileProcessorView( this, _parent ) );
}
@@ -600,7 +600,7 @@ extern "C"
{
// neccessary for getting instance out of shared lib
plugin * lmms_plugin_main( void * _data )
plugin * lmms_plugin_main( model *, void * _data )
{
return( new audioFileProcessor(
static_cast<instrumentTrack *>( _data ) ) );

View File

@@ -30,6 +30,7 @@
#include <QtGui/QPixmap>
#include "instrument.h"
#include "instrument_view.h"
#include "sample_buffer.h"
#include "volume_knob.h"
#include "pixmap_button.h"
@@ -73,7 +74,7 @@ public:
return( 128 );
}
virtual instrumentView * createView( QWidget * _parent );
virtual pluginView * instantiateView( QWidget * _parent );
public slots:

View File

@@ -51,9 +51,9 @@ plugin::descriptor bassbooster_plugin_descriptor =
bassBoosterEffect::bassBoosterEffect(
bassBoosterEffect::bassBoosterEffect( model * _parent,
const descriptor::subPluginFeatures::key * _key ) :
effect( &bassbooster_plugin_descriptor, _key ),
effect( &bassbooster_plugin_descriptor, _parent, _key ),
m_bbFX( effectLib::fastBassBoost<>( 70.0f, 1.0f, 2.8f ) )
{
}
@@ -71,7 +71,7 @@ bassBoosterEffect::~bassBoosterEffect()
bool FASTCALL bassBoosterEffect::processAudioBuffer( surroundSampleFrame * _buf,
const fpp_t _frames )
{
if( isBypassed() || !isRunning () )
if( !isEnabled() || !isRunning () )
{
return( FALSE );
}
@@ -114,9 +114,9 @@ extern "C"
{
// neccessary for getting instance out of shared lib
plugin * lmms_plugin_main( void * _data )
plugin * lmms_plugin_main( model * _parent, void * _data )
{
return( new bassBoosterEffect(
return( new bassBoosterEffect( _parent,
static_cast<const plugin::descriptor::subPluginFeatures::key *>(
_data ) ) );
}

View File

@@ -40,7 +40,8 @@
class bassBoosterEffect : public effect
{
public:
bassBoosterEffect( const descriptor::subPluginFeatures::key * _key );
bassBoosterEffect( model * _parent,
const descriptor::subPluginFeatures::key * _key );
virtual ~bassBoosterEffect();
virtual bool FASTCALL processAudioBuffer( surroundSampleFrame * _buf,
const fpp_t _frames );

View File

@@ -178,7 +178,7 @@ void kickerInstrument::deleteNotePluginData( notePlayHandle * _n )
instrumentView * kickerInstrument::createView( QWidget * _parent )
pluginView * kickerInstrument::instantiateView( QWidget * _parent )
{
return( new kickerInstrumentView( this, _parent ) );
}
@@ -255,7 +255,7 @@ extern "C"
{
// neccessary for getting instance out of shared lib
plugin * lmms_plugin_main( void * _data )
plugin * lmms_plugin_main( model *, void * _data )
{
return( new kickerInstrument(
static_cast<instrumentTrack *>( _data ) ) );

View File

@@ -27,6 +27,7 @@
#define _KICKER_H
#include "instrument.h"
#include "instrument_view.h"
#include "knob.h"
@@ -56,7 +57,7 @@ public:
return( 512 );
}
virtual instrumentView * createView( QWidget * _parent );
virtual pluginView * instantiateView( QWidget * _parent );
private:

View File

@@ -2,7 +2,7 @@
* ladspa_browser.cpp - dialog to display information about installed LADSPA
* plugins
*
* Copyright (c) 2006-2007 Danny McRae <khjklujn/at/users.sourceforge.net>
* Copyright (c) 2006-2008 Danny McRae <khjklujn/at/users.sourceforge.net>
*
* This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net
*
@@ -73,7 +73,32 @@ plugin * lmms_plugin_main( void * _data )
ladspaBrowser::ladspaBrowser( void ) :
tool( &ladspa_browser_plugin_descriptor )
tool( &ladspa_browser_plugin_descriptor, NULL )
{
}
ladspaBrowser::~ladspaBrowser()
{
}
QString ladspaBrowser::nodeName( void ) const
{
return( ladspa_browser_plugin_descriptor.name );
}
ladspaBrowserView::ladspaBrowserView( tool * _tool, QWidget * _parent ) :
toolView( _tool, _parent )
{
QHBoxLayout * hlayout = new QHBoxLayout( this );
hlayout->setSpacing( 0 );
@@ -160,22 +185,14 @@ ladspaBrowser::ladspaBrowser( void ) :
ladspaBrowser::~ladspaBrowser()
ladspaBrowserView::~ladspaBrowserView()
{
}
QString ladspaBrowser::nodeName( void ) const
{
return( ladspa_browser_plugin_descriptor.name );
}
QWidget * ladspaBrowser::createTab( QWidget * _parent, const QString & _txt,
QWidget * ladspaBrowserView::createTab( QWidget * _parent, const QString & _txt,
ladspaPluginType _type )
{
QWidget * tab = new QWidget( _parent );
@@ -205,7 +222,7 @@ QWidget * ladspaBrowser::createTab( QWidget * _parent, const QString & _txt,
void ladspaBrowser::showPorts( const ladspa_key_t & _key )
void ladspaBrowserView::showPorts( const ladspa_key_t & _key )
{
ladspaPortDialog ports( _key );
ports.exec();

View File

@@ -2,7 +2,7 @@
* ladspa_browser.h - dialog to display information about installed LADSPA
* plugins
*
* Copyright (c) 2006-2007 Danny McRae <khjklujn/at/users.sourceforge.net>
* Copyright (c) 2006-2008 Danny McRae <khjklujn/at/users.sourceforge.net>
*
* This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net
*
@@ -35,14 +35,12 @@
class tabBar;
class ladspaBrowser : public tool
class ladspaBrowserView : public toolView
{
Q_OBJECT
public:
ladspaBrowser( void );
virtual ~ladspaBrowser();
virtual QString nodeName( void ) const;
ladspaBrowserView( tool * _tool, QWidget * _parent );
virtual ~ladspaBrowserView();
public slots:
@@ -59,4 +57,20 @@ private:
} ;
class ladspaBrowser : public tool
{
public:
ladspaBrowser( void );
virtual ~ladspaBrowser();
virtual pluginView * instantiateView( QWidget * _parent )
{
return( new ladspaBrowserView( this, _parent ) );
}
virtual QString nodeName( void ) const;
} ;
#endif

View File

@@ -59,8 +59,9 @@ plugin::descriptor ladspaeffect_plugin_descriptor =
}
ladspaEffect::ladspaEffect( const descriptor::subPluginFeatures::key * _key ) :
effect( &ladspaeffect_plugin_descriptor, _key ),
ladspaEffect::ladspaEffect( model * _parent,
const descriptor::subPluginFeatures::key * _key ) :
effect( &ladspaeffect_plugin_descriptor, _parent, _key ),
m_effName( "none" ),
m_key( ladspaSubPluginFeatures::subPluginKeyToLadspaKey( _key )
/* ladspa_key_t( _cdata->settings.attribute( "label" ),
@@ -464,15 +465,13 @@ void FASTCALL ladspaEffect::setControl( Uint16 _control, LADSPA_Data _value )
}
#undef indexOf
extern "C"
{
// neccessary for getting instance out of shared lib
plugin * lmms_plugin_main( void * _data )
plugin * lmms_plugin_main( model * _parent, void * _data )
{
return( new ladspaEffect(
return( new ladspaEffect( _parent,
static_cast<const plugin::descriptor::subPluginFeatures::key *>(
_data ) ) );
}

View File

@@ -1,7 +1,7 @@
/*
* ladspa_effect.h - class for handling LADSPA effect plugins
*
* Copyright (c) 2006-2007 Danny McRae <khjklujn/at/users.sourceforge.net>
* Copyright (c) 2006-2008 Danny McRae <khjklujn/at/users.sourceforge.net>
*
* This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net
*
@@ -41,7 +41,8 @@ typedef QVector<port_desc_t *> multi_proc_t;
class ladspaEffect : public effect
{
public:
ladspaEffect( const descriptor::subPluginFeatures::key * _key );
ladspaEffect( model * _parent,
const descriptor::subPluginFeatures::key * _key );
virtual ~ladspaEffect();
virtual bool FASTCALL processAudioBuffer( surroundSampleFrame * _buf,
@@ -84,7 +85,7 @@ private:
Uint16 m_effectChannels;
Uint16 m_portCount;
fpp_t m_bufferSize;
const LADSPA_Descriptor * m_descriptor;
QVector<LADSPA_Handle> m_handles;

View File

@@ -58,8 +58,8 @@ plugin::descriptor malletsstk_plugin_descriptor =
}
malletsInstrument::malletsInstrument( instrumentTrack * _channel_track ):
instrument( _channel_track, &malletsstk_plugin_descriptor ),
malletsInstrument::malletsInstrument( instrumentTrack * _instrument_track ):
instrument( _instrument_track, &malletsstk_plugin_descriptor ),
m_hardnessModel(64.0f, 0.0f, 128.0f, 0.1f, this),
m_positionModel(64.0f, 0.0f, 128.0f, 0.1f, this),
m_vibratoGainModel(64.0f, 0.0f, 128.0f, 0.1f, this),
@@ -77,21 +77,21 @@ malletsInstrument::malletsInstrument( instrumentTrack * _channel_track ):
m_presetsModel(this),
m_spreadModel(0, 0, 255, 1, this)
{
m_hardnessModel.setTrack( _channel_track );
m_positionModel.setTrack( _channel_track );
m_vibratoGainModel.setTrack( _channel_track );
m_vibratoFreqModel.setTrack( _channel_track );
m_stickModel.setTrack( _channel_track );
m_modulatorModel.setTrack( _channel_track );
m_crossfadeModel.setTrack( _channel_track );
m_lfoSpeedModel.setTrack( _channel_track );
m_lfoDepthModel.setTrack( _channel_track );
m_adsrModel.setTrack( _channel_track );
m_pressureModel.setTrack( _channel_track );
m_motionModel.setTrack( _channel_track );
m_velocityModel.setTrack( _channel_track );
m_strikeModel.setTrack( _channel_track );
m_spreadModel.setTrack( _channel_track );
m_hardnessModel.setTrack( _instrument_track );
m_positionModel.setTrack( _instrument_track );
m_vibratoGainModel.setTrack( _instrument_track );
m_vibratoFreqModel.setTrack( _instrument_track );
m_stickModel.setTrack( _instrument_track );
m_modulatorModel.setTrack( _instrument_track );
m_crossfadeModel.setTrack( _instrument_track );
m_lfoSpeedModel.setTrack( _instrument_track );
m_lfoDepthModel.setTrack( _instrument_track );
m_adsrModel.setTrack( _instrument_track );
m_pressureModel.setTrack( _instrument_track );
m_motionModel.setTrack( _instrument_track );
m_velocityModel.setTrack( _instrument_track );
m_strikeModel.setTrack( _instrument_track );
m_spreadModel.setTrack( _instrument_track );
// ModalBar
m_presetsModel.addItem( tr( "Marimba" ) );
@@ -299,7 +299,7 @@ void malletsInstrument::deleteNotePluginData( notePlayHandle * _n )
instrumentView * malletsInstrument::createView( QWidget * _parent )
pluginView * malletsInstrument::instantiateView( QWidget * _parent )
{
return( new malletsInstrumentView( this, _parent ) );
}
@@ -307,7 +307,8 @@ instrumentView * malletsInstrument::createView( QWidget * _parent )
malletsInstrumentView::malletsInstrumentView( malletsInstrument * _instrument, QWidget * _parent ) :
malletsInstrumentView::malletsInstrumentView( malletsInstrument * _instrument,
QWidget * _parent ) :
instrumentView( _instrument, _parent )
{
_instrument->m_filesMissing =
@@ -673,7 +674,7 @@ extern "C"
{
// neccessary for getting instance out of shared lib
plugin * lmms_plugin_main( void * _data )
plugin * lmms_plugin_main( model *, void * _data )
{
return( new malletsInstrument( static_cast<instrumentTrack *>( _data ) ) );
}

View File

@@ -31,6 +31,7 @@
#include "combobox.h"
#include "instrument.h"
#include "instrument_view.h"
#include "knob.h"
#include "note_play_handle.h"
#include "led_checkbox.h"
@@ -133,7 +134,7 @@ public:
virtual QString nodeName( void ) const;
virtual instrumentView * createView( QWidget * _parent );
virtual pluginView * instantiateView( QWidget * _parent );
private:
knobModel m_hardnessModel;

View File

@@ -82,7 +82,7 @@ vstEffect::~vstEffect()
bool FASTCALL vstEffect::processAudioBuffer( surroundSampleFrame * _buf,
const fpp_t _frames )
{
if( isBypassed() || !isRunning () )
if( !isEnabled() || !isRunning () )
{
return( FALSE );
}

View File

@@ -3,7 +3,7 @@
/*
* audio_port.cpp - base-class for objects providing sound at a port
*
* Copyright (c) 2004-2007 Tobias Doerffel <tobydox/at/users.sourceforge.net>
* Copyright (c) 2004-2008 Tobias Doerffel <tobydox/at/users.sourceforge.net>
*
* This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net
*
@@ -33,7 +33,7 @@
#include "engine.h"
audioPort::audioPort( const QString & _name ) :
audioPort::audioPort( const QString & _name, track * _track ) :
m_bufferUsage( NONE ),
m_firstBuffer( new surroundSampleFrame[
engine::getMixer()->framesPerPeriod()] ),
@@ -42,7 +42,7 @@ audioPort::audioPort( const QString & _name ) :
m_extOutputEnabled( FALSE ),
m_nextFxChannel( -1 ),
m_name( "unnamed port" ),
m_effects( new effectChain ),
m_effects( this, _track ),
m_frames( engine::getMixer()->framesPerPeriod() )
{
engine::getMixer()->clearAudioBuffer( m_firstBuffer,
@@ -62,7 +62,6 @@ audioPort::~audioPort()
engine::getMixer()->removeAudioPort( this );
delete[] m_firstBuffer;
delete[] m_secondBuffer;
delete m_effects;
}

View File

@@ -25,25 +25,27 @@
*
*/
#include <QtGui/QMessageBox>
#include "effect.h"
#include "engine.h"
#include "dummy_effect.h"
#include "effect_chain.h"
#include "effect_view.h"
effect::effect( const plugin::descriptor * _desc,
model * _parent,
const descriptor::subPluginFeatures::key * _key ) :
plugin( _desc ),
plugin( _desc, _parent ),
m_key( _key ? *_key : descriptor::subPluginFeatures::key() ),
m_okay( TRUE ),
m_noRun( FALSE ),
m_running( FALSE ),
m_enabledModel( FALSE, FALSE, TRUE ),
m_bufferCount( 0 ),
m_silenceTimeout( 10 ),
m_wetDryModel( 1.0f, 0.0f, 1.0f, 0.01f ),
m_gateModel( 0.0f, 0.0f, 1.0f, 0.01f )
m_enabledModel( TRUE, FALSE, TRUE, boolModel::defaultRelStep(), this ),
m_wetDryModel( 1.0f, 0.0f, 1.0f, 0.01f, this ),
m_gateModel( 0.0f, 0.0f, 1.0f, 0.01f, this ),
m_autoQuitModel( 1.0f, 1.0f, 8000.0f, 100.0f, this )
{
}
@@ -57,7 +59,45 @@ effect::~effect()
bool FASTCALL effect::processAudioBuffer( surroundSampleFrame * _buf,
void effect::saveSettings( QDomDocument & _doc, QDomElement & _this )
{
_this.setAttribute( "on", m_enabledModel.value() );
_this.setAttribute( "wet", m_wetDryModel.value() );
_this.setAttribute( "autoquit", m_autoQuitModel.value() );
_this.setAttribute( "gate", m_gateModel.value() );
// m_controlView->saveState( _doc, _this );
}
void effect::loadSettings( const QDomElement & _this )
{
m_enabledModel.setValue( _this.attribute( "on" ).toInt() );
m_wetDryModel.setValue( _this.attribute( "wet" ).toFloat() );
m_autoQuitModel.setValue( _this.attribute( "autoquit" ).toFloat() );
m_gateModel.setValue( _this.attribute( "gate" ).toFloat() );
/*
QDomNode node = _this.firstChild();
while( !node.isNull() )
{
if( node.isElement() )
{
if( m_controlView->nodeName() == node.nodeName() )
{
m_controlView->restoreState(
node.toElement() );
}
}
node = node.nextSibling();
}*/
}
bool effect::processAudioBuffer( surroundSampleFrame * _buf,
const fpp_t _frames )
{
return( FALSE );
@@ -65,18 +105,12 @@ bool FASTCALL effect::processAudioBuffer( surroundSampleFrame * _buf,
/*
void FASTCALL effect::setGate( float _level )
{
m_gate = _level * _level * m_processors *
engine::getMixer()->framesPerPeriod();
}
*/
effect * effect::instantiate( const QString & _plugin_name,
model * _parent,
descriptor::subPluginFeatures::key * _key )
{
plugin * p = plugin::instantiate( _plugin_name, _key );
plugin * p = plugin::instantiate( _plugin_name, _parent, _key );
// check whether instantiated plugin is an instrument
if( dynamic_cast<effect *>( p ) != NULL )
{
@@ -86,9 +120,16 @@ effect * effect::instantiate( const QString & _plugin_name,
// not quite... so delete plugin and return dummy instrument
delete p;
return( new dummyEffect() );
return( new dummyEffect( _parent ) );
}
pluginView * effect::instantiateView( QWidget * _parent )
{
return( new effectView( this, _parent ) );
}
#endif

View File

@@ -4,6 +4,7 @@
* effect_chain.cpp - class for processing and effects chain
*
* Copyright (c) 2006-2008 Danny McRae <khjklujn/at/users.sourceforge.net>
* Copyright (c) 2008 Tobias Doerffel <tobydox/at/users.sourceforge.net>
*
* This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net
*
@@ -31,7 +32,10 @@
effectChain::effectChain( void ) :
effectChain::effectChain( audioPort * _port, track * _track ) :
model( /*_track*/ NULL ),
m_port( _port ),
m_track( _track ),
m_enabledModel( FALSE, FALSE, TRUE )
{
}
@@ -41,26 +45,89 @@ effectChain::effectChain( void ) :
effectChain::~effectChain()
{
for( effect_list_t::size_type eff = 0; eff < m_effects.count(); eff++ )
deleteAllPlugins();
}
void effectChain::saveSettings( QDomDocument & _doc, QDomElement & _this )
{
_this.setAttribute( "fxenabled", m_enabledModel.value() );
_this.setAttribute( "numofeffects", m_effects.count() );
for( effectList::iterator it = m_effects.begin();
it != m_effects.end(); it++ )
{
delete m_effects[eff];
QDomElement ef = ( *it )->saveState( _doc, _this );
ef.setAttribute( "name", ( *it )->getDescriptor()->name );
ef.setAttribute( "key", ( *it )->getKey().dumpBase64() );
}
}
void effectChain::loadSettings( const QDomElement & _this )
{
// deleteAllPlugins();
for( int i = 0; i < m_effects.count(); ++i )
{
delete m_effects[i];
}
m_effects.clear();
m_enabledModel.setValue( _this.attribute( "fxenabled" ).toInt() );
const int plugin_cnt = _this.attribute( "numofeffects" ).toInt();
QDomNode node = _this.firstChild();
for( int i = 0; i < plugin_cnt; i++ )
{
if( node.isElement() && node.nodeName() == "effect" )
{
QDomElement cn = node.toElement();
const QString name = cn.attribute( "name" );
// we have this really convenient key-ctor
// which takes a QString and decodes the
// base64-data inside :-)
effectKey key( cn.attribute( "key" ) );
effect * e = effect::instantiate( name, this, &key );
m_effects.push_back( e );
// TODO: somehow detect if effect is sub-plugin-capable
// but couldn't load sub-plugin with requsted key
if( node.isElement() )
{
if( e->nodeName() == node.nodeName() )
{
e->restoreState( node.toElement() );
}
}
}
node = node.nextSibling();
}
emit dataChanged();
}
void FASTCALL effectChain::appendEffect( effect * _effect )
void effectChain::appendEffect( effect * _effect )
{
engine::getMixer()->lock();
_effect->m_enabledModel.setTrack( m_track );
_effect->m_wetDryModel.setTrack( m_track );
_effect->m_gateModel.setTrack( m_track );
_effect->m_autoQuitModel.setTrack( m_track );
m_effects.append( _effect );
engine::getMixer()->unlock();
emit dataChanged();
}
void FASTCALL effectChain::removeEffect( effect * _effect )
void effectChain::removeEffect( effect * _effect )
{
engine::getMixer()->lock();
m_effects.erase( qFind( m_effects.begin(), m_effects.end(), _effect ) );
@@ -70,12 +137,12 @@ void FASTCALL effectChain::removeEffect( effect * _effect )
void FASTCALL effectChain::moveDown( effect * _effect )
void effectChain::moveDown( effect * _effect )
{
if( _effect != m_effects.last() )
{
int i = 0;
for( effect_list_t::iterator it = m_effects.begin();
for( effectList::iterator it = m_effects.begin();
it != m_effects.end(); it++, i++ )
{
if( *it == _effect )
@@ -93,12 +160,12 @@ void FASTCALL effectChain::moveDown( effect * _effect )
void FASTCALL effectChain::moveUp( effect * _effect )
void effectChain::moveUp( effect * _effect )
{
if( _effect != m_effects.first() )
{
int i = 0;
for( effect_list_t::iterator it = m_effects.begin();
for( effectList::iterator it = m_effects.begin();
it != m_effects.end(); it++, i++ )
{
if( *it == _effect )
@@ -116,7 +183,7 @@ void FASTCALL effectChain::moveUp( effect * _effect )
bool FASTCALL effectChain::processAudioBuffer( surroundSampleFrame * _buf,
bool effectChain::processAudioBuffer( surroundSampleFrame * _buf,
const fpp_t _frames )
{
if( m_enabledModel.value() == FALSE )
@@ -124,7 +191,7 @@ bool FASTCALL effectChain::processAudioBuffer( surroundSampleFrame * _buf,
return( FALSE );
}
bool more_effects = FALSE;
for( effect_list_t::iterator it = m_effects.begin();
for( effectList::iterator it = m_effects.begin();
it != m_effects.end(); it++ )
{
more_effects |= ( *it )->processAudioBuffer( _buf, _frames );
@@ -142,7 +209,7 @@ void effectChain::startRunning( void )
return;
}
for( effect_list_t::iterator it = m_effects.begin();
for( effectList::iterator it = m_effects.begin();
it != m_effects.end(); it++ )
{
( *it )->startRunning();
@@ -161,7 +228,7 @@ bool effectChain::isRunning( void )
bool running = FALSE;
for( effect_list_t::iterator it = m_effects.begin();
for( effectList::iterator it = m_effects.begin();
it != m_effects.end() || !running; it++ )
{
running = ( *it )->isRunning() && running;
@@ -170,4 +237,16 @@ bool effectChain::isRunning( void )
}
void effectChain::deleteAllPlugins( void )
{
for( int i = 0; i < m_effects.count(); ++i )
{
delete m_effects[i];
}
m_effects.clear();
}
#endif

View File

@@ -35,6 +35,7 @@
effectControlDialog::effectControlDialog( QWidget * _parent, effect * _eff ) :
QWidget( _parent ),
modelView( _eff ),
m_effect( _eff )
{
setWindowTitle( m_effect->publicName() );

View File

@@ -47,7 +47,7 @@ effectSelectDialog::effectSelectDialog( QWidget * _parent ) :
vlayout->setSpacing( 10 );
vlayout->setMargin( 10 );
effectList * elist = new effectList( this );
effectListWidget * elist = new effectListWidget( this );
elist->setMinimumSize( 500, 400 );
connect( elist, SIGNAL( doubleClicked( const effectKey & ) ),
this, SLOT( selectPlugin() ) );
@@ -107,11 +107,12 @@ effectSelectDialog::~effectSelectDialog()
effect * effectSelectDialog::instantiateSelectedPlugin( void )
effect * effectSelectDialog::instantiateSelectedPlugin( effectChain * _parent )
{
if( !m_currentSelection.name.isEmpty() && m_currentSelection.desc )
{
return( effect::instantiate( m_currentSelection.desc->name,
_parent,
&m_currentSelection ) );
}
return( NULL );
@@ -148,7 +149,7 @@ void effectSelectDialog::selectPlugin( void )
effectList::effectList( QWidget * _parent ) :
effectListWidget::effectListWidget( QWidget * _parent ) :
QWidget( _parent ),
m_descriptionWidget( NULL )
{
@@ -226,14 +227,14 @@ effectList::effectList( QWidget * _parent ) :
effectList::~effectList()
effectListWidget::~effectListWidget()
{
}
void effectList::rowChanged( int _pluginIndex )
void effectListWidget::rowChanged( int _pluginIndex )
{
delete m_descriptionWidget;
m_descriptionWidget = NULL;
@@ -268,7 +269,7 @@ void effectList::rowChanged( int _pluginIndex )
void effectList::onDoubleClicked( QListWidgetItem * _item )
void effectListWidget::onDoubleClicked( QListWidgetItem * _item )
{
emit( doubleClicked( m_currentSelection ) );
}
@@ -276,7 +277,7 @@ void effectList::onDoubleClicked( QListWidgetItem * _item )
void effectList::onAddButtonReleased()
void effectListWidget::onAddButtonReleased()
{
emit( addPlugin( m_currentSelection ) );
}
@@ -284,7 +285,7 @@ void effectList::onAddButtonReleased()
void effectList::resizeEvent( QResizeEvent * )
void effectListWidget::resizeEvent( QResizeEvent * )
{
//m_descriptionWidget->setFixedWidth( width() - 40 );
}

View File

@@ -1,154 +0,0 @@
#ifndef SINGLE_SOURCE_COMPILE
/*
* effect_tab_widget.cpp - tab-widget in channel-track-window for setting up
* effects
*
* Copyright (c) 2006-2008 Danny McRae <khjklujn/at/users.sourceforge.net>
*
* This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program (see COPYING); if not, write to the
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301 USA.
*
*/
#include "effect_tab_widget.h"
#include <QtGui/QMenu>
#include <QtGui/QToolButton>
#include "audio_port.h"
#include "effect_select_dialog.h"
#include "embed.h"
#include "group_box.h"
#include "instrument_track.h"
#include "rack_plugin.h"
#include "rack_view.h"
#include "sample_track.h"
#include "tooltip.h"
#include "automatable_model_templates.h"
effectTabWidget::effectTabWidget( instrumentTrack * _track,
audioPort * _port ) :
QWidget( _track->tabWidgetParent() ),
m_track( dynamic_cast<track *>( _track ) ),
m_port( _port )
{
m_port->getEffects()->m_enabledModel.setTrack( m_track );
setupWidget();
}
effectTabWidget::effectTabWidget( QWidget * _parent,
sampleTrack * _track,
audioPort * _port ) :
QWidget( _parent ),
m_track( dynamic_cast<track *>( _track ) ),
m_port( _port )
{
m_port->getEffects()->m_enabledModel.setTrack( m_track );
setupWidget();
}
effectTabWidget::~effectTabWidget()
{
}
void effectTabWidget::setupWidget( void )
{
m_effectsGroupBox = new groupBox( tr( "EFFECTS CHAIN" ), this );
m_effectsGroupBox->setModel( &m_port->getEffects()->m_enabledModel );
m_effectsGroupBox->setGeometry( 2, 2, 242, 244 );
m_rack = new rackView( m_effectsGroupBox, m_track, m_port );
m_rack->move( 6, 22 );
m_addButton = new QPushButton( m_effectsGroupBox/*, "Add Effect"*/ );
m_addButton->setText( tr( "Add" ) );
m_addButton->move( 75, 210 );
connect( m_addButton, SIGNAL( clicked( void ) ),
this, SLOT( addEffect( void ) ) );
}
void effectTabWidget::saveSettings( QDomDocument & _doc, QDomElement & _this )
{
_this.setAttribute( "fxenabled",
m_port->getEffects()->m_enabledModel.value() );
m_rack->saveState( _doc, _this );
}
void effectTabWidget::loadSettings( const QDomElement & _this )
{
m_port->getEffects()->m_enabledModel.setValue(
_this.attribute( "fxenabled" ).toInt() );
QDomNode node = _this.firstChild();
while( !node.isNull() )
{
if( node.isElement() )
{
if( m_rack->nodeName() == node.nodeName() )
{
m_rack->restoreState( node.toElement() );
}
}
node = node.nextSibling();
}
}
void effectTabWidget::addEffect( void )
{
effectSelectDialog esd( this );
esd.exec();
if( esd.result() == QDialog::Rejected )
{
return;
}
effect * e = esd.instantiateSelectedPlugin();
m_rack->addEffect( e );
}
#include "effect_tab_widget.moc"
#endif

View File

@@ -36,7 +36,7 @@
importFilter::importFilter( const QString & _file_name,
const descriptor * _descriptor ) :
plugin( _descriptor ),
plugin( _descriptor, NULL ),
m_file( _file_name )
{
}
@@ -70,7 +70,7 @@ void importFilter::import( const QString & _file_to_import,
{
if( it->type == plugin::ImportFilter )
{
plugin * p = plugin::instantiate( it->name, s );
plugin * p = plugin::instantiate( it->name, NULL, s );
if( dynamic_cast<importFilter *>( p ) != NULL &&
dynamic_cast<importFilter *>( p )->tryImport(
_tc ) == TRUE )

View File

@@ -26,6 +26,7 @@
#include "instrument.h"
#include "instrument_view.h"
#include "automatable_model_templates.h"
#include "instrument_track.h"
#include "dummy_instrument.h"
@@ -34,8 +35,7 @@
instrument::instrument( instrumentTrack * _instrument_track,
const descriptor * _descriptor ) :
plugin( _descriptor ),
model( /* _instrument_track */ NULL ),
plugin( _descriptor, NULL/* _instrument_track*/ ),
m_instrumentTrack( _instrument_track )
{
}
@@ -82,7 +82,8 @@ f_cnt_t instrument::beatLen( notePlayHandle * ) const
instrument * instrument::instantiate( const QString & _plugin_name,
instrumentTrack * _instrument_track )
{
plugin * p = plugin::instantiate( _plugin_name, _instrument_track );
plugin * p = plugin::instantiate( _plugin_name, /*_instrument_track*/ NULL,
_instrument_track );
// check whether instantiated plugin is an instrument
if( dynamic_cast<instrument *>( p ) != NULL )
{
@@ -105,16 +106,6 @@ bool instrument::isFromTrack( const track * _track ) const
instrumentView * instrument::createEditor( QWidget * _parent )
{
instrumentView * i = createView( _parent );
i->setModel( this );
return( i );
}
void instrument::applyRelease( sampleFrame * buf, const notePlayHandle * _n )
{
const fpp_t frames = _n->framesLeftForCurrentPeriod();
@@ -144,8 +135,7 @@ void instrument::applyRelease( sampleFrame * buf, const notePlayHandle * _n )
instrumentView::instrumentView( instrument * _instrument, QWidget * _parent ) :
QWidget( _parent ),
modelView()
pluginView( _instrument, _parent )
{
setModel( _instrument );
setFixedSize( 250, 250 );

View File

@@ -57,6 +57,7 @@
#include "side_bar.h"
#include "config_mgr.h"
#include "mixer.h"
#include "plugin_view.h"
#include "project_notes.h"
#include "setup_dialog.h"
#include "audio_dummy.h"
@@ -76,7 +77,7 @@ mainWindow::mainWindow( void ) :
m_workspace( NULL ),
m_templatesMenu( NULL ),
m_recentlyOpenedProjectsMenu( NULL ),
m_tools_menu( NULL ),
m_toolsMenu( NULL ),
m_modified( FALSE )
{
setAttribute( Qt::WA_DeleteOnClose );
@@ -421,7 +422,7 @@ void mainWindow::finalize( void )
configManager::inst(), SLOT( exec() ) );
m_tools_menu = new QMenu( this );
m_toolsMenu = new QMenu( this );
QVector<plugin::descriptor> pluginDescriptors;
plugin::getDescriptorsOfAvailPlugins( pluginDescriptors );
for( QVector<plugin::descriptor>::iterator it =
@@ -430,14 +431,15 @@ void mainWindow::finalize( void )
{
if( it->type == plugin::Tool )
{
m_tools_menu->addAction( *it->logo, it->public_name );
m_tools.push_back( tool::instantiate( it->name ) );
m_toolsMenu->addAction( *it->logo, it->public_name );
m_tools.push_back( tool::instantiate( it->name,
/*this*/NULL )->createView( this ) );
}
}
if( !m_tools_menu->isEmpty() )
if( !m_toolsMenu->isEmpty() )
{
menuBar()->addMenu( m_tools_menu )->setText( tr( "&Tools" ) );
connect( m_tools_menu, SIGNAL( triggered( QAction * ) ),
menuBar()->addMenu( m_toolsMenu )->setText( tr( "&Tools" ) );
connect( m_toolsMenu, SIGNAL( triggered( QAction * ) ),
this, SLOT( showTool( QAction * ) ) );
}
@@ -954,13 +956,13 @@ void mainWindow::fillTemplatesMenu( void )
void mainWindow::showTool( QAction * _idx )
{
tool * t = m_tools[m_tools_menu->actions().indexOf( _idx )];
t->show();
pluginView * p = m_tools[m_toolsMenu->actions().indexOf( _idx )];
p->show();
if( m_workspace )
{
t->parentWidget()->show();
p->parentWidget()->show();
}
t->setFocus();
p->setFocus();
}

View File

@@ -53,7 +53,9 @@ static plugin::descriptor dummy_plugin_descriptor =
plugin::plugin( const descriptor * _descriptor ) :
plugin::plugin( const descriptor * _descriptor, model * _parent ) :
journallingObject(),
model( _parent ),
m_descriptor( _descriptor )
{
if( dummy_plugin_descriptor.logo == NULL )
@@ -92,7 +94,8 @@ QString plugin::getParameter( const QString & )
plugin * plugin::instantiate( const QString & _plugin_name, void * _data )
plugin * plugin::instantiate( const QString & _plugin_name, model * _parent,
void * _data )
{
QLibrary plugin_lib( configManager::inst()->pluginDir() +
_plugin_name );
@@ -118,7 +121,7 @@ plugin * plugin::instantiate( const QString & _plugin_name, void * _data )
QMessageBox::Default );
return( new dummyPlugin() );
}
plugin * inst = inst_hook( _data );
plugin * inst = inst_hook( _parent, _data );
return( inst );
}
@@ -175,5 +178,17 @@ void plugin::getDescriptorsOfAvailPlugins( QVector<descriptor> & _plugin_descs )
pluginView * plugin::createView( QWidget * _parent )
{
pluginView * pv = instantiateView( _parent );
if( pv != NULL )
{
pv->setModel( this );
}
return( pv );
}
#endif

View File

@@ -42,7 +42,7 @@ samplePlayHandle::samplePlayHandle( const QString & _sample_file ) :
m_sampleBuffer( new sampleBuffer( _sample_file ) ),
m_doneMayReturnTrue( TRUE ),
m_frame( 0 ),
m_audioPort( new audioPort( "samplePlayHandle" ) ),
m_audioPort( new audioPort( "samplePlayHandle", NULL ) ),
m_ownAudioPort( TRUE ),
m_defaultVolumeModel( 1.0f, 0.0f, 4.0f, 0.001f/* this*/ ),
m_volumeModel( &m_defaultVolumeModel ),
@@ -59,7 +59,7 @@ samplePlayHandle::samplePlayHandle( sampleBuffer * _sample_buffer ) :
m_sampleBuffer( sharedObject::ref( _sample_buffer ) ),
m_doneMayReturnTrue( TRUE ),
m_frame( 0 ),
m_audioPort( new audioPort( "samplePlayHandle" ) ),
m_audioPort( new audioPort( "samplePlayHandle", NULL ) ),
m_ownAudioPort( TRUE ),
m_defaultVolumeModel( 1.0f, 0.0f, 4.0f, 0.001f/* this*/ ),
m_volumeModel( &m_defaultVolumeModel ),

View File

@@ -4,7 +4,7 @@
* surround_area.cpp - a widget for setting position of a channel +
* calculation of volume for each speaker
*
* Copyright (c) 2004-2007 Tobias Doerffel <tobydox/at/users.sourceforge.net>
* Copyright (c) 2004-2008 Tobias Doerffel <tobydox/at/users.sourceforge.net>
*
* This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net
*
@@ -50,10 +50,8 @@ QPixmap * surroundArea::s_backgroundArtwork = NULL;
surroundArea::surroundArea( QWidget * _parent, const QString & _name ) :
QWidget( _parent ),
modelView()
modelView( new surroundAreaModel( NULL, NULL, TRUE ) )
{
setModel( new surroundAreaModel( NULL, NULL, TRUE ) );
if( s_backgroundArtwork == NULL )
{
s_backgroundArtwork = new QPixmap( embed::getIconPixmap(

View File

@@ -36,23 +36,9 @@
tool::tool( const descriptor * _descriptor ) :
plugin( _descriptor )
tool::tool( const descriptor * _descriptor, model * _parent ) :
plugin( _descriptor, _parent )
{
QWidget * window;
if( engine::getMainWindow()->workspace() )
{
engine::getMainWindow()->workspace()->addSubWindow( this );
window = parentWidget();
window->setAttribute( Qt::WA_DeleteOnClose, FALSE );
}
else
{
window = this;
}
window->setWindowTitle( _descriptor->public_name );
window->setWindowIcon( *_descriptor->logo );
}
@@ -65,11 +51,11 @@ tool::~tool()
tool * tool::instantiate( const QString & _plugin_name )
tool * tool::instantiate( const QString & _plugin_name, model * _parent )
{
plugin * p = plugin::instantiate( _plugin_name, NULL );
// check whether instantiated plugin is an instrument
if( dynamic_cast<tool *>( p ) != NULL )
plugin * p = plugin::instantiate( _plugin_name, _parent, NULL );
// check whether instantiated plugin is a tool
if( p->type() == Tool )
{
// everything ok, so return pointer
return( dynamic_cast<tool *>( p ) );
@@ -83,4 +69,25 @@ tool * tool::instantiate( const QString & _plugin_name )
toolView::toolView( tool * _tool, QWidget * _parent ) :
pluginView( _tool, _parent )
{
QWidget * window;
if( engine::getMainWindow()->workspace() )
{
engine::getMainWindow()->workspace()->addSubWindow( this );
window = parentWidget();
window->setAttribute( Qt::WA_DeleteOnClose, FALSE );
}
else
{
window = this;
}
window->setWindowTitle( _tool->publicName() );
window->setWindowIcon( *_tool->getDescriptor()->logo );
}
#endif

View File

@@ -50,7 +50,7 @@
#include "debug.h"
#include "effect_board.h"
#include "effect_chain.h"
#include "effect_tab_widget.h"
#include "effect_rack_view.h"
#include "embed.h"
#include "engine.h"
#include "envelope_tab_widget.h"
@@ -66,6 +66,7 @@
#include "note_play_handle.h"
#include "pattern.h"
#include "piano_widget.h"
#include "plugin_view.h"
#include "sample_play_handle.h"
#include "song_editor.h"
#include "string_pair_drag.h"
@@ -100,7 +101,7 @@ instrumentTrack::instrumentTrack( trackContainer * _tc ) :
m_trackType( INSTRUMENT_TRACK ),
m_midiPort( engine::getMixer()->getMIDIClient()->addPort( this,
tr( "unnamed_channel" ) ) ),
m_audioPort( new audioPort( tr( "unnamed_channel" ) ) ),
m_audioPort( tr( "unnamed_channel" ), this ),
m_notes(),
m_baseNoteModel( 0, 0, NOTES_PER_OCTAVE * OCTAVES - 1, 1/* this */ ),
m_volumeModel( DEFAULT_VOLUME, MIN_VOLUME, MAX_VOLUME,
@@ -109,7 +110,9 @@ instrumentTrack::instrumentTrack( trackContainer * _tc ) :
m_effectChannelModel( DEFAULT_EFFECT_CHANNEL,
MIN_EFFECT_CHANNEL, MAX_EFFECT_CHANNEL
/* this */ ),
// m_effects( /* this */ NULL ),
m_instrument( NULL ),
m_instrumentView( NULL ),
m_midiInputAction( NULL ),
m_midiOutputAction( NULL )
{
@@ -248,10 +251,11 @@ instrumentTrack::instrumentTrack( trackContainer * _tc ) :
m_envWidget = new envelopeTabWidget( this );
m_arpWidget = new arpAndChordsTabWidget( this );
m_midiWidget = new midiTabWidget( this, m_midiPort );
m_effWidget = new effectTabWidget( this, m_audioPort );
m_effectRack = new effectRackView( m_audioPort.getEffects(),
m_tabWidget );
m_tabWidget->addTab( m_envWidget, tr( "ENV/LFO/FILTER" ), 1 );
m_tabWidget->addTab( m_arpWidget, tr( "ARP/CHORD" ), 2 );
m_tabWidget->addTab( m_effWidget, tr( "FX" ), 3 );
m_tabWidget->addTab( m_effectRack, tr( "FX" ), 3 );
m_tabWidget->addTab( m_midiWidget, tr( "MIDI" ), 4 );
// setup piano-widget
@@ -323,8 +327,7 @@ instrumentTrack::instrumentTrack( trackContainer * _tc ) :
instrumentTrack::~instrumentTrack()
{
engine::getMixer()->removePlayHandles( this );
delete m_effWidget;
delete m_audioPort;
delete m_effectRack;
engine::getMixer()->getMIDIClient()->removePort( m_midiPort );
if( engine::getMainWindow()->workspace() )
@@ -450,7 +453,7 @@ void instrumentTrack::processAudioBuffer( sampleFrame * _buf,
}
float v_scale = (float) getVolume() / DEFAULT_VOLUME;
m_audioPort->getEffects()->startRunning();
m_audioPort.getEffects()->startRunning();
// instruments using instrument-play-handles will call this method
// without any knowledge about notes, so they pass NULL for _n, which
@@ -465,7 +468,7 @@ void instrumentTrack::processAudioBuffer( sampleFrame * _buf,
engine::getMixer()->bufferToPort( _buf,
( _n != NULL ) ? tMin<f_cnt_t>( _n->framesLeftForCurrentPeriod(), _frames ) :
_frames,
( _n != NULL ) ? _n->offset() : 0, v, m_audioPort );
( _n != NULL ) ? _n->offset() : 0, v, &m_audioPort );
}
@@ -664,7 +667,7 @@ void instrumentTrack::playNote( notePlayHandle * _n, bool _try_parallelizing )
// in last period and have
// to clear parts of it
_n->noteOff();
engine::getMixer()->clearAudioBuffer( m_audioPort->firstBuffer(),
engine::getMixer()->clearAudioBuffer( m_audioPort.firstBuffer(),
engine::getMixer()->framesPerPeriod() -
( *youngest_note )->offset(),
( *youngest_note )->offset() );
@@ -749,7 +752,7 @@ void instrumentTrack::setName( const QString & _new_name )
#endif
m_tswInstrumentTrackButton->setText( m_name );
m_midiPort->setName( m_name );
m_audioPort->setName( m_name );
m_audioPort.setName( m_name );
}
@@ -969,7 +972,7 @@ void instrumentTrack::saveTrackSpecificSettings( QDomDocument & _doc,
m_envWidget->saveState( _doc, _this );
m_arpWidget->saveState( _doc, _this );
m_midiWidget->saveState( _doc, _this );
m_effWidget->saveState( _doc, _this );
m_audioPort.getEffects()->saveState( _doc, _this );
}
@@ -990,7 +993,8 @@ void instrumentTrack::loadTrackSpecificSettings( const QDomElement & _this )
if( _this.hasAttribute( "baseoct" ) )
{
// TODO: move this compat code to mmp.cpp -> upgrade()
m_baseNoteModel.setInitValue( _this.attribute( "baseoct" ).toInt()
m_baseNoteModel.setInitValue( _this.
attribute( "baseoct" ).toInt()
* NOTES_PER_OCTAVE
+ _this.attribute( "basetone" ).toInt() );
}
@@ -1020,9 +1024,11 @@ void instrumentTrack::loadTrackSpecificSettings( const QDomElement & _this )
{
m_midiWidget->restoreState( node.toElement() );
}
else if( m_effWidget->nodeName() == node.nodeName() )
else if( m_audioPort.getEffects()->nodeName() ==
node.nodeName() )
{
m_effWidget->restoreState( node.toElement() );
m_audioPort.getEffects()->restoreState(
node.toElement() );
had_fx = TRUE;
}
else if( automationPattern::classNodeName()
@@ -1031,6 +1037,7 @@ void instrumentTrack::loadTrackSpecificSettings( const QDomElement & _this )
// if node-name doesn't match any known one,
// we assume that it is an instrument-plugin
// which we'll try to load
delete m_instrumentView;
delete m_instrument;
m_instrument = instrument::instantiate(
node.nodeName(), this );
@@ -1040,16 +1047,18 @@ void instrumentTrack::loadTrackSpecificSettings( const QDomElement & _this )
m_instrument->restoreState(
node.toElement() );
}
m_tabWidget->addTab( m_instrument->
createEditor( m_tabWidget ),
m_instrumentView = m_instrument->
createView( m_tabWidget );
m_tabWidget->addTab( m_instrumentView,
tr( "PLUGIN" ), 0 );
}
}
node = node.nextSibling();
}
// TODO: why not move above without any condition??
if( !had_fx )
{
m_effWidget->deleteAllEffects();
m_audioPort.getEffects()->deleteAllPlugins();
}
engine::getMixer()->unlock();
@@ -1072,12 +1081,13 @@ instrument * instrumentTrack::loadInstrument( const QString & _plugin_name )
invalidateAllMyNPH();
engine::getMixer()->lock();
delete m_instrumentView;
delete m_instrument;
m_instrument = instrument::instantiate( _plugin_name, this );
engine::getMixer()->unlock();
m_tabWidget->addTab( m_instrument->createEditor( m_tabWidget ),
tr( "PLUGIN" ), 0 );
m_instrumentView = m_instrument->createView( m_tabWidget );
m_tabWidget->addTab( m_instrumentView, tr( "PLUGIN" ), 0 );
m_tabWidget->setActiveTab( 0 );
m_tswInstrumentTrackButton->update();

View File

@@ -330,7 +330,7 @@ void sampleTCOSettingsDialog::setSampleFile( const QString & _f )
sampleTrack::sampleTrack( trackContainer * _tc ) :
track( _tc ),
m_audioPort( new audioPort( tr( "Sample track" ) ) ),
m_audioPort( tr( "Sample track" ), this ),
m_volumeModel( DEFAULT_VOLUME, MIN_VOLUME, MAX_VOLUME, 1/*, this*/ )
{
m_volumeModel.setTrack( this );
@@ -372,7 +372,6 @@ sampleTrack::~sampleTrack()
}
engine::getMixer()->removePlayHandles( this );
delete m_audioPort;
}
@@ -393,7 +392,7 @@ bool FASTCALL sampleTrack::play( const midiTime & _start,
{
sendMidiTime( _start );
m_audioPort->getEffects()->startRunning();
m_audioPort.getEffects()->startRunning();
bool played_a_note = FALSE; // will be return variable
for( int i = 0; i < numOfTCOs(); ++i )
@@ -436,7 +435,7 @@ void sampleTrack::saveTrackSpecificSettings( QDomDocument & _doc,
QDomElement & _this )
{
_this.setAttribute( "name", m_trackLabel->text() );
m_trackLabel->saveState( _doc, _this );
m_audioPort.getEffects()->saveState( _doc, _this );
#if 0
_this.setAttribute( "icon", m_trackLabel->pixmapFile() );
#endif
@@ -454,9 +453,11 @@ void sampleTrack::loadTrackSpecificSettings( const QDomElement & _this )
{
if( node.isElement() )
{
if( m_trackLabel->nodeName() == node.nodeName() )
if( m_audioPort.getEffects()->nodeName() ==
node.nodeName() )
{
m_trackLabel->restoreState( node.toElement() );
m_audioPort.getEffects()->restoreState(
node.toElement() );
}
}
node = node.nextSibling();

View File

@@ -41,10 +41,10 @@
automatableButton::automatableButton( QWidget * _parent,
const QString & _name ) :
QPushButton( _parent ),
autoModelView(),
autoModelView( new autoModel( FALSE, FALSE, TRUE,
autoModel::defaultRelStep(), NULL, TRUE ) ),
m_group( NULL )
{
setModel( new autoModel( FALSE, FALSE, TRUE, 1, NULL, TRUE ) );
setAccessibleName( _name );
}
@@ -165,9 +165,8 @@ void automatableButton::toggle( void )
automatableButtonGroup::automatableButtonGroup( QWidget * _parent,
const QString & _name ) :
QWidget( _parent ),
autoModelView()
autoModelView( new autoModel( 0, 0, 0, 1, NULL, TRUE ) )
{
setModel( new autoModel( 0, 0, 0, 1, NULL, TRUE ) );
hide();
setAccessibleName( _name );
}

View File

@@ -4,7 +4,7 @@
* automatable_slider.cpp - implementation of class automatableSlider
*
* Copyright (c) 2006-2007 Javier Serrano Polo <jasp00/at/users.sourceforge.net>
* Copyright (c) 2007 Tobias Doerffel <tobydox/at/users.sourceforge.net>
* Copyright (c) 2007-2008 Tobias Doerffel <tobydox/at/users.sourceforge.net>
*
* This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net
*
@@ -41,10 +41,9 @@
automatableSlider::automatableSlider( QWidget * _parent, const QString & _name ) :
QSlider( _parent ),
autoModelView(),
autoModelView( new autoModel( 0, 0, 0, 1, NULL, TRUE ) ),
m_showStatus( FALSE )
{
setModel( new autoModel( 0, 0, 0, 1, NULL, TRUE ) );
setAccessibleName( _name );
connect( this, SIGNAL( valueChanged( int ) ),

View File

@@ -47,11 +47,10 @@ const int CB_ARROW_BTN_WIDTH = 20;
comboBox::comboBox( QWidget * _parent, const QString & _name ) :
QWidget( _parent ),
autoModelView(),
autoModelView( new comboBoxModel ),
m_menu( this ),
m_pressed( FALSE )
{
setModel( new comboBoxModel );
if( s_background == NULL )
{
s_background = new QPixmap( embed::getIconPixmap(

View File

@@ -5,6 +5,7 @@
* offers access to an effect rack
*
* Copyright (c) 2006-2007 Danny McRae <khjklujn/at/users.sourceforge.net>
* Copyright (c) 2008 Tobias Doerffel <tobydox/at/users.sourceforge.net>
*
* This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net
*
@@ -29,12 +30,13 @@
#include "effect_label.h"
#include <QtGui/QLabel>
#include <QtGui/QLayout>
#include <QtGui/QMdiArea>
#include <QtGui/QMouseEvent>
#include <QtGui/QPushButton>
#include <QtXml/QDomElement>
#include "effect_tab_widget.h"
#include "effect_rack_view.h"
#include "embed.h"
#include "engine.h"
#include "gui_templates.h"
@@ -55,33 +57,33 @@ effectLabel::effectLabel( const QString & _initial_name, QWidget * _parent,
m_effectBtn->setGeometry( 6, 1, 28, 28 );
connect( m_effectBtn, SIGNAL( clicked() ),
this, SLOT( showEffects() ) );
m_label = new QLabel( this );
m_label->setText( _initial_name );
QFont f = m_label->font();
m_label->setFont( pointSize<8>( f ) );
m_label->setGeometry( 38, 1, 200, 28 );
m_effWidget = new effectTabWidget( engine::getMainWindow()->workspace(),
m_track,
m_track->getAudioPort() );
m_effectRack = new effectRackView(
m_track->getAudioPort()->getEffects(),
engine::getMainWindow()->workspace() );
if( engine::getMainWindow()->workspace() )
{
engine::getMainWindow()->workspace()->addSubWindow(
m_effWidget );
m_effWindow = m_effWidget->parentWidget();
m_effectRack );
m_effWindow = m_effectRack->parentWidget();
m_effWindow->setAttribute( Qt::WA_DeleteOnClose, FALSE );
m_effWindow->layout()->setSizeConstraint(
QLayout::SetFixedSize );
}
else
{
m_effWindow = m_effWidget;
m_effWindow = m_effectRack;
}
m_effWindow->setWindowTitle( _initial_name );
m_effWidget->setFixedSize( 240, 242 );
m_effectRack->setFixedSize( 240, 242 );
m_effWindow->hide();
}
@@ -104,7 +106,7 @@ QString effectLabel::text( void ) const
void FASTCALL effectLabel::setText( const QString & _text )
void effectLabel::setText( const QString & _text )
{
m_label->setText( _text );
m_effWindow->setWindowTitle( _text );
@@ -117,8 +119,8 @@ void effectLabel::showEffects( void )
{
if( m_effWindow->isHidden() )
{
m_effWidget->show();
if( m_effWindow != m_effWidget )
m_effectRack->show();
if( m_effWindow != m_effectRack )
{
m_effWindow->show();
}
@@ -133,36 +135,6 @@ void effectLabel::showEffects( void )
void effectLabel::saveSettings( QDomDocument & _doc, QDomElement & _this )
{
// _this.setAttribute( "name", m_label->text() );
m_effWidget->saveState( _doc, _this );
}
void effectLabel::loadSettings( const QDomElement & _this )
{
// m_label->setText( _this.attribute( "name" ) );
QDomNode node = _this.firstChild();
while( !node.isNull() )
{
if( node.isElement() )
{
if( m_effWidget->nodeName() == node.nodeName() )
{
m_effWidget->restoreState( node.toElement() );
}
}
node = node.nextSibling();
}
}
void effectLabel::rename( void )
{

View File

@@ -1,9 +1,10 @@
#ifndef SINGLE_SOURCE_COMPILE
/*
* rack_view.cpp - provides the display for the rackInsert instances
* effect_rack_view.cpp - view for effectChain-model
*
* Copyright (c) 2006-2007 Danny McRae <khjklujn@netscape.net>
* Copyright (c) 2008 Tobias Doerffel <tobydox/at/users.sourceforge.net>
*
* This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net
*
@@ -26,218 +27,239 @@
#include <QtGui/QApplication>
#include <QtGui/QLayout>
#include <QtGui/QPushButton>
#include <QtGui/QScrollArea>
#include <QtGui/QVBoxLayout>
#include "rack_view.h"
#include "audio_port.h"
#include "rack_plugin.h"
#include "effect_rack_view.h"
#include "effect_select_dialog.h"
#include "effect_view.h"
#include "group_box.h"
rackView::rackView( QWidget * _parent, track * _track, audioPort * _port ) :
effectRackView::effectRackView( effectChain * _model, QWidget * _parent ) :
QWidget( _parent ),
m_track( _track ),
m_port( _port )
modelView( NULL )
{
setFixedSize( 230, 184 );
m_mainLayout = new QVBoxLayout( this );
/* m_mainLayout = new QVBoxLayout( this );
m_mainLayout->setMargin( 0 );
m_mainLayout->setSpacing( 0 );
m_scrollArea = new QScrollArea( this );
m_mainLayout->setSpacing( 0 );*/
m_effectsGroupBox = new groupBox( tr( "EFFECTS CHAIN" ), this );
m_effectsGroupBox->setGeometry( 2, 2, 242, 244 );
m_scrollArea = new QScrollArea( m_effectsGroupBox );
m_scrollArea->setFixedSize( 230, 184 );
m_scrollArea->setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOn );
m_scrollArea->setPalette( QApplication::palette( m_scrollArea ) );
m_scrollArea->move( 6, 22 );
m_addButton = new QPushButton( m_effectsGroupBox/*, "Add Effect"*/ );
m_addButton->setText( tr( "Add" ) );
m_addButton->move( 75, 210 );
connect( m_addButton, SIGNAL( clicked( void ) ),
this, SLOT( addEffect( void ) ) );
m_mainLayout->addWidget( m_scrollArea );
//m_mainLayout->addWidget( m_scrollArea );
QWidget * w = new QWidget;
m_scrollArea->setWidget( w );
w->show();
m_lastY = 0;
setModel( _model );
}
rackView::~rackView()
effectRackView::~effectRackView()
{
deleteAllPlugins();
//deleteAllPlugins();
}
void rackView::addEffect( effect * _e )
/*
void effectRackView::deleteAllPlugins( void )
{
if( !m_scrollArea->widget() )
{
QWidget * w = new QWidget;
m_scrollArea->setWidget( w );
w->show();
}
QWidget * w = m_scrollArea->widget();
rackPlugin * plugin = new rackPlugin( w, _e, m_track, m_port );
connect( plugin, SIGNAL( moveUp( rackPlugin * ) ),
this, SLOT( moveUp( rackPlugin * ) ) );
connect( plugin, SIGNAL( moveDown( rackPlugin * ) ),
this, SLOT( moveDown( rackPlugin * ) ) );
connect( plugin, SIGNAL( deletePlugin( rackPlugin * ) ),
this, SLOT( deletePlugin( rackPlugin * ) ) );
plugin->move( 0, m_lastY );
plugin->show();
m_lastY += plugin->height();
m_scrollArea->widget()->setFixedSize( 210, m_lastY );
m_rackInserts.append( plugin );
}
void FASTCALL rackView::saveSettings( QDomDocument & _doc,
QDomElement & _this )
{
_this.setAttribute( "numofeffects", m_rackInserts.count() );
for( QVector<rackPlugin *>::iterator it = m_rackInserts.begin();
it != m_rackInserts.end(); it++ )
{
QDomElement ef = ( *it )->saveState( _doc, _this );
ef.setAttribute( "name",
( *it )->getEffect()->getDescriptor()->name );
ef.setAttribute( "key",
( *it )->getEffect()->getKey().dumpBase64() );
}
}
void FASTCALL rackView::loadSettings( const QDomElement & _this )
{
deleteAllPlugins();
const int plugin_cnt = _this.attribute( "numofeffects" ).toInt();
QDomNode node = _this.firstChild();
for( int i = 0; i < plugin_cnt; i++ )
{
if( node.isElement() && node.nodeName() == "effect" )
{
QDomElement cn = node.toElement();
const QString name = cn.attribute( "name" );
// we have this really convenient key-ctor
// which takes a QString and decodes the
// base64-data inside :-)
effectKey key( cn.attribute( "key" ) );
addEffect( effect::instantiate( name, &key ) );
// TODO: somehow detect if effect is sub-plugin-capable
// but couldn't load sub-plugin with requsted key
if( node.isElement() )
{
if( m_rackInserts.last()->nodeName() ==
node.nodeName() )
{
m_rackInserts.last()->restoreState(
node.toElement() );
}
}
}
node = node.nextSibling();
}
}
void rackView::deleteAllPlugins( void )
{
for( QVector<rackPlugin *>::iterator it = m_rackInserts.begin();
it != m_rackInserts.end(); ++it )
for( QVector<effectView *>::iterator it = m_effectViews.begin();
it != m_effectViews.end(); ++it )
{
delete *it;
}
m_rackInserts.clear();
m_effectViews.clear();
}
*/
void rackView::moveUp( rackPlugin * _plugin )
void effectRackView::moveUp( effectView * _view )
{
if( _plugin != m_rackInserts.first() )
fxChain()->moveUp( _view->getEffect() );
if( _view != m_effectViews.first() )
{
int i = 0;
for( QVector<rackPlugin *>::iterator it =
m_rackInserts.begin();
it != m_rackInserts.end(); it++, i++ )
for( QVector<effectView *>::iterator it =
m_effectViews.begin();
it != m_effectViews.end(); it++, i++ )
{
if( *it == _plugin )
if( *it == _view )
{
break;
}
}
rackPlugin * temp = m_rackInserts[ i - 1 ];
effectView * temp = m_effectViews[ i - 1 ];
m_rackInserts[i - 1] = _plugin;
m_rackInserts[i] = temp;
m_effectViews[i - 1] = _view;
m_effectViews[i] = temp;
redraw();
updateView();
}
}
void rackView::moveDown( rackPlugin * _plugin )
void effectRackView::moveDown( effectView * _view )
{
m_port->getEffects()->moveDown( _plugin->getEffect() );
if( _plugin != m_rackInserts.last() )
if( _view != m_effectViews.last() )
{
// moving next effect up is the same
moveUp( *( qFind( m_effectViews.begin(), m_effectViews.end(),
_view ) + 1 ) );
}
/*
fxChain()->moveDown( _view->getEffect() );
if( _view != m_effectViews.last() )
{
int i = 0;
for( QVector<rackPlugin *>::iterator it =
m_rackInserts.begin();
it != m_rackInserts.end(); it++, i++ )
for( QVector<effectView *>::iterator it =
m_effectViews.begin();
it != m_effectViews.end(); it++, i++ )
{
if( *it == _plugin )
if( *it == _view )
{
break;
}
}
rackPlugin * temp = m_rackInserts.at( i + 1 );
effectView * temp = m_effectViews.at( i + 1 );
m_rackInserts[i + 1] = _plugin;
m_rackInserts[i] = temp;
m_effectViews[i + 1] = _view;
m_effectViews[i] = temp;
redraw();
}
}*/
}
void rackView::deletePlugin( rackPlugin * _plugin )
void effectRackView::deletePlugin( effectView * _view )
{
m_rackInserts.erase( qFind( m_rackInserts.begin(), m_rackInserts.end(),
_plugin ) );
delete _plugin;
redraw();
effect * e = _view->getEffect();
m_effectViews.erase( qFind( m_effectViews.begin(), m_effectViews.end(),
_view ) );
delete _view;
fxChain()->m_effects.erase( qFind( fxChain()->m_effects.begin(),
fxChain()->m_effects.end(),
e ) );
delete e;
updateView();
}
void rackView::redraw()
void effectRackView::updateView( void )
{
m_lastY = 0;
for( QVector<rackPlugin *>::iterator it = m_rackInserts.begin();
it != m_rackInserts.end(); it++ )
QWidget * w = m_scrollArea->widget();
QVector<bool> view_map( fxChain()->m_effects.size(), FALSE );
for( QVector<effect *>::iterator it = fxChain()->m_effects.begin();
it != fxChain()->m_effects.end(); ++it )
{
( *it )->move( 0, m_lastY );
m_lastY += ( *it )->height();
int i = 0;
for( QVector<effectView *>::iterator vit =
m_effectViews.begin();
vit != m_effectViews.end(); ++vit, ++i )
{
if( ( *vit )->getEffect() == *it )
{
view_map[i] = TRUE;
break;
}
}
if( i >= m_effectViews.size() )
{
effectView * view = new effectView( *it, w );
connect( view, SIGNAL( moveUp( effectView * ) ),
this, SLOT( moveUp( effectView * ) ) );
connect( view, SIGNAL( moveDown( effectView * ) ),
this, SLOT( moveDown( effectView * ) ) );
connect( view, SIGNAL( deletePlugin( effectView * ) ),
this, SLOT( deletePlugin( effectView * ) ) );
view->show();
m_effectViews.append( view );
view_map[i] = TRUE;
}
}
m_scrollArea->widget()->setFixedSize( 210, m_lastY );
}
int i = m_lastY = 0;
for( QVector<effectView *>::iterator it = m_effectViews.begin();
it != m_effectViews.end(); )
{
if( i < view_map.size() && view_map[i] == FALSE )
{
delete m_effectViews[i];
m_effectViews.erase( it );
}
else
{
( *it )->move( 0, m_lastY );
m_lastY += ( *it )->height();
++it;
++i;
}
}
w->setFixedSize( 210, m_lastY );
}
#include "rack_view.moc"
void effectRackView::addEffect( void )
{
effectSelectDialog esd( this );
esd.exec();
if( esd.result() == QDialog::Rejected )
{
return;
}
fxChain()->appendEffect( esd.instantiateSelectedPlugin( fxChain() ) );
updateView();
}
void effectRackView::modelChanged( void )
{
m_effectsGroupBox->setModel( &fxChain()->m_enabledModel );
updateView();
}
#include "effect_rack_view.moc"
#endif

View File

@@ -1,10 +1,10 @@
#ifndef SINGLE_SOURCE_COMPILE
/*
* effect_tab_widget.cpp - tab-widget in channel-track-window for setting up
* effects
* effect_view.cpp - view-component for an effect
*
* Copyright (c) 2006-2007 Danny McRae <khjklujn/at/users.sourceforge.net>
* Copyright (c) 2007-2008 Tobias Doerffel <tobydox/at/users.sourceforge.net>
*
* This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net
*
@@ -26,7 +26,7 @@
*/
#include "rack_plugin.h"
#include "effect_view.h"
#include <QtGui/QLabel>
#include <QtGui/QPushButton>
@@ -46,15 +46,8 @@
#include "tooltip.h"
rackPlugin::rackPlugin( QWidget * _parent,
effect * _eff,
track * _track,
audioPort * _port ) :
QWidget( _parent ),
m_autoQuitModel( 1.0f, 1.0f, 8000.0f, 100.0f /* this */ ),
m_effect( _eff ),
m_track( _track ),
m_port( _port ),
effectView::effectView( effect * _model, QWidget * _parent ) :
pluginView( _model, _parent ),
m_show( TRUE )
{
setFixedSize( 210, 60 );
@@ -66,18 +59,13 @@ rackPlugin::rackPlugin( QWidget * _parent,
pal.setBrush( backgroundRole(), bg );
setPalette( pal );
m_effect->m_enabledModel.setTrack( m_track );
m_effect->m_enabledModel.setValue( TRUE );
m_bypass = new ledCheckBox( "", this, tr( "Turn the effect off" ) );
m_bypass->setModel( &m_effect->m_enabledModel );
m_bypass->move( 3, 3 );
m_bypass->setWhatsThis( tr( "Toggles the effect on or off." ) );
toolTip::add( m_bypass, tr( "On/Off" ) );
m_effect->m_wetDryModel.setTrack( m_track );
m_wetDry = new knob( knobBright_26, this, tr( "Wet/Dry mix" ) );
m_wetDry->setModel( &m_effect->m_wetDryModel );
m_wetDry->setLabel( tr( "W/D" ) );
m_wetDry->move( 27, 5 );
m_wetDry->setHintText( tr( "Wet Level:" ) + " ", "" );
@@ -86,12 +74,7 @@ rackPlugin::rackPlugin( QWidget * _parent,
"shows up in the output." ) );
m_autoQuitModel.setTrack( m_track );
m_autoQuitModel.setInitValue( 1.0f );
connect( &m_autoQuitModel, SIGNAL( dataChanged( void ) ),
this, SLOT( updateAutoQuit( void ) ) );
m_autoQuit = new tempoSyncKnob( knobBright_26, this, tr( "Decay" ) );
m_autoQuit->setModel( &m_autoQuitModel );
m_autoQuit->setLabel( tr( "Decay" ) );
m_autoQuit->move( 60, 5 );
m_autoQuit->setHintText( tr( "Time:" ) + " ", "ms" );
@@ -101,9 +84,7 @@ rackPlugin::rackPlugin( QWidget * _parent,
"run the risk of clipping the tail on delay effects." ) );
m_effect->m_gateModel.setTrack( m_track );
m_gate = new knob( knobBright_26, this, tr( "Gate" ) );
m_gate->setModel( &m_effect->m_gateModel );
m_gate->setLabel( tr( "Gate" ) );
m_gate->move( 93, 5 );
m_gate->setHintText( tr( "Gate:" ) + " ", "" );
@@ -120,7 +101,7 @@ rackPlugin::rackPlugin( QWidget * _parent,
this, SLOT( editControls() ) );
m_label = new QLabel( this );
m_label->setText( m_effect->publicName() );
m_label->setText( getEffect()->publicName() );
f = m_label->font();
f.setBold( TRUE );
m_label->setFont( pointSize<7>( f ) );
@@ -131,7 +112,7 @@ rackPlugin::rackPlugin( QWidget * _parent,
bg.toImage().copy( 5, 44, 195, 10 ) ) );
m_label->setPalette( pal );
m_controlView = m_effect->createControlDialog( m_track );
m_controlView = getEffect()->createControlDialog( NULL );
m_subWindow = engine::getMainWindow()->workspace()->addSubWindow(
m_controlView );
connect( m_controlView, SIGNAL( closed() ),
@@ -173,23 +154,24 @@ rackPlugin::rackPlugin( QWidget * _parent,
"Right clicking will bring up a context menu where you can change the order "
"in which the effects are processed or delete an effect altogether." ) );
m_port->getEffects()->appendEffect( m_effect );
// m_port->getEffects()->appendEffect( m_effect );
setModel( _model );
}
rackPlugin::~rackPlugin()
effectView::~effectView()
{
m_port->getEffects()->removeEffect( m_effect );
delete m_effect;
// m_port->getEffects()->removeEffect( m_effect );
// delete m_effect;
m_controlView->deleteLater();
}
void rackPlugin::editControls( void )
void effectView::editControls( void )
{
if( m_show )
{
@@ -207,22 +189,10 @@ void rackPlugin::editControls( void )
void rackPlugin::updateAutoQuit( void )
{
float samples = engine::getMixer()->sampleRate() *
m_autoQuitModel.value() / 1000.0f;
Uint32 buffers = 1 + ( static_cast<Uint32>( samples ) /
engine::getMixer()->framesPerPeriod() );
m_effect->setTimeout( buffers );
}
void rackPlugin::contextMenuEvent( QContextMenuEvent * )
void effectView::contextMenuEvent( QContextMenuEvent * )
{
QPointer<captionMenu> contextMenu = new captionMenu(
m_effect->publicName() );
getEffect()->publicName() );
contextMenu->addAction( embed::getIconPixmap( "arp_up_on" ),
tr( "Move &up" ),
this, SLOT( moveUp() ) );
@@ -244,7 +214,7 @@ void rackPlugin::contextMenuEvent( QContextMenuEvent * )
void rackPlugin::moveUp()
void effectView::moveUp()
{
emit( moveUp( this ) );
}
@@ -252,14 +222,14 @@ void rackPlugin::moveUp()
void rackPlugin::moveDown()
void effectView::moveDown()
{
emit( moveDown( this ) );
}
void rackPlugin::deletePlugin()
void effectView::deletePlugin()
{
emit( deletePlugin( this ) );
}
@@ -267,7 +237,7 @@ void rackPlugin::deletePlugin()
void rackPlugin::displayHelp( void )
void effectView::displayHelp( void )
{
QWhatsThis::showText( mapToGlobal( rect().bottomRight() ),
whatsThis() );
@@ -276,53 +246,22 @@ void rackPlugin::displayHelp( void )
void FASTCALL rackPlugin::saveSettings( QDomDocument & _doc,
QDomElement & _this )
{
_this.setAttribute( "on", m_effect->m_enabledModel.value() );
_this.setAttribute( "wet", m_effect->m_wetDryModel.value() );
_this.setAttribute( "autoquit", m_autoQuitModel.value() );
_this.setAttribute( "gate", m_effect->m_gateModel.value() );
m_controlView->saveState( _doc, _this );
}
void FASTCALL rackPlugin::loadSettings( const QDomElement & _this )
{
m_effect->m_enabledModel.setValue( _this.attribute( "on" ).toInt() );
m_effect->m_wetDryModel.setValue( _this.attribute( "wet" ).toFloat() );
m_autoQuitModel.setValue( _this.attribute( "autoquit" ).toFloat() );
m_effect->m_gateModel.setValue( _this.attribute( "gate" ).toFloat() );
QDomNode node = _this.firstChild();
while( !node.isNull() )
{
if( node.isElement() )
{
if( m_controlView->nodeName() == node.nodeName() )
{
m_controlView->restoreState(
node.toElement() );
}
}
node = node.nextSibling();
}
}
void rackPlugin::closeEffects( void )
void effectView::closeEffects( void )
{
m_subWindow->hide();
m_show = TRUE;
}
void effectView::modelChanged( void )
{
m_bypass->setModel( &getEffect()->m_enabledModel );
m_wetDry->setModel( &getEffect()->m_wetDryModel );
m_autoQuit->setModel( &getEffect()->m_autoQuitModel );
m_gate->setModel( &getEffect()->m_gateModel );
}
#include "rack_plugin.moc"
#include "effect_view.moc"
#endif

View File

@@ -49,7 +49,7 @@ QPixmap * groupBox::s_ledBg = NULL;
groupBox::groupBox( const QString & _caption, QWidget * _parent ) :
QWidget( _parent ),
autoModelView(),
autoModelView( NULL ),
m_caption( _caption )
{
if( s_ledBg == NULL )

View File

@@ -65,7 +65,7 @@ textFloat * knob::s_textFloat = NULL;
knob::knob( int _knob_num, QWidget * _parent, const QString & _name ) :
QWidget( _parent ),
autoModelView(),
autoModelView( new autoModel( 0, 0, 0, 1, NULL, TRUE ) ),
m_mouseOffset( 0.0f ),
m_buttonPressed( FALSE ),
m_hintTextBeforeValue( "" ),
@@ -73,8 +73,6 @@ knob::knob( int _knob_num, QWidget * _parent, const QString & _name ) :
m_knobNum( _knob_num ),
m_label( "" )
{
setModel( new autoModel( 0, 0, 0, 1, NULL, TRUE ) );
if( s_textFloat == NULL )
{
s_textFloat = new textFloat( this );

View File

@@ -41,7 +41,7 @@
lcdSpinBox::lcdSpinBox( int _num_digits, QWidget * _parent,
const QString & _name ) :
QWidget( _parent ),
autoModelView(),
autoModelView( new autoModel( 0, 0, 0, 1, NULL, TRUE ) ),
m_number( new QLCDNumber( _num_digits, this ) ),
m_label( NULL ),
m_origMousePos()
@@ -50,8 +50,6 @@ lcdSpinBox::lcdSpinBox( int _num_digits, QWidget * _parent,
m_number->setFrameShadow( QFrame::Sunken );
m_number->setSegmentStyle( QLCDNumber::Flat );
setModel( new autoModel( 0, 0, 0, 1, NULL, TRUE ) );
QPalette pal;
pal.setColor( QPalette::Light, Qt::gray );
pal.setColor( QPalette::Mid, Qt::darkGray );