From 6ba555c2f57fb793431aef0cedfbacf11d643a2b Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Tue, 7 Apr 2015 05:19:28 +0200 Subject: [PATCH] prevent double declicks (click after RecStop) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 | 1 + libs/ardour/route.cc | 12 ++++++++++++ 2 files changed, 13 insertions(+) diff --git a/libs/ardour/ardour/route.h b/libs/ardour/ardour/route.h index 5d52fc0c52..21610cc27f 100644 --- a/libs/ardour/ardour/route.h +++ b/libs/ardour/ardour/route.h @@ -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; diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc index 36adbfa148..ab341b7f34 100644 --- a/libs/ardour/route.cc +++ b/libs/ardour/route.cc @@ -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; /* -------------------------------------------------------------------------------------------