From ecc0e21d4400ff778c0bf275126ff2c0326e77b3 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Thu, 4 Feb 2010 17:15:03 +0000 Subject: [PATCH] add new Redirect::flush() model to accomodate plugin models where flush != deactivate+activate (such as AU) git-svn-id: svn://localhost/ardour2/branches/2.0-ongoing@6633 d708f5d6-7413-0410-9779-e7cbd77b26cf --- libs/ardour/ardour/audio_unit.h | 1 + libs/ardour/ardour/insert.h | 2 ++ libs/ardour/ardour/plugin.h | 1 + libs/ardour/ardour/redirect.h | 1 + libs/ardour/ardour/send.h | 1 + libs/ardour/audio_unit.cc | 14 +++++++++----- libs/ardour/insert.cc | 8 ++++++++ libs/ardour/route.cc | 3 +-- 8 files changed, 24 insertions(+), 7 deletions(-) diff --git a/libs/ardour/ardour/audio_unit.h b/libs/ardour/ardour/audio_unit.h index d8232e1e01..35b4630f94 100644 --- a/libs/ardour/ardour/audio_unit.h +++ b/libs/ardour/ardour/audio_unit.h @@ -79,6 +79,7 @@ class AUPlugin : public ARDOUR::Plugin uint32_t nth_parameter (uint32_t which, bool& ok) const; void activate (); void deactivate (); + void flush (); void set_block_size (nframes_t nframes); int connect_and_run (vector& bufs, uint32_t maxbuf, int32_t& in, int32_t& out, nframes_t nframes, nframes_t offset); diff --git a/libs/ardour/ardour/insert.h b/libs/ardour/ardour/insert.h index 7baebe401c..641df01c67 100644 --- a/libs/ardour/ardour/insert.h +++ b/libs/ardour/ardour/insert.h @@ -53,6 +53,7 @@ class Insert : public Redirect virtual void run (vector& bufs, uint32_t nbufs, nframes_t nframes) = 0; virtual void activate () {} virtual void deactivate () {} + virtual void flush () {} virtual int32_t can_do (int32_t in, int32_t& out) = 0; virtual int32_t configure_io (int32_t magic, int32_t in, int32_t out) = 0; @@ -114,6 +115,7 @@ class PluginInsert : public Insert void silence (nframes_t nframes); void activate (); void deactivate (); + void flush (); void set_block_size (nframes_t nframes); diff --git a/libs/ardour/ardour/plugin.h b/libs/ardour/ardour/plugin.h index 480844878e..f2198b3170 100644 --- a/libs/ardour/ardour/plugin.h +++ b/libs/ardour/ardour/plugin.h @@ -113,6 +113,7 @@ class Plugin : public PBD::StatefulDestructible virtual uint32_t nth_parameter (uint32_t which, bool& ok) const = 0; virtual void activate () = 0; virtual void deactivate () = 0; + virtual void flush () { deactivate(); activate(); } virtual void set_block_size (nframes_t nframes) = 0; virtual int connect_and_run (vector& bufs, uint32_t maxbuf, int32_t& in, int32_t& out, nframes_t nframes, nframes_t offset) = 0; diff --git a/libs/ardour/ardour/redirect.h b/libs/ardour/ardour/redirect.h index e24494f23d..e4e6ccc14b 100644 --- a/libs/ardour/ardour/redirect.h +++ b/libs/ardour/ardour/redirect.h @@ -73,6 +73,7 @@ class Redirect : public IO virtual void run (vector& ibufs, uint32_t nbufs, nframes_t nframes) = 0; virtual void activate () = 0; virtual void deactivate () = 0; + virtual void flush () = 0; virtual nframes_t latency() { return 0; } virtual void set_block_size (nframes_t nframes) {} diff --git a/libs/ardour/ardour/send.h b/libs/ardour/ardour/send.h index e241c6dbf8..6052f48b16 100644 --- a/libs/ardour/ardour/send.h +++ b/libs/ardour/ardour/send.h @@ -45,6 +45,7 @@ class Send : public Redirect void run (vector &bufs, uint32_t nbufs, nframes_t nframes); void activate() {} void deactivate () {} + void flush () {} void set_metering (bool yn); diff --git a/libs/ardour/audio_unit.cc b/libs/ardour/audio_unit.cc index d364e12329..5808e2e516 100644 --- a/libs/ardour/audio_unit.cc +++ b/libs/ardour/audio_unit.cc @@ -804,10 +804,16 @@ AUPlugin::activate () void AUPlugin::deactivate () { - unit->GlobalReset (); + unit->Uninitialize (); initialized = false; } +void +AUPlugin::flush () +{ + unit->GlobalReset (); +} + void AUPlugin::set_block_size (nframes_t nframes) { @@ -822,8 +828,7 @@ AUPlugin::_set_block_size (nframes_t nframes) OSErr err; if (initialized) { - unit->Uninitialize (); - initialized = false; + deactivate (); } if ((err = unit->SetProperty (kAudioUnitProperty_MaximumFramesPerSlice, kAudioUnitScope_Global, @@ -850,8 +855,7 @@ AUPlugin::configure_io (int32_t in, int32_t out) if ( (in==input_channels) && (out==output_channels) ) { return 0; } else { - unit->Uninitialize (); - initialized = false; + deactivate (); } } diff --git a/libs/ardour/insert.cc b/libs/ardour/insert.cc index d931f3a8e2..e70293d986 100644 --- a/libs/ardour/insert.cc +++ b/libs/ardour/insert.cc @@ -275,6 +275,14 @@ PluginInsert::deactivate () } } +void +PluginInsert::flush () +{ + for (vector >::iterator i = _plugins.begin(); i != _plugins.end(); ++i) { + (*i)->flush (); + } +} + void PluginInsert::connect_and_run (vector& bufs, uint32_t nbufs, nframes_t nframes, nframes_t offset, bool with_auto, nframes_t now) { diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc index 4e8d4d954c..3834c98095 100644 --- a/libs/ardour/route.cc +++ b/libs/ardour/route.cc @@ -2264,8 +2264,7 @@ Route::handle_transport_stopped (bool abort_ignored, bool did_locate, bool can_f for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) { if (Config->get_plugins_stop_with_transport() && can_flush_redirects) { - (*i)->deactivate (); - (*i)->activate (); + (*i)->flush (); } (*i)->transport_stopped (now);