From 95f91d9dbd5cbd801c3cb7f0c277fea94f289342 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Fri, 4 Dec 2015 17:09:41 +0100 Subject: update engine to allow latency measurement w/o restart. --- libs/ardour/audioengine.cc | 46 +++++++++++++++++++++++++++++++++++----------- 1 file changed, 35 insertions(+), 11 deletions(-) (limited to 'libs/ardour/audioengine.cc') diff --git a/libs/ardour/audioengine.cc b/libs/ardour/audioengine.cc index 5bd2d4dce4..a87a5ee7d0 100644 --- a/libs/ardour/audioengine.cc +++ b/libs/ardour/audioengine.cc @@ -867,6 +867,8 @@ AudioEngine::start (bool for_latency) int AudioEngine::stop (bool for_latency) { + bool stop_engine = true; + if (!_backend) { return 0; } @@ -877,15 +879,20 @@ AudioEngine::stop (bool for_latency) pl.acquire (); } - if (_backend->stop ()) { - return -1; + if (for_latency && _backend->can_change_systemic_latency_when_running()) { + stop_engine = false; + } else { + if (_backend->stop ()) { + pl.release (); + return -1; + } } if (pl.locked ()) { pl.release (); } - if (_session && _running && + if (_session && _running && stop_engine && (_session->state_of_the_state() & Session::Loading) == 0 && (_session->state_of_the_state() & Session::Deletion) == 0) { // it's not a halt, but should be handled the same way: @@ -893,16 +900,20 @@ AudioEngine::stop (bool for_latency) _session->engine_halted (); } - _running = false; + if (stop_engine) { + _running = false; + } _processed_frames = 0; _measuring_latency = MeasureNone; _latency_output_port = 0; _latency_input_port = 0; _started_for_latency = false; - Port::PortDrop (); + if (stop_engine) { + Port::PortDrop (); + } - if (!for_latency) { + if (!for_latency && stop_engine) { Stopped (); /* EMIT SIGNAL */ } @@ -1272,6 +1283,19 @@ AudioEngine::setup_required () const int AudioEngine::prepare_for_latency_measurement () { + if (!_backend) { + return -1; + } + + if (_backend->can_change_systemic_latency_when_running()) { + if (start()) { + return -1; + } + _backend->set_systemic_input_latency (0); + _backend->set_systemic_output_latency (0); + return 0; + } + if (running()) { _stopped_for_latency = true; stop (true); @@ -1288,10 +1312,8 @@ AudioEngine::prepare_for_latency_measurement () int AudioEngine::start_latency_detection (bool for_midi) { - if (!running()) { - if (prepare_for_latency_measurement ()) { - return -1; - } + if (prepare_for_latency_measurement ()) { + return -1; } PortEngine& pe (port_engine()); @@ -1398,7 +1420,9 @@ AudioEngine::stop_latency_detection () _latency_input_port = 0; } - stop (true); + if (!_backend->can_change_systemic_latency_when_running()) { + stop (true); + } if (_stopped_for_latency) { start (); -- cgit v1.2.3