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>
29 #include "pbd/pthread_utils.h"
30 #include "pbd/stacktrace.h"
31 #include "pbd/unknown_type.h"
34 #include <jack/weakjack.h>
36 #include "midi++/port.h"
37 #include "midi++/jack_midi_port.h"
38 #include "midi++/mmc.h"
39 #include "midi++/manager.h"
41 #include "ardour/audio_port.h"
42 #include "ardour/audioengine.h"
43 #include "ardour/buffer.h"
44 #include "ardour/cycle_timer.h"
45 #include "ardour/internal_send.h"
46 #include "ardour/meter.h"
47 #include "ardour/midi_port.h"
48 #include "ardour/port.h"
49 #include "ardour/process_thread.h"
50 #include "ardour/session.h"
55 using namespace ARDOUR;
58 gint AudioEngine::m_meter_exit;
59 AudioEngine* AudioEngine::_instance = 0;
61 #define GET_PRIVATE_JACK_POINTER(j) jack_client_t* _priv_jack = (jack_client_t*) (j); if (!_priv_jack) { return; }
62 #define GET_PRIVATE_JACK_POINTER_RET(j,r) jack_client_t* _priv_jack = (jack_client_t*) (j); if (!_priv_jack) { return r; }
64 AudioEngine::AudioEngine (string client_name, string session_uuid)
66 , session_remove_pending (false)
67 , session_removal_countdown (-1)
72 , monitor_check_interval (INT32_MAX)
73 , last_monitor_check (0)
74 , _processed_frames (0)
75 , _freewheeling (false)
76 , _pre_freewheel_mmc_enabled (false)
77 , _usecs_per_cycle (0)
78 , port_remove_in_progress (false)
83 _instance = this; /* singleton */
85 g_atomic_int_set (&m_meter_exit, 0);
87 if (connect_to_jack (client_name, session_uuid)) {
88 throw NoBackendAvailable ();
91 Port::set_engine (this);
94 _ltc_input = register_port (DataType::AUDIO, _("LTC in"), true);
96 /* As of October 2012, the LTC source port is the only thing that needs
97 * to care about Config parameters, so don't bother to listen if we're
98 * not doing LTC stuff. This might change if other parameters show up
99 * in the future that we need to care about with or without LTC.
102 Config->ParameterChanged.connect_same_thread (config_connection, boost::bind (&AudioEngine::parameter_changed, this, _1));
106 AudioEngine::~AudioEngine ()
108 config_connection.disconnect ();
111 Glib::Threads::Mutex::Lock tm (_process_lock);
112 session_removed.signal ();
115 jack_client_close (_jack);
119 stop_metering_thread ();
124 AudioEngine::jack() const
130 _thread_init_callback (void * /*arg*/)
132 /* make sure that anybody who needs to know about this thread
136 pthread_set_name (X_("audioengine"));
138 PBD::notify_gui_about_thread_creation ("gui", pthread_self(), X_("Audioengine"), 4096);
139 PBD::notify_gui_about_thread_creation ("midiui", pthread_self(), X_("Audioengine"), 128);
141 SessionEvent::create_per_thread_pool (X_("Audioengine"), 512);
143 MIDI::JackMIDIPort::set_process_thread (pthread_self());
147 ardour_jack_error (const char* msg)
149 error << "JACK: " << msg << endmsg;
153 AudioEngine::set_jack_callbacks ()
155 GET_PRIVATE_JACK_POINTER (_jack);
157 if (jack_on_info_shutdown) {
158 jack_on_info_shutdown (_priv_jack, halted_info, this);
160 jack_on_shutdown (_priv_jack, halted, this);
163 jack_set_thread_init_callback (_priv_jack, _thread_init_callback, this);
164 jack_set_process_thread (_priv_jack, _process_thread, this);
165 jack_set_sample_rate_callback (_priv_jack, _sample_rate_callback, this);
166 jack_set_buffer_size_callback (_priv_jack, _bufsize_callback, this);
167 jack_set_graph_order_callback (_priv_jack, _graph_order_callback, this);
168 jack_set_port_registration_callback (_priv_jack, _registration_callback, this);
169 jack_set_port_connect_callback (_priv_jack, _connect_callback, this);
170 jack_set_xrun_callback (_priv_jack, _xrun_callback, this);
171 jack_set_sync_callback (_priv_jack, _jack_sync_callback, this);
172 jack_set_freewheel_callback (_priv_jack, _freewheel_callback, this);
174 if (_session && _session->config.get_jack_time_master()) {
175 jack_set_timebase_callback (_priv_jack, 0, _jack_timebase_callback, this);
178 #ifdef HAVE_JACK_SESSION
179 if( jack_set_session_callback)
180 jack_set_session_callback (_priv_jack, _session_callback, this);
183 if (jack_set_latency_callback) {
184 jack_set_latency_callback (_priv_jack, _latency_callback, this);
187 jack_set_error_function (ardour_jack_error);
191 AudioEngine::start ()
193 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
197 if (!jack_port_type_get_buffer_size) {
198 warning << _("This version of JACK is old - you should upgrade to a newer version that supports jack_port_type_get_buffer_size()") << endmsg;
202 BootMessage (_("Connect session to engine"));
203 _session->set_frame_rate (jack_get_sample_rate (_priv_jack));
206 /* a proxy for whether jack_activate() will definitely call the buffer size
207 * callback. with older versions of JACK, this function symbol will be null.
208 * this is reliable, but not clean.
211 if (!jack_port_type_get_buffer_size) {
212 jack_bufsize_callback (jack_get_buffer_size (_priv_jack));
215 _processed_frames = 0;
216 last_monitor_check = 0;
218 set_jack_callbacks ();
220 if (jack_activate (_priv_jack) == 0) {
223 Running(); /* EMIT SIGNAL */
228 // error << _("cannot activate JACK client") << endmsg;
232 return _running ? 0 : -1;
236 AudioEngine::stop (bool forever)
238 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
242 disconnect_from_jack ();
244 jack_deactivate (_priv_jack);
245 Stopped(); /* EMIT SIGNAL */
246 MIDI::JackMIDIPort::JackHalted (); /* EMIT SIGNAL */
251 stop_metering_thread ();
254 return _running ? -1 : 0;
259 AudioEngine::get_sync_offset (pframes_t& offset) const
262 #ifdef HAVE_JACK_VIDEO_SUPPORT
264 GET_PRIVATE_JACK_POINTER_RET (_jack, false);
269 (void) jack_transport_query (_priv_jack, &pos);
271 if (pos.valid & JackVideoFrameOffset) {
272 offset = pos.video_offset;
285 AudioEngine::_jack_timebase_callback (jack_transport_state_t state, pframes_t nframes,
286 jack_position_t* pos, int new_position, void *arg)
288 static_cast<AudioEngine*> (arg)->jack_timebase_callback (state, nframes, pos, new_position);
292 AudioEngine::jack_timebase_callback (jack_transport_state_t state, pframes_t nframes,
293 jack_position_t* pos, int new_position)
295 if (_jack && _session && _session->synced_to_jack()) {
296 _session->jack_timebase_callback (state, nframes, pos, new_position);
301 AudioEngine::_jack_sync_callback (jack_transport_state_t state, jack_position_t* pos, void* arg)
303 return static_cast<AudioEngine*> (arg)->jack_sync_callback (state, pos);
307 AudioEngine::jack_sync_callback (jack_transport_state_t state, jack_position_t* pos)
309 if (_jack && _session) {
310 return _session->jack_sync_callback (state, pos);
317 AudioEngine::_xrun_callback (void *arg)
319 AudioEngine* ae = static_cast<AudioEngine*> (arg);
320 if (ae->connected()) {
321 ae->Xrun (); /* EMIT SIGNAL */
326 #ifdef HAVE_JACK_SESSION
328 AudioEngine::_session_callback (jack_session_event_t *event, void *arg)
330 AudioEngine* ae = static_cast<AudioEngine*> (arg);
331 if (ae->connected()) {
332 ae->JackSessionEvent ( event ); /* EMIT SIGNAL */
338 AudioEngine::_graph_order_callback (void *arg)
340 AudioEngine* ae = static_cast<AudioEngine*> (arg);
342 if (ae->connected() && !ae->port_remove_in_progress) {
343 ae->GraphReordered (); /* EMIT SIGNAL */
350 AudioEngine::_process_thread (void *arg)
352 return static_cast<AudioEngine *> (arg)->process_thread ();
356 AudioEngine::_freewheel_callback (int onoff, void *arg)
358 static_cast<AudioEngine*>(arg)->freewheel_callback (onoff);
362 AudioEngine::freewheel_callback (int onoff)
364 _freewheeling = onoff;
367 _pre_freewheel_mmc_enabled = MIDI::Manager::instance()->mmc()->send_enabled ();
368 MIDI::Manager::instance()->mmc()->enable_send (false);
370 MIDI::Manager::instance()->mmc()->enable_send (_pre_freewheel_mmc_enabled);
375 AudioEngine::_registration_callback (jack_port_id_t /*id*/, int /*reg*/, void* arg)
377 AudioEngine* ae = static_cast<AudioEngine*> (arg);
379 if (!ae->port_remove_in_progress) {
380 ae->PortRegisteredOrUnregistered (); /* EMIT SIGNAL */
385 AudioEngine::_latency_callback (jack_latency_callback_mode_t mode, void* arg)
387 return static_cast<AudioEngine *> (arg)->jack_latency_callback (mode);
391 AudioEngine::_connect_callback (jack_port_id_t id_a, jack_port_id_t id_b, int conn, void* arg)
393 AudioEngine* ae = static_cast<AudioEngine*> (arg);
394 ae->connect_callback (id_a, id_b, conn);
398 AudioEngine::connect_callback (jack_port_id_t id_a, jack_port_id_t id_b, int conn)
400 if (port_remove_in_progress) {
404 GET_PRIVATE_JACK_POINTER (_jack);
406 jack_port_t* jack_port_a = jack_port_by_id (_priv_jack, id_a);
407 jack_port_t* jack_port_b = jack_port_by_id (_priv_jack, id_b);
409 boost::shared_ptr<Port> port_a;
410 boost::shared_ptr<Port> port_b;
412 boost::shared_ptr<Ports> pr = ports.reader ();
415 x = pr->find (make_port_name_relative (jack_port_name (jack_port_a)));
416 if (x != pr->end()) {
420 x = pr->find (make_port_name_relative (jack_port_name (jack_port_b)));
421 if (x != pr->end()) {
425 PortConnectedOrDisconnected (
426 port_a, jack_port_name (jack_port_a),
427 port_b, jack_port_name (jack_port_b),
428 conn == 0 ? false : true
433 AudioEngine::split_cycle (pframes_t offset)
435 /* caller must hold process lock */
437 Port::increment_global_port_buffer_offset (offset);
439 /* tell all Ports that we're going to start a new (split) cycle */
441 boost::shared_ptr<Ports> p = ports.reader();
443 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
444 i->second->cycle_split ();
449 AudioEngine::process_thread ()
451 /* JACK doesn't do this for us when we use the wait API
454 _thread_init_callback (0);
456 _main_thread = new ProcessThread;
459 GET_PRIVATE_JACK_POINTER_RET(_jack,0);
461 pframes_t nframes = jack_cycle_wait (_priv_jack);
463 if (process_callback (nframes)) {
467 jack_cycle_signal (_priv_jack, 0);
473 /** Method called by our ::process_thread when there is work to be done.
474 * @param nframes Number of frames to process.
477 AudioEngine::process_callback (pframes_t nframes)
479 GET_PRIVATE_JACK_POINTER_RET(_jack,0);
480 Glib::Threads::Mutex::Lock tm (_process_lock, Glib::Threads::TRY_LOCK);
485 /// The number of frames that will have been processed when we've finished
486 pframes_t next_processed_frames;
488 /* handle wrap around of total frames counter */
490 if (max_framepos - _processed_frames < nframes) {
491 next_processed_frames = nframes - (max_framepos - _processed_frames);
493 next_processed_frames = _processed_frames + nframes;
497 /* return having done nothing */
498 _processed_frames = next_processed_frames;
502 if (session_remove_pending) {
504 /* perform the actual session removal */
506 if (session_removal_countdown < 0) {
508 /* fade out over 1 second */
509 session_removal_countdown = _frame_rate/2;
510 session_removal_gain = 1.0;
511 session_removal_gain_step = 1.0/session_removal_countdown;
513 } else if (session_removal_countdown > 0) {
515 /* we'll be fading audio out.
517 if this is the last time we do this as part
518 of session removal, do a MIDI panic now
519 to get MIDI stopped. This relies on the fact
520 that "immediate data" (aka "out of band data") from
521 MIDI tracks is *appended* after any other data,
522 so that it emerges after any outbound note ons, etc.
525 if (session_removal_countdown <= nframes) {
526 _session->midi_panic ();
532 session_removal_countdown = -1; // reset to "not in progress"
533 session_remove_pending = false;
534 session_removed.signal(); // wakes up thread that initiated session removal
540 if (!_freewheeling) {
541 MIDI::Manager::instance()->cycle_start(nframes);
542 MIDI::Manager::instance()->cycle_end();
545 _processed_frames = next_processed_frames;
550 /* tell all relevant objects that we're starting a new cycle */
552 InternalSend::CycleStart (nframes);
553 Port::set_global_port_buffer_offset (0);
554 Port::set_cycle_framecnt (nframes);
556 /* tell all Ports that we're starting a new cycle */
558 boost::shared_ptr<Ports> p = ports.reader();
560 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
561 i->second->cycle_start (nframes);
564 /* test if we are freewheeling and there are freewheel signals connected.
565 ardour should act normally even when freewheeling unless /it/ is exporting */
568 if (_freewheeling && !Freewheel.empty()) {
569 /* emit the Freewheel signal and stop freewheeling in the event of trouble
571 boost::optional<int> r = Freewheel (nframes);
572 if (r.get_value_or (0)) {
573 jack_set_freewheel (_priv_jack, false);
577 MIDI::Manager::instance()->cycle_start(nframes);
580 _session->process (nframes);
583 MIDI::Manager::instance()->cycle_end();
591 _processed_frames = next_processed_frames;
595 if (last_monitor_check + monitor_check_interval < next_processed_frames) {
597 boost::shared_ptr<Ports> p = ports.reader();
599 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
603 if (i->second->last_monitor() != (x = i->second->jack_monitoring_input ())) {
604 i->second->set_last_monitor (x);
605 /* XXX I think this is dangerous, due to
606 a likely mutex in the signal handlers ...
608 i->second->MonitorInputChanged (x); /* EMIT SIGNAL */
611 last_monitor_check = next_processed_frames;
614 if (_session->silent()) {
616 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
618 if (i->second->sends_output()) {
619 i->second->get_buffer(nframes).silence(nframes);
624 if (session_remove_pending && session_removal_countdown) {
626 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
628 if (i->second->sends_output()) {
630 boost::shared_ptr<AudioPort> ap = boost::dynamic_pointer_cast<AudioPort> (i->second);
632 Sample* s = ap->engine_get_whole_audio_buffer ();
633 gain_t g = session_removal_gain;
635 for (pframes_t n = 0; n < nframes; ++n) {
637 g -= session_removal_gain_step;
643 if (session_removal_countdown > nframes) {
644 session_removal_countdown -= nframes;
646 session_removal_countdown = 0;
649 session_removal_gain -= (nframes * session_removal_gain_step);
654 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
655 i->second->cycle_end (nframes);
658 _processed_frames = next_processed_frames;
666 AudioEngine::_sample_rate_callback (pframes_t nframes, void *arg)
668 return static_cast<AudioEngine *> (arg)->jack_sample_rate_callback (nframes);
672 AudioEngine::jack_sample_rate_callback (pframes_t nframes)
674 _frame_rate = nframes;
675 _usecs_per_cycle = (int) floor ((((double) frames_per_cycle() / nframes)) * 1000000.0);
677 /* check for monitor input change every 1/10th of second */
679 monitor_check_interval = nframes / 10;
680 last_monitor_check = 0;
683 _session->set_frame_rate (nframes);
686 SampleRateChanged (nframes); /* EMIT SIGNAL */
692 AudioEngine::jack_latency_callback (jack_latency_callback_mode_t mode)
695 _session->update_latency (mode == JackPlaybackLatency);
700 AudioEngine::_bufsize_callback (pframes_t nframes, void *arg)
702 return static_cast<AudioEngine *> (arg)->jack_bufsize_callback (nframes);
706 AudioEngine::jack_bufsize_callback (pframes_t nframes)
708 /* if the size has not changed, this should be a no-op */
710 if (nframes == _buffer_size) {
714 GET_PRIVATE_JACK_POINTER_RET (_jack, 1);
716 _buffer_size = nframes;
717 _usecs_per_cycle = (int) floor ((((double) nframes / frame_rate())) * 1000000.0);
718 last_monitor_check = 0;
720 if (jack_port_type_get_buffer_size) {
721 _raw_buffer_sizes[DataType::AUDIO] = jack_port_type_get_buffer_size (_priv_jack, JACK_DEFAULT_AUDIO_TYPE);
722 _raw_buffer_sizes[DataType::MIDI] = jack_port_type_get_buffer_size (_priv_jack, JACK_DEFAULT_MIDI_TYPE);
725 /* Old version of JACK.
727 These crude guesses, see below where we try to get the right answers.
729 Note that our guess for MIDI deliberatey tries to overestimate
730 by a little. It would be nicer if we could get the actual
731 size from a port, but we have to use this estimate in the
732 event that there are no MIDI ports currently. If there are
733 the value will be adjusted below.
736 _raw_buffer_sizes[DataType::AUDIO] = nframes * sizeof (Sample);
737 _raw_buffer_sizes[DataType::MIDI] = nframes * 4 - (nframes/2);
741 Glib::Threads::Mutex::Lock lm (_process_lock);
743 boost::shared_ptr<Ports> p = ports.reader();
745 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
751 _session->set_block_size (_buffer_size);
758 AudioEngine::stop_metering_thread ()
760 if (m_meter_thread) {
761 g_atomic_int_set (&m_meter_exit, 1);
762 m_meter_thread->join ();
768 AudioEngine::start_metering_thread ()
770 if (m_meter_thread == 0) {
771 g_atomic_int_set (&m_meter_exit, 0);
772 m_meter_thread = Glib::Threads::Thread::create (boost::bind (&AudioEngine::meter_thread, this));
777 AudioEngine::meter_thread ()
779 pthread_set_name (X_("meter"));
782 Glib::usleep (10000); /* 1/100th sec interval */
783 if (g_atomic_int_get(&m_meter_exit)) {
791 AudioEngine::set_session (Session *s)
793 Glib::Threads::Mutex::Lock pl (_process_lock);
795 SessionHandlePtr::set_session (s);
799 start_metering_thread ();
801 pframes_t blocksize = jack_get_buffer_size (_jack);
803 /* page in as much of the session process code as we
804 can before we really start running.
807 boost::shared_ptr<Ports> p = ports.reader();
809 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
810 i->second->cycle_start (blocksize);
813 _session->process (blocksize);
814 _session->process (blocksize);
815 _session->process (blocksize);
816 _session->process (blocksize);
817 _session->process (blocksize);
818 _session->process (blocksize);
819 _session->process (blocksize);
820 _session->process (blocksize);
822 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
823 i->second->cycle_end (blocksize);
829 AudioEngine::remove_session ()
831 Glib::Threads::Mutex::Lock lm (_process_lock);
835 stop_metering_thread ();
838 session_remove_pending = true;
839 session_removed.wait(_process_lock);
843 SessionHandlePtr::set_session (0);
850 AudioEngine::port_registration_failure (const std::string& portname)
852 GET_PRIVATE_JACK_POINTER (_jack);
853 string full_portname = jack_client_name;
854 full_portname += ':';
855 full_portname += portname;
858 jack_port_t* p = jack_port_by_name (_priv_jack, full_portname.c_str());
862 reason = string_compose (_("a port with the name \"%1\" already exists: check for duplicated track/bus names"), portname);
864 reason = string_compose (_("No more JACK ports are available. You will need to stop %1 and restart JACK with more ports if you need this many tracks."), PROGRAM_NAME);
867 throw PortRegistrationFailure (string_compose (_("AudioEngine: cannot register port \"%1\": %2"), portname, reason).c_str());
870 boost::shared_ptr<Port>
871 AudioEngine::register_port (DataType dtype, const string& portname, bool input)
873 boost::shared_ptr<Port> newport;
876 if (dtype == DataType::AUDIO) {
877 newport.reset (new AudioPort (portname, (input ? Port::IsInput : Port::IsOutput)));
878 } else if (dtype == DataType::MIDI) {
879 newport.reset (new MidiPort (portname, (input ? Port::IsInput : Port::IsOutput)));
881 throw PortRegistrationFailure("unable to create port (unknown type)");
884 RCUWriter<Ports> writer (ports);
885 boost::shared_ptr<Ports> ps = writer.get_copy ();
886 ps->insert (make_pair (make_port_name_relative (portname), newport));
888 /* writer goes out of scope, forces update */
893 catch (PortRegistrationFailure& err) {
895 } catch (std::exception& e) {
896 throw PortRegistrationFailure(string_compose(
897 _("unable to create port: %1"), e.what()).c_str());
899 throw PortRegistrationFailure("unable to create port (unknown error)");
903 boost::shared_ptr<Port>
904 AudioEngine::register_input_port (DataType type, const string& portname)
906 return register_port (type, portname, true);
909 boost::shared_ptr<Port>
910 AudioEngine::register_output_port (DataType type, const string& portname)
912 return register_port (type, portname, false);
916 AudioEngine::unregister_port (boost::shared_ptr<Port> port)
918 /* caller must hold process lock */
921 /* probably happening when the engine has been halted by JACK,
922 in which case, there is nothing we can do here.
928 RCUWriter<Ports> writer (ports);
929 boost::shared_ptr<Ports> ps = writer.get_copy ();
930 Ports::iterator x = ps->find (make_port_name_relative (port->name()));
932 if (x != ps->end()) {
936 /* writer goes out of scope, forces update */
945 AudioEngine::connect (const string& source, const string& destination)
951 fatal << _("connect called before engine was started") << endmsg;
958 string s = make_port_name_non_relative (source);
959 string d = make_port_name_non_relative (destination);
962 boost::shared_ptr<Port> src = get_port_by_name (s);
963 boost::shared_ptr<Port> dst = get_port_by_name (d);
966 ret = src->connect (d);
968 ret = dst->connect (s);
970 /* neither port is known to us, and this API isn't intended for use as a general patch bay */
975 /* already exists - no error, no warning */
976 } else if (ret < 0) {
977 error << string_compose(_("AudioEngine: cannot connect %1 (%2) to %3 (%4)"),
978 source, s, destination, d)
986 AudioEngine::disconnect (const string& source, const string& destination)
992 fatal << _("disconnect called before engine was started") << endmsg;
999 string s = make_port_name_non_relative (source);
1000 string d = make_port_name_non_relative (destination);
1002 boost::shared_ptr<Port> src = get_port_by_name (s);
1003 boost::shared_ptr<Port> dst = get_port_by_name (d);
1006 ret = src->disconnect (d);
1008 ret = dst->disconnect (s);
1010 /* neither port is known to us, and this API isn't intended for use as a general patch bay */
1017 AudioEngine::disconnect (boost::shared_ptr<Port> port)
1019 GET_PRIVATE_JACK_POINTER_RET (_jack,-1);
1023 fatal << _("disconnect called before engine was started") << endmsg;
1030 return port->disconnect_all ();
1034 AudioEngine::frame_rate () const
1036 GET_PRIVATE_JACK_POINTER_RET (_jack, 0);
1037 if (_frame_rate == 0) {
1038 return (_frame_rate = jack_get_sample_rate (_priv_jack));
1045 AudioEngine::raw_buffer_size (DataType t)
1047 std::map<DataType,size_t>::const_iterator s = _raw_buffer_sizes.find(t);
1048 return (s != _raw_buffer_sizes.end()) ? s->second : 0;
1052 AudioEngine::frames_per_cycle () const
1054 GET_PRIVATE_JACK_POINTER_RET (_jack,0);
1055 if (_buffer_size == 0) {
1056 return jack_get_buffer_size (_jack);
1058 return _buffer_size;
1062 /** @param name Full or short name of port
1063 * @return Corresponding Port or 0.
1066 boost::shared_ptr<Port>
1067 AudioEngine::get_port_by_name (const string& portname)
1071 fatal << _("get_port_by_name() called before engine was started") << endmsg;
1074 boost::shared_ptr<Port> ();
1078 if (!port_is_mine (portname)) {
1079 /* not an ardour port */
1080 return boost::shared_ptr<Port> ();
1083 boost::shared_ptr<Ports> pr = ports.reader();
1084 std::string rel = make_port_name_relative (portname);
1085 Ports::iterator x = pr->find (rel);
1087 if (x != pr->end()) {
1088 /* its possible that the port was renamed by some 3rd party and
1089 we don't know about it. check for this (the check is quick
1090 and cheap), and if so, rename the port (which will alter
1091 the port map as a side effect).
1093 const std::string check = make_port_name_relative (jack_port_name (x->second->jack_port()));
1095 x->second->set_name (check);
1100 return boost::shared_ptr<Port> ();
1104 AudioEngine::port_renamed (const std::string& old_relative_name, const std::string& new_relative_name)
1106 RCUWriter<Ports> writer (ports);
1107 boost::shared_ptr<Ports> p = writer.get_copy();
1108 Ports::iterator x = p->find (old_relative_name);
1110 if (x != p->end()) {
1111 boost::shared_ptr<Port> port = x->second;
1113 p->insert (make_pair (new_relative_name, port));
1118 AudioEngine::get_ports (const string& port_name_pattern, const string& type_name_pattern, uint32_t flags)
1120 GET_PRIVATE_JACK_POINTER_RET (_jack,0);
1123 fatal << _("get_ports called before engine was started") << endmsg;
1129 return jack_get_ports (_priv_jack, port_name_pattern.c_str(), type_name_pattern.c_str(), flags);
1133 AudioEngine::halted_info (jack_status_t code, const char* reason, void *arg)
1135 /* called from jack shutdown handler */
1137 AudioEngine* ae = static_cast<AudioEngine *> (arg);
1138 bool was_running = ae->_running;
1140 ae->stop_metering_thread ();
1142 ae->_running = false;
1143 ae->_buffer_size = 0;
1144 ae->_frame_rate = 0;
1148 #ifdef HAVE_JACK_ON_INFO_SHUTDOWN
1150 case JackBackendError:
1151 ae->Halted(reason); /* EMIT SIGNAL */
1154 ae->Halted(""); /* EMIT SIGNAL */
1157 ae->Halted(""); /* EMIT SIGNAL */
1163 AudioEngine::halted (void *arg)
1165 cerr << "HALTED by JACK\n";
1167 /* called from jack shutdown handler */
1169 AudioEngine* ae = static_cast<AudioEngine *> (arg);
1170 bool was_running = ae->_running;
1172 ae->stop_metering_thread ();
1174 ae->_running = false;
1175 ae->_buffer_size = 0;
1176 ae->_frame_rate = 0;
1180 ae->Halted(""); /* EMIT SIGNAL */
1181 MIDI::JackMIDIPort::JackHalted (); /* EMIT SIGNAL */
1186 AudioEngine::died ()
1188 /* called from a signal handler for SIGPIPE */
1190 stop_metering_thread ();
1199 AudioEngine::can_request_hardware_monitoring ()
1201 GET_PRIVATE_JACK_POINTER_RET (_jack,false);
1202 const char ** ports;
1204 if ((ports = jack_get_ports (_priv_jack, NULL, JACK_DEFAULT_AUDIO_TYPE, JackPortCanMonitor)) == 0) {
1214 AudioEngine::n_physical (unsigned long flags) const
1218 GET_PRIVATE_JACK_POINTER_RET (_jack, c);
1220 const char ** ports = jack_get_ports (_priv_jack, NULL, NULL, JackPortIsPhysical | flags);
1225 for (uint32_t i = 0; ports[i]; ++i) {
1226 if (!strstr (ports[i], "Midi-Through")) {
1227 DataType t (jack_port_type (jack_port_by_name (_jack, ports[i])));
1228 c.set (t, c.get (t) + 1);
1238 AudioEngine::n_physical_inputs () const
1240 return n_physical (JackPortIsInput);
1244 AudioEngine::n_physical_outputs () const
1246 return n_physical (JackPortIsOutput);
1250 AudioEngine::get_physical (DataType type, unsigned long flags, vector<string>& phy)
1252 GET_PRIVATE_JACK_POINTER (_jack);
1253 const char ** ports;
1255 if ((ports = jack_get_ports (_priv_jack, NULL, type.to_jack_type(), JackPortIsPhysical | flags)) == 0) {
1260 for (uint32_t i = 0; ports[i]; ++i) {
1261 if (strstr (ports[i], "Midi-Through")) {
1264 phy.push_back (ports[i]);
1270 /** Get physical ports for which JackPortIsOutput is set; ie those that correspond to
1271 * a physical input connector.
1274 AudioEngine::get_physical_inputs (DataType type, vector<string>& ins)
1276 get_physical (type, JackPortIsOutput, ins);
1279 /** Get physical ports for which JackPortIsInput is set; ie those that correspond to
1280 * a physical output connector.
1283 AudioEngine::get_physical_outputs (DataType type, vector<string>& outs)
1285 get_physical (type, JackPortIsInput, outs);
1289 AudioEngine::transport_stop ()
1291 GET_PRIVATE_JACK_POINTER (_jack);
1292 jack_transport_stop (_priv_jack);
1296 AudioEngine::transport_start ()
1298 GET_PRIVATE_JACK_POINTER (_jack);
1299 jack_transport_start (_priv_jack);
1303 AudioEngine::transport_locate (framepos_t where)
1305 GET_PRIVATE_JACK_POINTER (_jack);
1306 jack_transport_locate (_priv_jack, where);
1309 AudioEngine::TransportState
1310 AudioEngine::transport_state ()
1312 GET_PRIVATE_JACK_POINTER_RET (_jack, ((TransportState) JackTransportStopped));
1313 jack_position_t pos;
1314 return (TransportState) jack_transport_query (_priv_jack, &pos);
1318 AudioEngine::reset_timebase ()
1320 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
1322 if (_session->config.get_jack_time_master()) {
1323 return jack_set_timebase_callback (_priv_jack, 0, _jack_timebase_callback, this);
1325 return jack_release_timebase (_jack);
1332 AudioEngine::freewheel (bool onoff)
1334 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
1336 if (onoff != _freewheeling) {
1337 return jack_set_freewheel (_priv_jack, onoff);
1340 /* already doing what has been asked for */
1346 AudioEngine::remove_all_ports ()
1348 /* make sure that JACK callbacks that will be invoked as we cleanup
1349 * ports know that they have nothing to do.
1352 port_remove_in_progress = true;
1354 /* process lock MUST be held by caller
1358 RCUWriter<Ports> writer (ports);
1359 boost::shared_ptr<Ports> ps = writer.get_copy ();
1363 /* clear dead wood list in RCU */
1367 port_remove_in_progress = false;
1371 AudioEngine::connect_to_jack (string client_name, string session_uuid)
1373 EnvironmentalProtectionAgency* global_epa = EnvironmentalProtectionAgency::get_global_epa ();
1374 boost::scoped_ptr<EnvironmentalProtectionAgency> current_epa;
1375 jack_status_t status;
1377 /* revert all environment settings back to whatever they were when ardour started
1381 current_epa.reset (new EnvironmentalProtectionAgency(true)); /* will restore settings when we leave scope */
1382 global_epa->restore ();
1385 jack_client_name = client_name; /* might be reset below */
1386 #ifdef HAVE_JACK_SESSION
1387 if (! session_uuid.empty())
1388 _jack = jack_client_open (jack_client_name.c_str(), JackSessionID, &status, session_uuid.c_str());
1391 _jack = jack_client_open (jack_client_name.c_str(), JackNullOption, &status, 0);
1393 if (_jack == NULL) {
1394 // error message is not useful here
1398 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
1400 if (status & JackNameNotUnique) {
1401 jack_client_name = jack_get_client_name (_priv_jack);
1408 AudioEngine::disconnect_from_jack ()
1410 GET_PRIVATE_JACK_POINTER_RET (_jack, 0);
1413 stop_metering_thread ();
1417 Glib::Threads::Mutex::Lock lm (_process_lock);
1418 jack_client_close (_priv_jack);
1424 _raw_buffer_sizes.clear();
1428 Stopped(); /* EMIT SIGNAL */
1429 MIDI::JackMIDIPort::JackHalted (); /* EMIT SIGNAL */
1436 AudioEngine::reconnect_to_jack ()
1439 disconnect_from_jack ();
1440 /* XXX give jackd a chance */
1441 Glib::usleep (250000);
1444 if (connect_to_jack (jack_client_name, "")) {
1445 error << _("failed to connect to JACK") << endmsg;
1451 boost::shared_ptr<Ports> p = ports.reader ();
1453 for (i = p->begin(); i != p->end(); ++i) {
1454 if (i->second->reestablish ()) {
1459 if (i != p->end()) {
1461 remove_all_ports ();
1465 GET_PRIVATE_JACK_POINTER_RET (_jack,-1);
1467 MIDI::Manager::instance()->reestablish (_priv_jack);
1470 _session->reset_jack_connection (_priv_jack);
1471 jack_bufsize_callback (jack_get_buffer_size (_priv_jack));
1472 _session->set_frame_rate (jack_get_sample_rate (_priv_jack));
1475 last_monitor_check = 0;
1477 set_jack_callbacks ();
1479 if (jack_activate (_priv_jack) == 0) {
1486 /* re-establish connections */
1488 for (i = p->begin(); i != p->end(); ++i) {
1489 i->second->reconnect ();
1492 MIDI::Manager::instance()->reconnect ();
1496 Running (); /* EMIT SIGNAL*/
1498 start_metering_thread ();
1504 AudioEngine::request_buffer_size (pframes_t nframes)
1506 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
1508 if (nframes == jack_get_buffer_size (_priv_jack)) {
1512 return jack_set_buffer_size (_priv_jack, nframes);
1516 AudioEngine::make_port_name_relative (string portname) const
1518 string::size_type len;
1519 string::size_type n;
1521 len = portname.length();
1523 for (n = 0; n < len; ++n) {
1524 if (portname[n] == ':') {
1529 if ((n != len) && (portname.substr (0, n) == jack_client_name)) {
1530 return portname.substr (n+1);
1537 AudioEngine::make_port_name_non_relative (string portname) const
1541 if (portname.find_first_of (':') != string::npos) {
1545 str = jack_client_name;
1553 AudioEngine::port_is_mine (const string& portname) const
1555 if (portname.find_first_of (':') != string::npos) {
1556 if (portname.substr (0, jack_client_name.length ()) != jack_client_name) {
1564 AudioEngine::is_realtime () const
1566 GET_PRIVATE_JACK_POINTER_RET (_jack,false);
1567 return jack_is_realtime (_priv_jack);
1571 AudioEngine::create_process_thread (boost::function<void()> f, pthread_t* thread, size_t stacksize)
1573 GET_PRIVATE_JACK_POINTER_RET (_jack, 0);
1574 ThreadData* td = new ThreadData (this, f, stacksize);
1576 if (jack_client_create_thread (_priv_jack, thread, jack_client_real_time_priority (_priv_jack),
1577 jack_is_realtime (_priv_jack), _start_process_thread, td)) {
1585 AudioEngine::_start_process_thread (void* arg)
1587 ThreadData* td = reinterpret_cast<ThreadData*> (arg);
1588 boost::function<void()> f = td->f;
1597 AudioEngine::port_is_physical (const std::string& portname) const
1599 GET_PRIVATE_JACK_POINTER_RET(_jack, false);
1601 jack_port_t *port = jack_port_by_name (_priv_jack, portname.c_str());
1607 return jack_port_flags (port) & JackPortIsPhysical;
1611 AudioEngine::request_jack_monitors_input (const std::string& portname, bool yn) const
1613 GET_PRIVATE_JACK_POINTER(_jack);
1615 jack_port_t *port = jack_port_by_name (_priv_jack, portname.c_str());
1621 jack_port_request_monitor (port, yn);
1625 AudioEngine::update_latencies ()
1627 if (jack_recompute_total_latencies) {
1628 GET_PRIVATE_JACK_POINTER (_jack);
1629 jack_recompute_total_latencies (_priv_jack);
1634 AudioEngine::destroy ()
1641 AudioEngine::parameter_changed (const std::string& s)
1643 if (s == "ltc-source-port") {
1650 AudioEngine::reconnect_ltc ()
1654 string src = Config->get_ltc_source_port();
1656 _ltc_input->disconnect_all ();
1658 if (src != _("None") && !src.empty()) {
1659 _ltc_input->connect (src);