diff --git a/include/Controller.h b/include/Controller.h index ea86fdaf1..5a7d5a8ac 100644 --- a/include/Controller.h +++ b/include/Controller.h @@ -33,7 +33,8 @@ #include "JournallingObject.h" class ControllerDialog; -class Controller; +class Controller; +class ControllerConnection; typedef QVector ControllerVector; @@ -118,6 +119,11 @@ public: static void triggerFrameCounter(); static void resetFrameCounter(); + //Accepts a ControllerConnection * as it may be used in the future. + void addConnection( ControllerConnection * ); + void removeConnection( ControllerConnection * ); + int connectionCount() const; + public slots: virtual ControllerDialog * createDialog( QWidget * _parent ); @@ -136,6 +142,7 @@ protected: float m_currentValue; bool m_sampleExact; + int m_connectionCount; QString m_name; ControllerTypes m_type; diff --git a/include/Effect.h b/include/Effect.h index c2b070aab..4c7bef8d4 100644 --- a/include/Effect.h +++ b/include/Effect.h @@ -152,6 +152,11 @@ public: return m_key; } + EffectChain * getEffectChain() const + { + return m_parent; + } + virtual EffectControls * controls() = 0; static Effect * instantiate( const QString & _plugin_name, @@ -189,6 +194,7 @@ protected: private: + EffectChain * m_parent; void resample( int _i, const sampleFrame * _src_buf, sample_rate_t _src_sr, sampleFrame * _dst_buf, sample_rate_t _dst_sr, diff --git a/plugins/peak_controller_effect/peak_controller_effect.h b/plugins/peak_controller_effect/peak_controller_effect.h index 06e241f21..c35287f0a 100644 --- a/plugins/peak_controller_effect/peak_controller_effect.h +++ b/plugins/peak_controller_effect/peak_controller_effect.h @@ -33,10 +33,10 @@ class PeakControllerEffect : public Effect { public: PeakControllerEffect( Model * parent, - const Descriptor::SubPluginFeatures::Key * _key ); + const Descriptor::SubPluginFeatures::Key * _key ); virtual ~PeakControllerEffect(); virtual bool processAudioBuffer( sampleFrame * _buf, - const fpp_t _frames ); + const fpp_t _frames ); virtual EffectControls * controls() { diff --git a/src/core/Controller.cpp b/src/core/Controller.cpp index d1260fd35..e11c2255d 100644 --- a/src/core/Controller.cpp +++ b/src/core/Controller.cpp @@ -49,6 +49,7 @@ Controller::Controller( ControllerTypes _type, Model * _parent, const QString & _display_name ) : Model( _parent, _display_name ), JournallingObject(), + m_connectionCount( 0 ), m_type( _type ) { if( _type != DummyController && _type != MidiController ) @@ -277,6 +278,32 @@ ControllerDialog * Controller::createDialog( QWidget * _parent ) } + + +void Controller::addConnection( ControllerConnection * ) +{ + m_connectionCount++; +} + + + + +void Controller::removeConnection( ControllerConnection * ) +{ + m_connectionCount--; + Q_ASSERT( m_connectionCount >= 0 ); +} + + + + +int Controller::connectionCount() const{ + return m_connectionCount; +} + + + + #include "moc_Controller.cxx" diff --git a/src/core/ControllerConnection.cpp b/src/core/ControllerConnection.cpp index 1840c2ddc..e5db4ffbf 100644 --- a/src/core/ControllerConnection.cpp +++ b/src/core/ControllerConnection.cpp @@ -40,6 +40,7 @@ ControllerConnectionVector ControllerConnection::s_connections; ControllerConnection::ControllerConnection( Controller * _controller ) : + m_controller( NULL ), m_controllerId( -1 ), m_ownsController( false ) { @@ -71,6 +72,10 @@ ControllerConnection::ControllerConnection( int _controllerId ) : ControllerConnection::~ControllerConnection() { + if( m_controller && m_controller->type() != Controller::DummyController ) + { + m_controller->removeConnection( this ); + } s_connections.remove( s_connections.indexOf( this ) ); if( m_ownsController ) { @@ -93,6 +98,12 @@ void ControllerConnection::setController( Controller * _controller ) if( m_ownsController && m_controller ) { delete m_controller; + m_controller = NULL; + } + + if( m_controller && m_controller->type() != Controller::DummyController ) + { + m_controller->removeConnection( this ); } if( !_controller ) @@ -107,6 +118,7 @@ void ControllerConnection::setController( Controller * _controller ) if( _controller->type() != Controller::DummyController ) { + _controller->addConnection( this ); QObject::connect( _controller, SIGNAL( valueChanged() ), this, SIGNAL( valueChanged() ) ); } diff --git a/src/core/Effect.cpp b/src/core/Effect.cpp index b0212533f..3fbf8972a 100644 --- a/src/core/Effect.cpp +++ b/src/core/Effect.cpp @@ -39,6 +39,7 @@ Effect::Effect( const Plugin::Descriptor * _desc, Model * _parent, const Descriptor::SubPluginFeatures::Key * _key ) : Plugin( _desc, _parent ), + m_parent( NULL ), m_key( _key ? *_key : Descriptor::SubPluginFeatures::Key() ), m_processors( 1 ), m_okay( true ), @@ -117,7 +118,9 @@ Effect * Effect::instantiate( const QString & _plugin_name, if( dynamic_cast( p ) != NULL ) { // everything ok, so return pointer - return dynamic_cast( p ); + Effect * effect = dynamic_cast( p ); + effect->m_parent = dynamic_cast(_parent); + return effect; } // not quite... so delete plugin and return dummy effect diff --git a/src/core/EffectChain.cpp b/src/core/EffectChain.cpp index 207492d9f..e38c946fe 100644 --- a/src/core/EffectChain.cpp +++ b/src/core/EffectChain.cpp @@ -131,6 +131,8 @@ void EffectChain::removeEffect( Effect * _effect ) engine::mixer()->lock(); m_effects.erase( qFind( m_effects.begin(), m_effects.end(), _effect ) ); engine::mixer()->unlock(); + + emit dataChanged(); } diff --git a/src/core/PeakController.cpp b/src/core/PeakController.cpp index 91d567a06..824d450f2 100644 --- a/src/core/PeakController.cpp +++ b/src/core/PeakController.cpp @@ -34,6 +34,7 @@ #include "engine.h" #include "Mixer.h" #include "PeakController.h" +#include "EffectChain.h" #include "ControllerDialog.h" #include "plugins/peak_controller_effect/peak_controller_effect.h" @@ -57,7 +58,10 @@ PeakController::PeakController( Model * _parent, PeakController::~PeakController() { - // disconnects + if( m_peakEffect != NULL && m_peakEffect->getEffectChain() != NULL ) + { + m_peakEffect->getEffectChain()->removeEffect( m_peakEffect ); + } } @@ -76,7 +80,7 @@ float PeakController::value( int _offset ) void PeakController::handleDestroyedEffect( ) { // possible race condition... - printf("disconnecting effect\n"); + //printf("disconnecting effect\n"); disconnect( m_peakEffect ); m_peakEffect = NULL; //deleteLater(); diff --git a/src/gui/widgets/ControllerRackView.cpp b/src/gui/widgets/ControllerRackView.cpp index e4a241568..dcca26635 100644 --- a/src/gui/widgets/ControllerRackView.cpp +++ b/src/gui/widgets/ControllerRackView.cpp @@ -30,6 +30,7 @@ #include #include #include +#include #include "song.h" #include "embed.h" @@ -117,8 +118,23 @@ void ControllerRackView::loadSettings( const QDomElement & _this ) void ControllerRackView::deleteController( ControllerView * _view ) { - Controller * c = _view->getController(); + + int connectionCount = c->connectionCount(); + if( connectionCount > 0 ) + { + QMessageBox msgBox; + msgBox.setIcon( QMessageBox::Question ); + msgBox.setText( tr("Confirm delete? There are existing connection(s) " + "associted with this controller. There is no way to undo.") ); + msgBox.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel); + if( msgBox.exec() != QMessageBox::Ok ) + { + return; + } + } + + m_controllerViews.erase( qFind( m_controllerViews.begin(), m_controllerViews.end(), _view ) ); delete _view;