diff --git a/libs/ardour/ardour/audio_port.h b/libs/ardour/ardour/audio_port.h index 419d067d54..01b42d1a21 100644 --- a/libs/ardour/ardour/audio_port.h +++ b/libs/ardour/ardour/audio_port.h @@ -43,7 +43,7 @@ public: void cycle_split (); /* reset SRC, clear out any state */ - void reinit (); + void reinit (bool with_ratio); Buffer& get_buffer (pframes_t nframes) { return get_audio_buffer (nframes); diff --git a/libs/ardour/ardour/port.h b/libs/ardour/ardour/port.h index ff35b1a550..a9fcd0f0ac 100644 --- a/libs/ardour/ardour/port.h +++ b/libs/ardour/ardour/port.h @@ -121,7 +121,7 @@ public: virtual void cycle_start (pframes_t); virtual void cycle_end (pframes_t) = 0; virtual void cycle_split () = 0; - virtual void reinit () {} + virtual void reinit (bool) {} virtual Buffer& get_buffer (pframes_t nframes) = 0; virtual void flush_buffers (pframes_t /*nframes*/) {} virtual void transport_stopped () {} diff --git a/libs/ardour/ardour/port_manager.h b/libs/ardour/ardour/port_manager.h index 4ebcd62a2d..0c83273ead 100644 --- a/libs/ardour/ardour/port_manager.h +++ b/libs/ardour/ardour/port_manager.h @@ -189,6 +189,9 @@ public: void remove_all_ports (); + /** reset port-buffers. e.g. after freewheeling */ + void reinit (bool with_ratio = false); + void clear_pending_port_deletions (); virtual void add_pending_port_deletion (Port*) = 0; @@ -303,8 +306,6 @@ protected: */ void cycle_end (pframes_t nframes, Session* s = 0); - void reinit (); - void cycle_end_fade_out (gain_t, gain_t, pframes_t, Session* s = 0); static std::string port_info_file (); diff --git a/libs/ardour/audio_port.cc b/libs/ardour/audio_port.cc index 3dc3d4e970..1e6671ebb4 100644 --- a/libs/ardour/audio_port.cc +++ b/libs/ardour/audio_port.cc @@ -127,8 +127,15 @@ AudioPort::cycle_split () } void -AudioPort::reinit () +AudioPort::reinit (bool with_ratio) { + /* must not be called concurrently with processing */ + if (with_ratio) { + /* Note: latency changes with quality, caller + * must take care of updating port latencies */ + _src.setup (resampler_quality ()); + _src.set_rrfilt (10); + } _src.reset (); } diff --git a/libs/ardour/port_manager.cc b/libs/ardour/port_manager.cc index 2f70c696e1..cb0a011eee 100644 --- a/libs/ardour/port_manager.cc +++ b/libs/ardour/port_manager.cc @@ -1316,11 +1316,12 @@ PortManager::silence (pframes_t nframes, Session* s) } } } + void -PortManager::reinit () +PortManager::reinit (bool with_ratio) { for (auto const& p : *_ports.reader ()) { - p.second->reinit (); + p.second->reinit (with_ratio); } }