diff --git a/libs/ardour/ardour/plugin_insert.h b/libs/ardour/ardour/plugin_insert.h index d1fa7e951e..f15967640b 100644 --- a/libs/ardour/ardour/plugin_insert.h +++ b/libs/ardour/ardour/plugin_insert.h @@ -440,6 +440,8 @@ private: PBD::TimingStats _timing_stats; volatile gint _stat_reset; + + volatile gint _flush; }; } // namespace ARDOUR diff --git a/libs/ardour/plugin_insert.cc b/libs/ardour/plugin_insert.cc index 9aab3e9f18..ebb777da2d 100644 --- a/libs/ardour/plugin_insert.cc +++ b/libs/ardour/plugin_insert.cc @@ -91,6 +91,7 @@ PluginInsert::PluginInsert (Session& s, boost::shared_ptr plug) , _bypass_port (UINT32_MAX) , _inverted_bypass_enable (false) , _stat_reset (0) + , _flush (0) { /* the first is the master */ @@ -714,9 +715,7 @@ PluginInsert::deactivate () void PluginInsert::flush () { - for (vector >::iterator i = _plugins.begin(); i != _plugins.end(); ++i) { - (*i)->flush (); - } + g_atomic_int_set (&_flush, 1); } void @@ -1269,6 +1268,12 @@ PluginInsert::run (BufferSet& bufs, samplepos_t start_sample, samplepos_t end_sa _timing_stats.reset (); } + if (g_atomic_int_compare_and_exchange (&_flush, 1, 0)) { + for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) { + (*i)->flush (); + } + } + if (_pending_active) { #if defined MIXBUS && defined NDEBUG if (!is_channelstrip ()) {