diff options
author | John Emmas <johne53@tiscali.co.uk> | 2013-10-14 19:31:22 +0100 |
---|---|---|
committer | John Emmas <johne53@tiscali.co.uk> | 2013-10-14 19:31:22 +0100 |
commit | e466ce40ad1ba591543020cb7c0aa15dbebef81e (patch) | |
tree | f8e43560917a0a70c48d32ac171e828472cfd794 /libs/ardour/audioengine.cc | |
parent | 4fac237fdcf025c5fd5aafe207113abd6abb469b (diff) | |
parent | a901f28c6287ff99444d6a8afe67b71531a5f7d0 (diff) |
Merge branch 'master' into windows+cc
Conflicts (hopefully resolved):
gtk2_ardour/ardour_ui.cc
Diffstat (limited to 'libs/ardour/audioengine.cc')
-rw-r--r-- | libs/ardour/audioengine.cc | 77 |
1 files changed, 54 insertions, 23 deletions
diff --git a/libs/ardour/audioengine.cc b/libs/ardour/audioengine.cc index 570fe1bee5..ae40b089db 100644 --- a/libs/ardour/audioengine.cc +++ b/libs/ardour/audioengine.cc @@ -78,7 +78,7 @@ AudioEngine::AudioEngine () , _latency_output_port (0) , _latency_flush_frames (0) , _latency_signal_latency (0) - , _started_for_latency (false) + , _stopped_for_latency (false) , _in_destructor (false) { g_atomic_int_set (&m_meter_exit, 0); @@ -565,6 +565,16 @@ AudioEngine::drop_backend () } boost::shared_ptr<AudioBackend> +AudioEngine::set_default_backend () +{ + if (_backends.empty()) { + return boost::shared_ptr<AudioBackend>(); + } + + return set_backend (_backends.begin()->first, "", ""); +} + +boost::shared_ptr<AudioBackend> AudioEngine::set_backend (const std::string& name, const std::string& arg1, const std::string& arg2) { BackendMap::iterator b = _backends.find (name); @@ -593,7 +603,7 @@ AudioEngine::set_backend (const std::string& name, const std::string& arg1, cons /* BACKEND PROXY WRAPPERS */ int -AudioEngine::start () +AudioEngine::start (bool for_latency) { if (!_backend) { return -1; @@ -606,7 +616,7 @@ AudioEngine::start () _processed_frames = 0; last_monitor_check = 0; - if (_backend->start()) { + if (_backend->start (for_latency)) { return -1; } @@ -622,7 +632,7 @@ AudioEngine::start () start_metering_thread (); - if (!_started_for_latency) { + if (!for_latency) { Running(); /* EMIT SIGNAL */ } @@ -630,7 +640,7 @@ AudioEngine::start () } int -AudioEngine::stop () +AudioEngine::stop (bool for_latency) { if (!_backend) { return 0; @@ -651,7 +661,10 @@ AudioEngine::stop () stop_metering_thread (); Port::PortDrop (); - Stopped (); /* EMIT SIGNAL */ + + if (!for_latency) { + Stopped (); /* EMIT SIGNAL */ + } return 0; } @@ -1015,7 +1028,10 @@ AudioEngine::halted_callback (const char* why) _running = false; Port::PortDrop (); /* EMIT SIGNAL */ - Halted (why); /* EMIT SIGNAL */ + + if (!_started_for_latency) { + Halted (why); /* EMIT SIGNAL */ + } } bool @@ -1044,23 +1060,26 @@ AudioEngine::mtdm() int AudioEngine::prepare_for_latency_measurement () { - if (!running()) { - _started_for_latency = true; + if (running()) { + _stopped_for_latency = true; + stop (true); + } - if (start()) { - _started_for_latency = false; - return -1; - } + if (start (true)) { + _started_for_latency = true; + return -1; } return 0; } -void +int AudioEngine::start_latency_detection () { - if (prepare_for_latency_measurement ()) { - return; + if (!running()) { + if (prepare_for_latency_measurement ()) { + return -1; + } } PortEngine& pe (port_engine()); @@ -1074,27 +1093,32 @@ AudioEngine::start_latency_detection () PortEngine::PortHandle* in = pe.get_port_by_name (_latency_input_name); if (!out || !in) { - return; + stop (true); + return -1; } /* create the ports we will use to read/write data */ if ((_latency_output_port = pe.register_port ("latency_out", DataType::AUDIO, IsOutput)) == 0) { - return; + stop (true); + return -1; } if (pe.connect (_latency_output_port, _latency_output_name)) { pe.unregister_port (_latency_output_port); - return; + stop (true); + return -1; } const string portname ("latency_in"); if ((_latency_input_port = pe.register_port (portname, DataType::AUDIO, IsInput)) == 0) { pe.unregister_port (_latency_output_port); - return; + stop (true); + return -1; } if (pe.connect (_latency_input_name, make_port_name_non_relative (portname))) { pe.unregister_port (_latency_output_port); - return; + stop (true); + return -1; } LatencyRange lr; @@ -1110,6 +1134,7 @@ AudioEngine::start_latency_detection () _measuring_latency = true; _latency_flush_frames = samples_per_cycle(); + return 0; } void @@ -1125,9 +1150,15 @@ AudioEngine::stop_latency_detection () port_engine().unregister_port (_latency_input_port); _latency_input_port = 0; } - if (_started_for_latency) { - stop (); + + stop (true); + + if (_stopped_for_latency) { + start (); } + + _stopped_for_latency = false; + _started_for_latency = false; } void |