prevent double declicks (click after RecStop)
authorRobin Gareus <robin@gareus.org>
Tue, 7 Apr 2015 03:19:28 +0000 (05:19 +0200)
committerRobin Gareus <robin@gareus.org>
Tue, 7 Apr 2015 03:25:18 +0000 (05:25 +0200)
If there's port-latency > period-size, there is a
split cycle with (this_event->action_frame - _transport_frame).
Yet Session::check_declick_out() keeps PendingDeclickOut if
StopPendingCapture is set. The route declick’ed twice:
Once with the period-size and one with the remaining frames,
which resulted in a click.

libs/ardour/ardour/route.h
libs/ardour/route.cc

index 5d52fc0c52493e5436f87b34843bd520bdb01aa4..21610cc27f0066093f74082ce21e5094feeaa7a8 100644 (file)
@@ -506,6 +506,7 @@ class LIBARDOUR_API Route : public SessionObject, public Automatable, public Rou
        framecnt_t     _signal_latency_at_amp_position;
        framecnt_t     _initial_delay;
        framecnt_t     _roll_delay;
+       bool           _declicked_silent;
 
        ProcessorList  _processors;
        mutable Glib::Threads::RWLock   _processor_lock;
index 36adbfa148f6b4e9442a5bb5495a80e78703e3f3..ab341b7f3418a16c649da6db746a79fa72b3ad6d 100644 (file)
@@ -83,6 +83,7 @@ Route::Route (Session& sess, string name, Flag flg, DataType default_type)
        , _signal_latency_at_amp_position (0)
        , _initial_delay (0)
        , _roll_delay (0)
+       , _declicked_silent (true)
        , _flags (flg)
        , _pending_declick (true)
        , _meter_point (MeterPostFader)
@@ -465,7 +466,18 @@ Route::process_output_buffers (BufferSet& bufs,
           GLOBAL DECLICK (for transport changes etc.)
           ----------------------------------------------------------------------------------------- */
 
+       if (_declickable && _declicked_silent && declick <= 0) {
+               bufs.silence (nframes, 0);
+       }
+
        maybe_declick (bufs, nframes, declick);
+
+       if (declick < 0) {
+               _declicked_silent = true;
+       }
+       else if (declick > 0) {
+               _declicked_silent = false;
+       }
        _pending_declick = 0;
 
        /* -------------------------------------------------------------------------------------------