X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Faudioengine.cc;h=8d4b17ebd4c607f27065bd79d66b703e4518b46a;hb=0026399358e04ccac5e49dd79f4c832730060370;hp=05fc469c773bbe57895e7f48d679daf764c71b7e;hpb=e5c426ed4188fe81930b81132d8ecc75bafd7004;p=ardour.git diff --git a/libs/ardour/audioengine.cc b/libs/ardour/audioengine.cc index 05fc469c77..8d4b17ebd4 100644 --- a/libs/ardour/audioengine.cc +++ b/libs/ardour/audioengine.cc @@ -41,7 +41,7 @@ #include "ardour/audio_port.h" #include "ardour/audio_backend.h" #include "ardour/audioengine.h" -#include "ardour/backend_search_path.h" +#include "ardour/search_paths.h" #include "ardour/buffer.h" #include "ardour/cycle_timer.h" #include "ardour/internal_send.h" @@ -78,7 +78,8 @@ 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); discover_backends (); @@ -86,15 +87,9 @@ AudioEngine::AudioEngine () AudioEngine::~AudioEngine () { + _in_destructor = true; + stop_metering_thread (); drop_backend (); - - config_connection.disconnect (); - - { - Glib::Threads::Mutex::Lock tm (_process_lock); - session_removed.signal (); - stop_metering_thread (); - } } AudioEngine* @@ -478,23 +473,40 @@ AudioEngine::discover_backends () Glib::PatternSpec so_extension_pattern("*backend.so"); Glib::PatternSpec dylib_extension_pattern("*backend.dylib"); +#if defined(PLATFORM_WINDOWS) && defined(DEBUGGABLE_BACKENDS) + #if defined(DEBUG) || defined(_DEBUG) + Glib::PatternSpec dll_extension_pattern("*backendD.dll"); + #else + Glib::PatternSpec dll_extension_pattern("*backendRDC.dll"); + #endif +#else + Glib::PatternSpec dll_extension_pattern("*backend.dll"); +#endif + find_matching_files_in_search_path (backend_search_path (), so_extension_pattern, backend_modules); find_matching_files_in_search_path (backend_search_path (), dylib_extension_pattern, backend_modules); - DEBUG_TRACE (DEBUG::Panning, string_compose (_("looking for backends in %1\n"), backend_search_path().to_string())); + find_matching_files_in_search_path (backend_search_path (), + dll_extension_pattern, backend_modules); + + DEBUG_TRACE (DEBUG::AudioEngine, string_compose ("looking for backends in %1\n", backend_search_path().to_string())); for (vector::iterator i = backend_modules.begin(); i != backend_modules.end(); ++i) { AudioBackendInfo* info; + DEBUG_TRACE (DEBUG::AudioEngine, string_compose ("Checking possible backend in %1\n", *i)); + if ((info = backend_discover (*i)) != 0) { _backends.insert (make_pair (info->name, info)); } } + DEBUG_TRACE (DEBUG::AudioEngine, string_compose ("Found %1 backends\n", _backends.size())); + return _backends.size(); } @@ -552,10 +564,21 @@ AudioEngine::drop_backend () { if (_backend) { _backend->stop (); + _backend->drop_device(); _backend.reset (); } } +boost::shared_ptr +AudioEngine::set_default_backend () +{ + if (_backends.empty()) { + return boost::shared_ptr(); + } + + return set_backend (_backends.begin()->first, "", ""); +} + boost::shared_ptr AudioEngine::set_backend (const std::string& name, const std::string& arg1, const std::string& arg2) { @@ -571,7 +594,7 @@ AudioEngine::set_backend (const std::string& name, const std::string& arg1, cons if (b->second->instantiate (arg1, arg2)) { throw failed_constructor (); } - + _backend = b->second->factory (*this); } catch (exception& e) { @@ -585,7 +608,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; @@ -598,7 +621,7 @@ AudioEngine::start () _processed_frames = 0; last_monitor_check = 0; - if (_backend->start()) { + if (_backend->start (for_latency)) { return -1; } @@ -614,7 +637,7 @@ AudioEngine::start () start_metering_thread (); - if (!_started_for_latency) { + if (!for_latency) { Running(); /* EMIT SIGNAL */ } @@ -622,7 +645,7 @@ AudioEngine::start () } int -AudioEngine::stop () +AudioEngine::stop (bool for_latency) { if (!_backend) { return 0; @@ -643,25 +666,11 @@ AudioEngine::stop () stop_metering_thread (); Port::PortDrop (); - Stopped (); /* EMIT SIGNAL */ - - return 0; -} -int -AudioEngine::pause () -{ - if (!_backend) { - return 0; - } - - if (_backend->pause ()) { - return -1; + if (!for_latency) { + Stopped (); /* EMIT SIGNAL */ } - - _running = false; - Stopped(); /* EMIT SIGNAL */ return 0; } @@ -678,12 +687,12 @@ AudioEngine::freewheel (bool start_stop) } float -AudioEngine::get_cpu_load() const +AudioEngine::get_dsp_load() const { if (!_backend) { return 0.0; } - return _backend->cpu_load (); + return _backend->dsp_load (); } bool @@ -824,21 +833,39 @@ AudioEngine::get_sync_offset (pframes_t& offset) const } int -AudioEngine::create_process_thread (boost::function func, AudioBackendNativeThread* thr, size_t stacksize) +AudioEngine::create_process_thread (boost::function func) { if (!_backend) { return -1; } - return _backend->create_process_thread (func, thr, stacksize); + return _backend->create_process_thread (func); } int -AudioEngine::wait_for_process_thread_exit (AudioBackendNativeThread thr) +AudioEngine::join_process_threads () +{ + if (!_backend) { + return -1; + } + return _backend->join_process_threads (); +} + +bool +AudioEngine::in_process_thread () +{ + if (!_backend) { + return false; + } + return _backend->in_process_thread (); +} + +uint32_t +AudioEngine::process_thread_count () { if (!_backend) { return 0; } - return _backend->wait_for_process_thread_exit (thr); + return _backend->process_thread_count (); } int @@ -868,15 +895,6 @@ AudioEngine::set_buffer_size (uint32_t bufsiz) return _backend->set_buffer_size (bufsiz); } -int -AudioEngine::set_sample_format (SampleFormat sf) -{ - if (!_backend) { - return -1; - } - return _backend->set_sample_format (sf); -} - int AudioEngine::set_interleaved (bool yn) { @@ -980,27 +998,33 @@ AudioEngine::update_latencies () void AudioEngine::halted_callback (const char* why) { + if (_in_destructor) { + /* everything is under control */ + return; + } + stop_metering_thread (); _running = false; Port::PortDrop (); /* EMIT SIGNAL */ - Halted (why); /* EMIT SIGNAL */ + + if (!_started_for_latency) { + Halted (why); /* EMIT SIGNAL */ + } } bool AudioEngine::setup_required () const { - /* If there is only a single backend and it claims to be configured - * already there is no setup to be done. - * - * Primarily for a case where there is only a JACK backend and - * JACK is already running. - */ - - if (_backends.size() == 1 && _backends.begin()->second->already_configured()) { - return false; + if (_backend) { + if (_backend->info().already_configured()) + return false; + } else { + if (_backends.size() == 1 && _backends.begin()->second->already_configured()) { + return false; + } } - + return true; } @@ -1013,23 +1037,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()); @@ -1039,31 +1066,36 @@ AudioEngine::start_latency_detection () /* find the ports we will connect to */ - PortEngine::PortHandle* out = pe.get_port_by_name (_latency_output_name); - PortEngine::PortHandle* in = pe.get_port_by_name (_latency_input_name); + PortEngine::PortHandle out = pe.get_port_by_name (_latency_output_name); + 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; @@ -1079,6 +1111,7 @@ AudioEngine::start_latency_detection () _measuring_latency = true; _latency_flush_frames = samples_per_cycle(); + return 0; } void @@ -1094,9 +1127,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