diff --git a/gtk2_ardour/engine_dialog.cc b/gtk2_ardour/engine_dialog.cc index 17ff0f7217..873498f6ec 100644 --- a/gtk2_ardour/engine_dialog.cc +++ b/gtk2_ardour/engine_dialog.cc @@ -249,6 +249,7 @@ and microphone.\n\n\ xopt = AttachOptions(0); lm_measure_button.signal_toggled().connect (sigc::mem_fun (*this, &EngineControl::latency_button_toggled)); + lm_use_button.signal_clicked().connect (sigc::mem_fun (*this, &EngineControl::use_latency_button_clicked)); lm_use_button.set_sensitive (false); lm_table.attach (lm_measure_button, 0, 2, row, row+1, xopt, (AttachOptions) 0); @@ -972,7 +973,10 @@ EngineControl::check_latency_measurement () return false; } - snprintf (buf, sizeof (buf), "%10.3lf frames %10.3lf ms", mtdm->del (), mtdm->del () * 1000.0f/sample_rate); + uint32_t frames_total = mtdm->del(); + uint32_t extra = frames_total - ARDOUR::AudioEngine::instance()->latency_signal_delay(); + + snprintf (buf, sizeof (buf), "%u samples %10.3lf ms", extra, extra * 1000.0f/sample_rate); bool solid = true; @@ -1016,3 +1020,20 @@ EngineControl::latency_button_toggled () update_latency_display (); } } + +void +EngineControl::use_latency_button_clicked () +{ + MTDM* mtdm = ARDOUR::AudioEngine::instance()->mtdm (); + + if (!mtdm) { + return; + } + + uint32_t frames_total = mtdm->del(); + uint32_t extra = frames_total - ARDOUR::AudioEngine::instance()->latency_signal_delay(); + uint32_t one_way = extra/2; + + input_latency_adjustment.set_value (one_way); + output_latency_adjustment.set_value (one_way); +} diff --git a/gtk2_ardour/engine_dialog.h b/gtk2_ardour/engine_dialog.h index 360c438571..3872917add 100644 --- a/gtk2_ardour/engine_dialog.h +++ b/gtk2_ardour/engine_dialog.h @@ -164,6 +164,7 @@ class EngineControl : public ArdourDialog, public PBD::ScopedConnectionList { void on_response (int); void control_app_button_clicked (); + void use_latency_button_clicked (); void manage_control_app_sensitivity (); int push_state_to_backend (bool start); uint32_t _desired_sample_rate; diff --git a/libs/ardour/ardour/audioengine.h b/libs/ardour/ardour/audioengine.h index c9d789d746..cf4f91d4d0 100644 --- a/libs/ardour/ardour/audioengine.h +++ b/libs/ardour/ardour/audioengine.h @@ -191,6 +191,7 @@ public: void stop_latency_detection (); void set_latency_input_port (const std::string&); void set_latency_output_port (const std::string&); + uint32_t latency_signal_delay () const { return _latency_signal_latency; } private: AudioEngine (); @@ -222,6 +223,7 @@ public: framecnt_t _latency_flush_frames; std::string _latency_input_name; std::string _latency_output_name; + framecnt_t _latency_signal_latency; void meter_thread (); void start_metering_thread (); diff --git a/libs/ardour/audioengine.cc b/libs/ardour/audioengine.cc index 2a1ca2c852..329de68bee 100644 --- a/libs/ardour/audioengine.cc +++ b/libs/ardour/audioengine.cc @@ -79,6 +79,7 @@ AudioEngine::AudioEngine () , _latency_input_port (0) , _latency_output_port (0) , _latency_flush_frames (0) + , _latency_signal_latency (0) { g_atomic_int_set (&m_meter_exit, 0); discover_backends (); @@ -1012,6 +1013,15 @@ AudioEngine::start_latency_detection () pe.unregister_port (_latency_output_port); return; } + + LatencyRange lr; + _latency_signal_latency = 0; + lr = pe.get_latency_range (_latency_input_port, false); + _latency_signal_latency = lr.max; + lr = pe.get_latency_range (_latency_output_port, true); + _latency_signal_latency += lr.max; + + cerr << "latency signal pathway = " << _latency_signal_latency << endl; /* all created and connected, lets go */