2 Copyright (C) 2002 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
27 #include <glibmm/timer.h>
28 #include <glibmm/pattern.h>
29 #include <glibmm/module.h>
32 #include "pbd/file_utils.h"
33 #include "pbd/pthread_utils.h"
34 #include "pbd/stacktrace.h"
35 #include "pbd/unknown_type.h"
37 #include "midi++/port.h"
38 #include "midi++/mmc.h"
40 #include "ardour/async_midi_port.h"
41 #include "ardour/audio_port.h"
42 #include "ardour/audio_backend.h"
43 #include "ardour/audioengine.h"
44 #include "ardour/backend_search_path.h"
45 #include "ardour/buffer.h"
46 #include "ardour/cycle_timer.h"
47 #include "ardour/internal_send.h"
48 #include "ardour/meter.h"
49 #include "ardour/midi_port.h"
50 #include "ardour/midiport_manager.h"
51 #include "ardour/mtdm.h"
52 #include "ardour/port.h"
53 #include "ardour/process_thread.h"
54 #include "ardour/session.h"
59 using namespace ARDOUR;
62 gint AudioEngine::m_meter_exit;
63 AudioEngine* AudioEngine::_instance = 0;
65 AudioEngine::AudioEngine ()
66 : session_remove_pending (false)
67 , session_removal_countdown (-1)
69 , _freewheeling (false)
70 , monitor_check_interval (INT32_MAX)
71 , last_monitor_check (0)
72 , _processed_frames (0)
76 , _measuring_latency (false)
77 , _latency_input_port (0)
78 , _latency_output_port (0)
79 , _latency_flush_frames (0)
80 , _latency_signal_latency (0)
81 , _stopped_for_latency (false)
82 , _in_destructor (false)
84 g_atomic_int_set (&m_meter_exit, 0);
88 AudioEngine::~AudioEngine ()
90 _in_destructor = true;
91 stop_metering_thread ();
96 AudioEngine::create ()
102 _instance = new AudioEngine ();
108 _thread_init_callback (void * /*arg*/)
110 /* make sure that anybody who needs to know about this thread
114 pthread_set_name (X_("audioengine"));
116 PBD::notify_gui_about_thread_creation ("gui", pthread_self(), X_("Audioengine"), 4096);
117 PBD::notify_gui_about_thread_creation ("midiui", pthread_self(), X_("Audioengine"), 128);
119 SessionEvent::create_per_thread_pool (X_("Audioengine"), 512);
121 AsyncMIDIPort::set_process_thread (pthread_self());
125 AudioEngine::split_cycle (pframes_t offset)
127 /* caller must hold process lock */
129 Port::increment_global_port_buffer_offset (offset);
131 /* tell all Ports that we're going to start a new (split) cycle */
133 boost::shared_ptr<Ports> p = ports.reader();
135 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
136 i->second->cycle_split ();
141 AudioEngine::sample_rate_change (pframes_t nframes)
143 /* check for monitor input change every 1/10th of second */
145 monitor_check_interval = nframes / 10;
146 last_monitor_check = 0;
149 _session->set_frame_rate (nframes);
152 SampleRateChanged (nframes); /* EMIT SIGNAL */
158 AudioEngine::buffer_size_change (pframes_t bufsiz)
161 _session->set_block_size (bufsiz);
162 last_monitor_check = 0;
168 /** Method called by our ::process_thread when there is work to be done.
169 * @param nframes Number of frames to process.
172 AudioEngine::process_callback (pframes_t nframes)
174 Glib::Threads::Mutex::Lock tm (_process_lock, Glib::Threads::TRY_LOCK);
179 /// The number of frames that will have been processed when we've finished
180 pframes_t next_processed_frames;
182 /* handle wrap around of total frames counter */
184 if (max_framepos - _processed_frames < nframes) {
185 next_processed_frames = nframes - (max_framepos - _processed_frames);
187 next_processed_frames = _processed_frames + nframes;
191 /* return having done nothing */
192 _processed_frames = next_processed_frames;
196 bool return_after_remove_check = false;
198 if (_measuring_latency && _mtdm) {
199 /* run a normal cycle from the perspective of the PortManager
200 so that we get silence on all registered ports.
202 we overwrite the silence on the two ports used for latency
206 PortManager::cycle_start (nframes);
207 PortManager::silence (nframes);
209 if (_latency_input_port && _latency_output_port) {
210 PortEngine& pe (port_engine());
212 Sample* in = (Sample*) pe.get_buffer (_latency_input_port, nframes);
213 Sample* out = (Sample*) pe.get_buffer (_latency_output_port, nframes);
215 _mtdm->process (nframes, in, out);
218 PortManager::cycle_end (nframes);
219 return_after_remove_check = true;
221 } else if (_latency_flush_frames) {
223 /* wait for the appropriate duration for the MTDM signal to
224 * drain from the ports before we revert to normal behaviour.
227 PortManager::cycle_start (nframes);
228 PortManager::silence (nframes);
229 PortManager::cycle_end (nframes);
231 if (_latency_flush_frames > nframes) {
232 _latency_flush_frames -= nframes;
234 _latency_flush_frames = 0;
237 return_after_remove_check = true;
240 if (session_remove_pending) {
242 /* perform the actual session removal */
244 if (session_removal_countdown < 0) {
246 /* fade out over 1 second */
247 session_removal_countdown = sample_rate()/2;
248 session_removal_gain = 1.0;
249 session_removal_gain_step = 1.0/session_removal_countdown;
251 } else if (session_removal_countdown > 0) {
253 /* we'll be fading audio out.
255 if this is the last time we do this as part
256 of session removal, do a MIDI panic now
257 to get MIDI stopped. This relies on the fact
258 that "immediate data" (aka "out of band data") from
259 MIDI tracks is *appended* after any other data,
260 so that it emerges after any outbound note ons, etc.
263 if (session_removal_countdown <= nframes) {
264 _session->midi_panic ();
270 session_removal_countdown = -1; // reset to "not in progress"
271 session_remove_pending = false;
272 session_removed.signal(); // wakes up thread that initiated session removal
276 if (return_after_remove_check) {
282 if (!_freewheeling) {
283 PortManager::cycle_start (nframes);
284 PortManager::cycle_end (nframes);
287 _processed_frames = next_processed_frames;
292 /* tell all relevant objects that we're starting a new cycle */
294 InternalSend::CycleStart (nframes);
296 /* tell all Ports that we're starting a new cycle */
298 PortManager::cycle_start (nframes);
300 /* test if we are freewheeling and there are freewheel signals connected.
301 ardour should act normally even when freewheeling unless /it/ is
302 exporting (which is what Freewheel.empty() tests for).
305 if (_freewheeling && !Freewheel.empty()) {
309 _session->process (nframes);
318 _processed_frames = next_processed_frames;
322 if (last_monitor_check + monitor_check_interval < next_processed_frames) {
324 PortManager::check_monitoring ();
325 last_monitor_check = next_processed_frames;
328 if (_session->silent()) {
329 PortManager::silence (nframes);
332 if (session_remove_pending && session_removal_countdown) {
334 PortManager::fade_out (session_removal_gain, session_removal_gain_step, nframes);
336 if (session_removal_countdown > nframes) {
337 session_removal_countdown -= nframes;
339 session_removal_countdown = 0;
342 session_removal_gain -= (nframes * session_removal_gain_step);
345 PortManager::cycle_end (nframes);
347 _processed_frames = next_processed_frames;
356 AudioEngine::stop_metering_thread ()
358 if (m_meter_thread) {
359 g_atomic_int_set (&m_meter_exit, 1);
360 m_meter_thread->join ();
366 AudioEngine::start_metering_thread ()
368 if (m_meter_thread == 0) {
369 g_atomic_int_set (&m_meter_exit, 0);
370 m_meter_thread = Glib::Threads::Thread::create (boost::bind (&AudioEngine::meter_thread, this));
375 AudioEngine::meter_thread ()
377 pthread_set_name (X_("meter"));
380 Glib::usleep (10000); /* 1/100th sec interval */
381 if (g_atomic_int_get(&m_meter_exit)) {
389 AudioEngine::set_session (Session *s)
391 Glib::Threads::Mutex::Lock pl (_process_lock);
393 SessionHandlePtr::set_session (s);
397 pframes_t blocksize = samples_per_cycle ();
399 PortManager::cycle_start (blocksize);
401 _session->process (blocksize);
402 _session->process (blocksize);
403 _session->process (blocksize);
404 _session->process (blocksize);
405 _session->process (blocksize);
406 _session->process (blocksize);
407 _session->process (blocksize);
408 _session->process (blocksize);
410 PortManager::cycle_end (blocksize);
415 AudioEngine::remove_session ()
417 Glib::Threads::Mutex::Lock lm (_process_lock);
422 session_remove_pending = true;
423 session_removal_countdown = 0;
424 session_removed.wait(_process_lock);
428 SessionHandlePtr::set_session (0);
438 /* called from a signal handler for SIGPIPE */
440 stop_metering_thread ();
446 AudioEngine::reset_timebase ()
449 if (_session->config.get_jack_time_master()) {
450 _backend->set_time_master (true);
452 _backend->set_time_master (false);
460 AudioEngine::destroy ()
467 AudioEngine::discover_backends ()
469 vector<std::string> backend_modules;
473 Glib::PatternSpec so_extension_pattern("*backend.so");
474 Glib::PatternSpec dylib_extension_pattern("*backend.dylib");
475 Glib::PatternSpec dll_extension_pattern("*backend.dll");
477 find_matching_files_in_search_path (backend_search_path (),
478 so_extension_pattern, backend_modules);
480 find_matching_files_in_search_path (backend_search_path (),
481 dylib_extension_pattern, backend_modules);
483 find_matching_files_in_search_path (backend_search_path (),
484 dll_extension_pattern, backend_modules);
486 DEBUG_TRACE (DEBUG::Panning, string_compose (_("looking for backends in %1\n"), backend_search_path().to_string()));
488 for (vector<std::string>::iterator i = backend_modules.begin(); i != backend_modules.end(); ++i) {
490 AudioBackendInfo* info;
492 if ((info = backend_discover (*i)) != 0) {
493 _backends.insert (make_pair (info->name, info));
497 return _backends.size();
501 AudioEngine::backend_discover (const string& path)
503 Glib::Module module (path);
504 AudioBackendInfo* info;
505 AudioBackendInfo* (*dfunc)(void);
509 error << string_compose(_("AudioEngine: cannot load module \"%1\" (%2)"), path,
510 Glib::Module::get_last_error()) << endmsg;
514 if (!module.get_symbol ("descriptor", func)) {
515 error << string_compose(_("AudioEngine: backend at \"%1\" has no descriptor function."), path) << endmsg;
516 error << Glib::Module::get_last_error() << endmsg;
520 module.make_resident ();
522 dfunc = (AudioBackendInfo* (*)(void))func;
528 vector<const AudioBackendInfo*>
529 AudioEngine::available_backends() const
531 vector<const AudioBackendInfo*> r;
533 for (BackendMap::const_iterator i = _backends.begin(); i != _backends.end(); ++i) {
534 r.push_back (i->second);
541 AudioEngine::current_backend_name() const
544 return _backend->name();
550 AudioEngine::drop_backend ()
558 boost::shared_ptr<AudioBackend>
559 AudioEngine::set_default_backend ()
561 if (_backends.empty()) {
562 return boost::shared_ptr<AudioBackend>();
565 return set_backend (_backends.begin()->first, "", "");
568 boost::shared_ptr<AudioBackend>
569 AudioEngine::set_backend (const std::string& name, const std::string& arg1, const std::string& arg2)
571 BackendMap::iterator b = _backends.find (name);
573 if (b == _backends.end()) {
574 return boost::shared_ptr<AudioBackend>();
580 if (b->second->instantiate (arg1, arg2)) {
581 throw failed_constructor ();
584 _backend = b->second->factory (*this);
586 } catch (exception& e) {
587 error << string_compose (_("Could not create backend for %1: %2"), name, e.what()) << endmsg;
588 return boost::shared_ptr<AudioBackend>();
594 /* BACKEND PROXY WRAPPERS */
597 AudioEngine::start (bool for_latency)
607 _processed_frames = 0;
608 last_monitor_check = 0;
610 if (_backend->start (for_latency)) {
617 _session->set_frame_rate (_backend->sample_rate());
619 if (_session->config.get_jack_time_master()) {
620 _backend->set_time_master (true);
624 start_metering_thread ();
627 Running(); /* EMIT SIGNAL */
634 AudioEngine::stop (bool for_latency)
640 Glib::Threads::Mutex::Lock lm (_process_lock);
642 if (_backend->stop ()) {
647 _processed_frames = 0;
648 _measuring_latency = false;
649 _latency_output_port = 0;
650 _latency_input_port = 0;
651 _started_for_latency = false;
652 stop_metering_thread ();
657 Stopped (); /* EMIT SIGNAL */
664 AudioEngine::freewheel (bool start_stop)
670 /* _freewheeling will be set when first Freewheel signal occurs */
672 return _backend->freewheel (start_stop);
676 AudioEngine::get_cpu_load() const
681 return _backend->cpu_load ();
685 AudioEngine::is_realtime() const
691 return _backend->is_realtime();
695 AudioEngine::connected() const
701 return _backend->available();
705 AudioEngine::transport_start ()
710 return _backend->transport_start ();
714 AudioEngine::transport_stop ()
719 return _backend->transport_stop ();
723 AudioEngine::transport_state ()
726 return TransportStopped;
728 return _backend->transport_state ();
732 AudioEngine::transport_locate (framepos_t pos)
737 return _backend->transport_locate (pos);
741 AudioEngine::transport_frame()
746 return _backend->transport_frame ();
750 AudioEngine::sample_rate () const
755 return _backend->sample_rate ();
759 AudioEngine::samples_per_cycle () const
764 return _backend->buffer_size ();
768 AudioEngine::usecs_per_cycle () const
773 return _backend->usecs_per_cycle ();
777 AudioEngine::raw_buffer_size (DataType t)
782 return _backend->raw_buffer_size (t);
786 AudioEngine::sample_time ()
791 return _backend->sample_time ();
795 AudioEngine::sample_time_at_cycle_start ()
800 return _backend->sample_time_at_cycle_start ();
804 AudioEngine::samples_since_cycle_start ()
809 return _backend->samples_since_cycle_start ();
813 AudioEngine::get_sync_offset (pframes_t& offset) const
818 return _backend->get_sync_offset (offset);
822 AudioEngine::create_process_thread (boost::function<void()> func)
827 return _backend->create_process_thread (func);
831 AudioEngine::join_process_threads ()
836 return _backend->join_process_threads ();
840 AudioEngine::in_process_thread ()
845 return _backend->in_process_thread ();
849 AudioEngine::process_thread_count ()
854 return _backend->process_thread_count ();
858 AudioEngine::set_device_name (const std::string& name)
863 return _backend->set_device_name (name);
867 AudioEngine::set_sample_rate (float sr)
872 return _backend->set_sample_rate (sr);
876 AudioEngine::set_buffer_size (uint32_t bufsiz)
881 return _backend->set_buffer_size (bufsiz);
885 AudioEngine::set_sample_format (SampleFormat sf)
890 return _backend->set_sample_format (sf);
894 AudioEngine::set_interleaved (bool yn)
899 return _backend->set_interleaved (yn);
903 AudioEngine::set_input_channels (uint32_t ic)
908 return _backend->set_input_channels (ic);
912 AudioEngine::set_output_channels (uint32_t oc)
917 return _backend->set_output_channels (oc);
921 AudioEngine::set_systemic_input_latency (uint32_t il)
926 return _backend->set_systemic_input_latency (il);
930 AudioEngine::set_systemic_output_latency (uint32_t ol)
935 return _backend->set_systemic_output_latency (ol);
938 /* END OF BACKEND PROXY API */
941 AudioEngine::thread_init_callback (void* arg)
943 /* make sure that anybody who needs to know about this thread
947 pthread_set_name (X_("audioengine"));
949 PBD::notify_gui_about_thread_creation ("gui", pthread_self(), X_("AudioEngine"), 4096);
950 PBD::notify_gui_about_thread_creation ("midiui", pthread_self(), X_("AudioEngine"), 128);
952 SessionEvent::create_per_thread_pool (X_("AudioEngine"), 512);
954 AsyncMIDIPort::set_process_thread (pthread_self());
957 /* the special thread created/managed by the backend */
958 AudioEngine::instance()->_main_thread = new ProcessThread;
963 AudioEngine::sync_callback (TransportState state, framepos_t position)
966 return _session->backend_sync_callback (state, position);
972 AudioEngine::freewheel_callback (bool onoff)
974 _freewheeling = onoff;
978 AudioEngine::latency_callback (bool for_playback)
981 _session->update_latency (for_playback);
986 AudioEngine::update_latencies ()
989 _backend->update_latencies ();
994 AudioEngine::halted_callback (const char* why)
996 if (_in_destructor) {
997 /* everything is under control */
1001 stop_metering_thread ();
1004 Port::PortDrop (); /* EMIT SIGNAL */
1006 if (!_started_for_latency) {
1007 Halted (why); /* EMIT SIGNAL */
1012 AudioEngine::setup_required () const
1014 /* If there is only a single backend and it claims to be configured
1015 * already there is no setup to be done.
1017 * Primarily for a case where there is only a JACK backend and
1018 * JACK is already running.
1021 if (_backends.size() == 1 && _backends.begin()->second->already_configured()) {
1035 AudioEngine::prepare_for_latency_measurement ()
1038 _stopped_for_latency = true;
1043 _started_for_latency = true;
1051 AudioEngine::start_latency_detection ()
1054 if (prepare_for_latency_measurement ()) {
1059 PortEngine& pe (port_engine());
1064 /* find the ports we will connect to */
1066 PortEngine::PortHandle out = pe.get_port_by_name (_latency_output_name);
1067 PortEngine::PortHandle in = pe.get_port_by_name (_latency_input_name);
1074 /* create the ports we will use to read/write data */
1076 if ((_latency_output_port = pe.register_port ("latency_out", DataType::AUDIO, IsOutput)) == 0) {
1080 if (pe.connect (_latency_output_port, _latency_output_name)) {
1081 pe.unregister_port (_latency_output_port);
1086 const string portname ("latency_in");
1087 if ((_latency_input_port = pe.register_port (portname, DataType::AUDIO, IsInput)) == 0) {
1088 pe.unregister_port (_latency_output_port);
1092 if (pe.connect (_latency_input_name, make_port_name_non_relative (portname))) {
1093 pe.unregister_port (_latency_output_port);
1099 _latency_signal_latency = 0;
1100 lr = pe.get_latency_range (in, false);
1101 _latency_signal_latency = lr.max;
1102 lr = pe.get_latency_range (out, true);
1103 _latency_signal_latency += lr.max;
1105 /* all created and connected, lets go */
1107 _mtdm = new MTDM (sample_rate());
1108 _measuring_latency = true;
1109 _latency_flush_frames = samples_per_cycle();
1115 AudioEngine::stop_latency_detection ()
1117 _measuring_latency = false;
1119 if (_latency_output_port) {
1120 port_engine().unregister_port (_latency_output_port);
1121 _latency_output_port = 0;
1123 if (_latency_input_port) {
1124 port_engine().unregister_port (_latency_input_port);
1125 _latency_input_port = 0;
1130 if (_stopped_for_latency) {
1134 _stopped_for_latency = false;
1135 _started_for_latency = false;
1139 AudioEngine::set_latency_output_port (const string& name)
1141 _latency_output_name = name;
1145 AudioEngine::set_latency_input_port (const string& name)
1147 _latency_input_name = name;