From 79abf3dfa6d649fbf1fb6fd16cd489f434d0b909 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Fri, 23 Jun 2017 14:19:04 -0400 Subject: [PATCH] set + store signal chain latency for all processors; DiskWriter sets its capture_offset appropriately --- libs/ardour/ardour/disk_writer.h | 2 -- libs/ardour/ardour/processor.h | 4 ++++ libs/ardour/disk_writer.cc | 7 +++---- libs/ardour/processor.cc | 9 +++++++++ libs/ardour/route.cc | 6 ++++++ 5 files changed, 22 insertions(+), 6 deletions(-) diff --git a/libs/ardour/ardour/disk_writer.h b/libs/ardour/ardour/disk_writer.h index 72882e86fb..218d1fc1fa 100644 --- a/libs/ardour/ardour/disk_writer.h +++ b/libs/ardour/ardour/disk_writer.h @@ -90,7 +90,6 @@ class LIBARDOUR_API DiskWriter : public DiskIOProcessor PBD::Signal0 AlignmentStyleChanged; void set_input_latency (framecnt_t); - framecnt_t input_latency () const { return _input_latency; } bool configure_io (ChanCount in, ChanCount out); @@ -170,7 +169,6 @@ class LIBARDOUR_API DiskWriter : public DiskIOProcessor CaptureInfos capture_info; private: - framecnt_t _input_latency; gint _record_enabled; gint _record_safe; framepos_t capture_start_frame; diff --git a/libs/ardour/ardour/processor.h b/libs/ardour/ardour/processor.h index 1898b6cb60..095ab7fadf 100644 --- a/libs/ardour/ardour/processor.h +++ b/libs/ardour/ardour/processor.h @@ -70,6 +70,9 @@ class LIBARDOUR_API Processor : public SessionObject, public Automatable, public virtual framecnt_t signal_latency() const { return 0; } + virtual void set_input_latency (framecnt_t); + framecnt_t input_latency () const { return _input_latency; } + virtual int set_block_size (pframes_t /*nframes*/) { return 0; } virtual bool requires_fixed_sized_buffers() const { return false; } @@ -149,6 +152,7 @@ protected: ProcessorWindowProxy *_window_proxy; PluginPinWindowProxy *_pinmgr_proxy; SessionObject* _owner; + framecnt_t _input_latency; }; } // namespace ARDOUR diff --git a/libs/ardour/disk_writer.cc b/libs/ardour/disk_writer.cc index 4eb4393861..82f9324d5b 100644 --- a/libs/ardour/disk_writer.cc +++ b/libs/ardour/disk_writer.cc @@ -45,7 +45,6 @@ PBD::Signal0 DiskWriter::Overrun; DiskWriter::DiskWriter (Session& s, string const & str, DiskIOProcessor::Flag f) : DiskIOProcessor (s, str, f) - , _input_latency (0) , _record_enabled (0) , _record_safe (0) , capture_start_frame (0) @@ -292,7 +291,8 @@ DiskWriter::get_captured_frames (uint32_t n) const void DiskWriter::set_input_latency (framecnt_t l) { - _input_latency = l; + Processor::set_input_latency (l); + set_capture_offset (); } void @@ -309,7 +309,7 @@ DiskWriter::set_capture_offset () break; } - DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("%1: using IO latency, capture offset set to %2 with style = %3\n", name(), _capture_offset, enum_2_string (_alignment_style))); + DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("%1: using input latency %4, capture offset set to %2 with style = %3\n", name(), _capture_offset, enum_2_string (_alignment_style), _input_latency)); } @@ -322,7 +322,6 @@ DiskWriter::set_align_style (AlignStyle a, bool force) if ((a != _alignment_style) || force) { _alignment_style = a; - cerr << name() << " using align style " << enum_2_string (_alignment_style) << endl; set_capture_offset (); AlignmentStyleChanged (); } diff --git a/libs/ardour/processor.cc b/libs/ardour/processor.cc index 23e55f91ae..335bb0f019 100644 --- a/libs/ardour/processor.cc +++ b/libs/ardour/processor.cc @@ -68,6 +68,7 @@ Processor::Processor(Session& session, const string& name) , _window_proxy (0) , _pinmgr_proxy (0) , _owner (0) + , _input_latency (0) { } @@ -86,6 +87,7 @@ Processor::Processor (const Processor& other) , _window_proxy (0) , _pinmgr_proxy (0) , _owner (0) + , _input_latency (0) { } @@ -288,3 +290,10 @@ Processor::owner() const { return _owner; } + +void +Processor::set_input_latency (framecnt_t cnt) +{ + _input_latency = cnt; +} + diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc index 352d36a2c5..b7a57fd3f1 100644 --- a/libs/ardour/route.cc +++ b/libs/ardour/route.cc @@ -1806,6 +1806,8 @@ Route::configure_processors_unlocked (ProcessorStreams* err, Glib::Threads::RWLo // TODO check for a potential ReaderLock after ReaderLock ?? Glib::Threads::RWLock::ReaderLock lr (_processor_lock); + framecnt_t chain_latency = _input->latency (); + list< pair >::iterator c = configuration.begin(); for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++c) { @@ -1816,6 +1818,10 @@ Route::configure_processors_unlocked (ProcessorStreams* err, Glib::Threads::RWLo lm->acquire (); return -1; } + + (*p)->set_input_latency (chain_latency); + chain_latency += (*p)->signal_latency (); + processor_max_streams = ChanCount::max(processor_max_streams, c->first); processor_max_streams = ChanCount::max(processor_max_streams, c->second); -- 2.30.2