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 AudioEngine::~AudioEngine ()
96 config_connection.disconnect ();
99 Glib::Threads::Mutex::Lock tm (_process_lock);
100 session_removed.signal ();
103 jack_client_close (_jack);
107 stop_metering_thread ();
112 AudioEngine::jack() const
118 _thread_init_callback (void * /*arg*/)
120 /* make sure that anybody who needs to know about this thread
124 pthread_set_name (X_("audioengine"));
126 PBD::notify_gui_about_thread_creation ("gui", pthread_self(), X_("Audioengine"), 4096);
127 PBD::notify_gui_about_thread_creation ("midiui", pthread_self(), X_("Audioengine"), 128);
129 SessionEvent::create_per_thread_pool (X_("Audioengine"), 512);
131 MIDI::JackMIDIPort::set_process_thread (pthread_self());
135 ardour_jack_error (const char* msg)
137 error << "JACK: " << msg << endmsg;
141 AudioEngine::set_jack_callbacks ()
143 GET_PRIVATE_JACK_POINTER (_jack);
145 if (jack_on_info_shutdown) {
146 jack_on_info_shutdown (_priv_jack, halted_info, this);
148 jack_on_shutdown (_priv_jack, halted, this);
151 jack_set_thread_init_callback (_priv_jack, _thread_init_callback, this);
152 jack_set_process_thread (_priv_jack, _process_thread, this);
153 jack_set_sample_rate_callback (_priv_jack, _sample_rate_callback, this);
154 jack_set_buffer_size_callback (_priv_jack, _bufsize_callback, this);
155 jack_set_graph_order_callback (_priv_jack, _graph_order_callback, this);
156 jack_set_port_registration_callback (_priv_jack, _registration_callback, this);
157 jack_set_port_connect_callback (_priv_jack, _connect_callback, this);
158 jack_set_xrun_callback (_priv_jack, _xrun_callback, this);
159 jack_set_sync_callback (_priv_jack, _jack_sync_callback, this);
160 jack_set_freewheel_callback (_priv_jack, _freewheel_callback, this);
162 if (_session && _session->config.get_jack_time_master()) {
163 jack_set_timebase_callback (_priv_jack, 0, _jack_timebase_callback, this);
166 #ifdef HAVE_JACK_SESSION
167 if( jack_set_session_callback)
168 jack_set_session_callback (_priv_jack, _session_callback, this);
171 if (jack_set_latency_callback) {
172 jack_set_latency_callback (_priv_jack, _latency_callback, this);
175 jack_set_error_function (ardour_jack_error);
179 AudioEngine::start ()
181 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
185 if (!jack_port_type_get_buffer_size) {
186 warning << _("This version of JACK is old - you should upgrade to a newer version that supports jack_port_type_get_buffer_size()") << endmsg;
190 BootMessage (_("Connect session to engine"));
191 _session->set_frame_rate (jack_get_sample_rate (_priv_jack));
194 /* a proxy for whether jack_activate() will definitely call the buffer size
195 * callback. with older versions of JACK, this function symbol will be null.
196 * this is reliable, but not clean.
199 if (!jack_port_type_get_buffer_size) {
200 jack_bufsize_callback (jack_get_buffer_size (_priv_jack));
203 _processed_frames = 0;
204 last_monitor_check = 0;
206 set_jack_callbacks ();
208 if (jack_activate (_priv_jack) == 0) {
211 Running(); /* EMIT SIGNAL */
213 // error << _("cannot activate JACK client") << endmsg;
217 return _running ? 0 : -1;
221 AudioEngine::stop (bool forever)
223 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
227 disconnect_from_jack ();
229 jack_deactivate (_priv_jack);
230 MIDI::JackMIDIPort::JackHalted (); /* EMIT SIGNAL */
231 Stopped(); /* EMIT SIGNAL */
236 stop_metering_thread ();
239 return _running ? -1 : 0;
244 AudioEngine::get_sync_offset (pframes_t& offset) const
247 #ifdef HAVE_JACK_VIDEO_SUPPORT
249 GET_PRIVATE_JACK_POINTER_RET (_jack, false);
254 (void) jack_transport_query (_priv_jack, &pos);
256 if (pos.valid & JackVideoFrameOffset) {
257 offset = pos.video_offset;
270 AudioEngine::_jack_timebase_callback (jack_transport_state_t state, pframes_t nframes,
271 jack_position_t* pos, int new_position, void *arg)
273 static_cast<AudioEngine*> (arg)->jack_timebase_callback (state, nframes, pos, new_position);
277 AudioEngine::jack_timebase_callback (jack_transport_state_t state, pframes_t nframes,
278 jack_position_t* pos, int new_position)
280 if (_jack && _session && _session->synced_to_jack()) {
281 _session->jack_timebase_callback (state, nframes, pos, new_position);
286 AudioEngine::_jack_sync_callback (jack_transport_state_t state, jack_position_t* pos, void* arg)
288 return static_cast<AudioEngine*> (arg)->jack_sync_callback (state, pos);
292 AudioEngine::jack_sync_callback (jack_transport_state_t state, jack_position_t* pos)
294 if (_jack && _session) {
295 return _session->jack_sync_callback (state, pos);
302 AudioEngine::_xrun_callback (void *arg)
304 AudioEngine* ae = static_cast<AudioEngine*> (arg);
305 if (ae->connected()) {
306 ae->Xrun (); /* EMIT SIGNAL */
311 #ifdef HAVE_JACK_SESSION
313 AudioEngine::_session_callback (jack_session_event_t *event, void *arg)
315 AudioEngine* ae = static_cast<AudioEngine*> (arg);
316 if (ae->connected()) {
317 ae->JackSessionEvent ( event ); /* EMIT SIGNAL */
323 AudioEngine::_graph_order_callback (void *arg)
325 AudioEngine* ae = static_cast<AudioEngine*> (arg);
327 if (ae->connected() && !ae->port_remove_in_progress) {
328 ae->GraphReordered (); /* EMIT SIGNAL */
335 AudioEngine::_process_thread (void *arg)
337 return static_cast<AudioEngine *> (arg)->process_thread ();
341 AudioEngine::_freewheel_callback (int onoff, void *arg)
343 static_cast<AudioEngine*>(arg)->freewheel_callback (onoff);
347 AudioEngine::freewheel_callback (int onoff)
349 _freewheeling = onoff;
352 _pre_freewheel_mmc_enabled = MIDI::Manager::instance()->mmc()->send_enabled ();
353 MIDI::Manager::instance()->mmc()->enable_send (false);
355 MIDI::Manager::instance()->mmc()->enable_send (_pre_freewheel_mmc_enabled);
360 AudioEngine::_registration_callback (jack_port_id_t /*id*/, int /*reg*/, void* arg)
362 AudioEngine* ae = static_cast<AudioEngine*> (arg);
364 if (!ae->port_remove_in_progress) {
365 ae->PortRegisteredOrUnregistered (); /* EMIT SIGNAL */
370 AudioEngine::_latency_callback (jack_latency_callback_mode_t mode, void* arg)
372 return static_cast<AudioEngine *> (arg)->jack_latency_callback (mode);
376 AudioEngine::_connect_callback (jack_port_id_t id_a, jack_port_id_t id_b, int conn, void* arg)
378 AudioEngine* ae = static_cast<AudioEngine*> (arg);
379 ae->connect_callback (id_a, id_b, conn);
383 AudioEngine::connect_callback (jack_port_id_t id_a, jack_port_id_t id_b, int conn)
385 if (port_remove_in_progress) {
389 GET_PRIVATE_JACK_POINTER (_jack);
391 jack_port_t* jack_port_a = jack_port_by_id (_priv_jack, id_a);
392 jack_port_t* jack_port_b = jack_port_by_id (_priv_jack, id_b);
394 boost::shared_ptr<Port> port_a;
395 boost::shared_ptr<Port> port_b;
397 boost::shared_ptr<Ports> pr = ports.reader ();
400 x = pr->find (make_port_name_relative (jack_port_name (jack_port_a)));
401 if (x != pr->end()) {
405 x = pr->find (make_port_name_relative (jack_port_name (jack_port_b)));
406 if (x != pr->end()) {
410 PortConnectedOrDisconnected (
411 port_a, jack_port_name (jack_port_a),
412 port_b, jack_port_name (jack_port_b),
413 conn == 0 ? false : true
418 AudioEngine::split_cycle (pframes_t offset)
420 /* caller must hold process lock */
422 Port::increment_global_port_buffer_offset (offset);
424 /* tell all Ports that we're going to start a new (split) cycle */
426 boost::shared_ptr<Ports> p = ports.reader();
428 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
429 i->second->cycle_split ();
434 AudioEngine::process_thread ()
436 /* JACK doesn't do this for us when we use the wait API
439 _thread_init_callback (0);
441 _main_thread = new ProcessThread;
444 GET_PRIVATE_JACK_POINTER_RET(_jack,0);
446 pframes_t nframes = jack_cycle_wait (_priv_jack);
448 if (process_callback (nframes)) {
452 jack_cycle_signal (_priv_jack, 0);
458 /** Method called by our ::process_thread when there is work to be done.
459 * @param nframes Number of frames to process.
462 AudioEngine::process_callback (pframes_t nframes)
464 GET_PRIVATE_JACK_POINTER_RET(_jack,0);
465 Glib::Threads::Mutex::Lock tm (_process_lock, Glib::Threads::TRY_LOCK);
470 /// The number of frames that will have been processed when we've finished
471 pframes_t next_processed_frames;
473 /* handle wrap around of total frames counter */
475 if (max_framepos - _processed_frames < nframes) {
476 next_processed_frames = nframes - (max_framepos - _processed_frames);
478 next_processed_frames = _processed_frames + nframes;
482 /* return having done nothing */
483 _processed_frames = next_processed_frames;
487 if (session_remove_pending) {
489 /* perform the actual session removal */
491 if (session_removal_countdown < 0) {
493 /* fade out over 1 second */
494 session_removal_countdown = _frame_rate/2;
495 session_removal_gain = 1.0;
496 session_removal_gain_step = 1.0/session_removal_countdown;
498 } else if (session_removal_countdown > 0) {
500 /* we'll be fading audio out.
502 if this is the last time we do this as part
503 of session removal, do a MIDI panic now
504 to get MIDI stopped. This relies on the fact
505 that "immediate data" (aka "out of band data") from
506 MIDI tracks is *appended* after any other data,
507 so that it emerges after any outbound note ons, etc.
510 if (session_removal_countdown <= nframes) {
511 _session->midi_panic ();
517 session_removal_countdown = -1; // reset to "not in progress"
518 session_remove_pending = false;
519 session_removed.signal(); // wakes up thread that initiated session removal
525 if (!_freewheeling) {
526 MIDI::Manager::instance()->cycle_start(nframes);
527 MIDI::Manager::instance()->cycle_end();
530 _processed_frames = next_processed_frames;
535 /* tell all relevant objects that we're starting a new cycle */
537 InternalSend::CycleStart (nframes);
538 Port::set_global_port_buffer_offset (0);
539 Port::set_cycle_framecnt (nframes);
541 /* tell all Ports that we're starting a new cycle */
543 boost::shared_ptr<Ports> p = ports.reader();
545 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
546 i->second->cycle_start (nframes);
549 /* test if we are freewheeling and there are freewheel signals connected.
550 ardour should act normally even when freewheeling unless /it/ is exporting */
553 if (_freewheeling && !Freewheel.empty()) {
554 /* emit the Freewheel signal and stop freewheeling in the event of trouble
556 boost::optional<int> r = Freewheel (nframes);
557 if (r.get_value_or (0)) {
558 jack_set_freewheel (_priv_jack, false);
562 MIDI::Manager::instance()->cycle_start(nframes);
565 _session->process (nframes);
568 MIDI::Manager::instance()->cycle_end();
576 _processed_frames = next_processed_frames;
580 if (last_monitor_check + monitor_check_interval < next_processed_frames) {
582 boost::shared_ptr<Ports> p = ports.reader();
584 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
588 if (i->second->last_monitor() != (x = i->second->jack_monitoring_input ())) {
589 i->second->set_last_monitor (x);
590 /* XXX I think this is dangerous, due to
591 a likely mutex in the signal handlers ...
593 i->second->MonitorInputChanged (x); /* EMIT SIGNAL */
596 last_monitor_check = next_processed_frames;
599 if (_session->silent()) {
601 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
603 if (i->second->sends_output()) {
604 i->second->get_buffer(nframes).silence(nframes);
609 if (session_remove_pending && session_removal_countdown) {
611 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
613 if (i->second->sends_output()) {
615 boost::shared_ptr<AudioPort> ap = boost::dynamic_pointer_cast<AudioPort> (i->second);
617 Sample* s = ap->engine_get_whole_audio_buffer ();
618 gain_t g = session_removal_gain;
620 for (pframes_t n = 0; n < nframes; ++n) {
622 g -= session_removal_gain_step;
628 if (session_removal_countdown > nframes) {
629 session_removal_countdown -= nframes;
631 session_removal_countdown = 0;
634 session_removal_gain -= (nframes * session_removal_gain_step);
639 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
640 i->second->cycle_end (nframes);
643 _processed_frames = next_processed_frames;
651 AudioEngine::_sample_rate_callback (pframes_t nframes, void *arg)
653 return static_cast<AudioEngine *> (arg)->jack_sample_rate_callback (nframes);
657 AudioEngine::jack_sample_rate_callback (pframes_t nframes)
659 _frame_rate = nframes;
660 _usecs_per_cycle = (int) floor ((((double) frames_per_cycle() / nframes)) * 1000000.0);
662 /* check for monitor input change every 1/10th of second */
664 monitor_check_interval = nframes / 10;
665 last_monitor_check = 0;
668 _session->set_frame_rate (nframes);
671 SampleRateChanged (nframes); /* EMIT SIGNAL */
677 AudioEngine::jack_latency_callback (jack_latency_callback_mode_t mode)
680 _session->update_latency (mode == JackPlaybackLatency);
685 AudioEngine::_bufsize_callback (pframes_t nframes, void *arg)
687 return static_cast<AudioEngine *> (arg)->jack_bufsize_callback (nframes);
691 AudioEngine::jack_bufsize_callback (pframes_t nframes)
693 /* if the size has not changed, this should be a no-op */
695 if (nframes == _buffer_size) {
699 GET_PRIVATE_JACK_POINTER_RET (_jack, 1);
701 _buffer_size = nframes;
702 _usecs_per_cycle = (int) floor ((((double) nframes / frame_rate())) * 1000000.0);
703 last_monitor_check = 0;
705 if (jack_port_type_get_buffer_size) {
706 _raw_buffer_sizes[DataType::AUDIO] = jack_port_type_get_buffer_size (_priv_jack, JACK_DEFAULT_AUDIO_TYPE);
707 _raw_buffer_sizes[DataType::MIDI] = jack_port_type_get_buffer_size (_priv_jack, JACK_DEFAULT_MIDI_TYPE);
710 /* Old version of JACK.
712 These crude guesses, see below where we try to get the right answers.
714 Note that our guess for MIDI deliberatey tries to overestimate
715 by a little. It would be nicer if we could get the actual
716 size from a port, but we have to use this estimate in the
717 event that there are no MIDI ports currently. If there are
718 the value will be adjusted below.
721 _raw_buffer_sizes[DataType::AUDIO] = nframes * sizeof (Sample);
722 _raw_buffer_sizes[DataType::MIDI] = nframes * 4 - (nframes/2);
726 Glib::Threads::Mutex::Lock lm (_process_lock);
728 boost::shared_ptr<Ports> p = ports.reader();
730 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
736 _session->set_block_size (_buffer_size);
743 AudioEngine::stop_metering_thread ()
745 if (m_meter_thread) {
746 g_atomic_int_set (&m_meter_exit, 1);
747 m_meter_thread->join ();
753 AudioEngine::start_metering_thread ()
755 if (m_meter_thread == 0) {
756 g_atomic_int_set (&m_meter_exit, 0);
757 m_meter_thread = Glib::Threads::Thread::create (boost::bind (&AudioEngine::meter_thread, this));
762 AudioEngine::meter_thread ()
764 pthread_set_name (X_("meter"));
767 Glib::usleep (10000); /* 1/100th sec interval */
768 if (g_atomic_int_get(&m_meter_exit)) {
776 AudioEngine::set_session (Session *s)
778 Glib::Threads::Mutex::Lock pl (_process_lock);
780 SessionHandlePtr::set_session (s);
784 start_metering_thread ();
786 pframes_t blocksize = jack_get_buffer_size (_jack);
788 /* page in as much of the session process code as we
789 can before we really start running.
792 boost::shared_ptr<Ports> p = ports.reader();
794 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
795 i->second->cycle_start (blocksize);
798 _session->process (blocksize);
799 _session->process (blocksize);
800 _session->process (blocksize);
801 _session->process (blocksize);
802 _session->process (blocksize);
803 _session->process (blocksize);
804 _session->process (blocksize);
805 _session->process (blocksize);
807 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
808 i->second->cycle_end (blocksize);
814 AudioEngine::remove_session ()
816 Glib::Threads::Mutex::Lock lm (_process_lock);
820 stop_metering_thread ();
823 session_remove_pending = true;
824 session_removed.wait(_process_lock);
828 SessionHandlePtr::set_session (0);
835 AudioEngine::port_registration_failure (const std::string& portname)
837 GET_PRIVATE_JACK_POINTER (_jack);
838 string full_portname = jack_client_name;
839 full_portname += ':';
840 full_portname += portname;
843 jack_port_t* p = jack_port_by_name (_priv_jack, full_portname.c_str());
847 reason = string_compose (_("a port with the name \"%1\" already exists: check for duplicated track/bus names"), portname);
849 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);
852 throw PortRegistrationFailure (string_compose (_("AudioEngine: cannot register port \"%1\": %2"), portname, reason).c_str());
855 boost::shared_ptr<Port>
856 AudioEngine::register_port (DataType dtype, const string& portname, bool input)
858 boost::shared_ptr<Port> newport;
861 if (dtype == DataType::AUDIO) {
862 newport.reset (new AudioPort (portname, (input ? Port::IsInput : Port::IsOutput)));
863 } else if (dtype == DataType::MIDI) {
864 newport.reset (new MidiPort (portname, (input ? Port::IsInput : Port::IsOutput)));
866 throw PortRegistrationFailure("unable to create port (unknown type)");
869 RCUWriter<Ports> writer (ports);
870 boost::shared_ptr<Ports> ps = writer.get_copy ();
871 ps->insert (make_pair (make_port_name_relative (portname), newport));
873 /* writer goes out of scope, forces update */
878 catch (PortRegistrationFailure& err) {
880 } catch (std::exception& e) {
881 throw PortRegistrationFailure(string_compose(
882 _("unable to create port: %1"), e.what()).c_str());
884 throw PortRegistrationFailure("unable to create port (unknown error)");
888 boost::shared_ptr<Port>
889 AudioEngine::register_input_port (DataType type, const string& portname)
891 return register_port (type, portname, true);
894 boost::shared_ptr<Port>
895 AudioEngine::register_output_port (DataType type, const string& portname)
897 return register_port (type, portname, false);
901 AudioEngine::unregister_port (boost::shared_ptr<Port> port)
903 /* caller must hold process lock */
906 /* probably happening when the engine has been halted by JACK,
907 in which case, there is nothing we can do here.
913 RCUWriter<Ports> writer (ports);
914 boost::shared_ptr<Ports> ps = writer.get_copy ();
915 Ports::iterator x = ps->find (make_port_name_relative (port->name()));
917 if (x != ps->end()) {
921 /* writer goes out of scope, forces update */
930 AudioEngine::connect (const string& source, const string& destination)
936 fatal << _("connect called before engine was started") << endmsg;
943 string s = make_port_name_non_relative (source);
944 string d = make_port_name_non_relative (destination);
947 boost::shared_ptr<Port> src = get_port_by_name (s);
948 boost::shared_ptr<Port> dst = get_port_by_name (d);
951 ret = src->connect (d);
953 ret = dst->connect (s);
955 /* neither port is known to us, and this API isn't intended for use as a general patch bay */
960 /* already exists - no error, no warning */
961 } else if (ret < 0) {
962 error << string_compose(_("AudioEngine: cannot connect %1 (%2) to %3 (%4)"),
963 source, s, destination, d)
971 AudioEngine::disconnect (const string& source, const string& destination)
977 fatal << _("disconnect called before engine was started") << endmsg;
984 string s = make_port_name_non_relative (source);
985 string d = make_port_name_non_relative (destination);
987 boost::shared_ptr<Port> src = get_port_by_name (s);
988 boost::shared_ptr<Port> dst = get_port_by_name (d);
991 ret = src->disconnect (d);
993 ret = dst->disconnect (s);
995 /* neither port is known to us, and this API isn't intended for use as a general patch bay */
1002 AudioEngine::disconnect (boost::shared_ptr<Port> port)
1004 GET_PRIVATE_JACK_POINTER_RET (_jack,-1);
1008 fatal << _("disconnect called before engine was started") << endmsg;
1015 return port->disconnect_all ();
1019 AudioEngine::frame_rate () const
1021 GET_PRIVATE_JACK_POINTER_RET (_jack, 0);
1022 if (_frame_rate == 0) {
1023 return (_frame_rate = jack_get_sample_rate (_priv_jack));
1030 AudioEngine::raw_buffer_size (DataType t)
1032 std::map<DataType,size_t>::const_iterator s = _raw_buffer_sizes.find(t);
1033 return (s != _raw_buffer_sizes.end()) ? s->second : 0;
1037 AudioEngine::frames_per_cycle () const
1039 GET_PRIVATE_JACK_POINTER_RET (_jack,0);
1040 if (_buffer_size == 0) {
1041 return jack_get_buffer_size (_jack);
1043 return _buffer_size;
1047 /** @param name Full or short name of port
1048 * @return Corresponding Port or 0.
1051 boost::shared_ptr<Port>
1052 AudioEngine::get_port_by_name (const string& portname)
1056 fatal << _("get_port_by_name() called before engine was started") << endmsg;
1059 boost::shared_ptr<Port> ();
1063 if (!port_is_mine (portname)) {
1064 /* not an ardour port */
1065 return boost::shared_ptr<Port> ();
1068 boost::shared_ptr<Ports> pr = ports.reader();
1069 std::string rel = make_port_name_relative (portname);
1070 Ports::iterator x = pr->find (rel);
1072 if (x != pr->end()) {
1073 /* its possible that the port was renamed by some 3rd party and
1074 we don't know about it. check for this (the check is quick
1075 and cheap), and if so, rename the port (which will alter
1076 the port map as a side effect).
1078 const std::string check = make_port_name_relative (jack_port_name (x->second->jack_port()));
1080 x->second->set_name (check);
1085 return boost::shared_ptr<Port> ();
1089 AudioEngine::port_renamed (const std::string& old_relative_name, const std::string& new_relative_name)
1091 RCUWriter<Ports> writer (ports);
1092 boost::shared_ptr<Ports> p = writer.get_copy();
1093 Ports::iterator x = p->find (old_relative_name);
1095 if (x != p->end()) {
1096 boost::shared_ptr<Port> port = x->second;
1098 p->insert (make_pair (new_relative_name, port));
1103 AudioEngine::get_ports (const string& port_name_pattern, const string& type_name_pattern, uint32_t flags)
1105 GET_PRIVATE_JACK_POINTER_RET (_jack,0);
1108 fatal << _("get_ports called before engine was started") << endmsg;
1114 return jack_get_ports (_priv_jack, port_name_pattern.c_str(), type_name_pattern.c_str(), flags);
1118 AudioEngine::halted_info (jack_status_t code, const char* reason, void *arg)
1120 /* called from jack shutdown handler */
1122 AudioEngine* ae = static_cast<AudioEngine *> (arg);
1123 bool was_running = ae->_running;
1125 ae->stop_metering_thread ();
1127 ae->_running = false;
1128 ae->_buffer_size = 0;
1129 ae->_frame_rate = 0;
1133 #ifdef HAVE_JACK_ON_INFO_SHUTDOWN
1135 case JackBackendError:
1136 ae->Halted(reason); /* EMIT SIGNAL */
1139 ae->Halted(""); /* EMIT SIGNAL */
1142 ae->Halted(""); /* EMIT SIGNAL */
1148 AudioEngine::halted (void *arg)
1150 cerr << "HALTED by JACK\n";
1152 /* called from jack shutdown handler */
1154 AudioEngine* ae = static_cast<AudioEngine *> (arg);
1155 bool was_running = ae->_running;
1157 ae->stop_metering_thread ();
1159 ae->_running = false;
1160 ae->_buffer_size = 0;
1161 ae->_frame_rate = 0;
1165 MIDI::JackMIDIPort::JackHalted (); /* EMIT SIGNAL */
1166 ae->Halted(""); /* EMIT SIGNAL */
1171 AudioEngine::died ()
1173 /* called from a signal handler for SIGPIPE */
1175 stop_metering_thread ();
1184 AudioEngine::can_request_hardware_monitoring ()
1186 GET_PRIVATE_JACK_POINTER_RET (_jack,false);
1187 const char ** ports;
1189 if ((ports = jack_get_ports (_priv_jack, NULL, JACK_DEFAULT_AUDIO_TYPE, JackPortCanMonitor)) == 0) {
1199 AudioEngine::n_physical (unsigned long flags) const
1203 GET_PRIVATE_JACK_POINTER_RET (_jack, c);
1205 const char ** ports = jack_get_ports (_priv_jack, NULL, NULL, JackPortIsPhysical | flags);
1210 for (uint32_t i = 0; ports[i]; ++i) {
1211 if (!strstr (ports[i], "Midi-Through")) {
1212 DataType t (jack_port_type (jack_port_by_name (_jack, ports[i])));
1213 c.set (t, c.get (t) + 1);
1223 AudioEngine::n_physical_inputs () const
1225 return n_physical (JackPortIsInput);
1229 AudioEngine::n_physical_outputs () const
1231 return n_physical (JackPortIsOutput);
1235 AudioEngine::get_physical (DataType type, unsigned long flags, vector<string>& phy)
1237 GET_PRIVATE_JACK_POINTER (_jack);
1238 const char ** ports;
1240 if ((ports = jack_get_ports (_priv_jack, NULL, type.to_jack_type(), JackPortIsPhysical | flags)) == 0) {
1245 for (uint32_t i = 0; ports[i]; ++i) {
1246 if (strstr (ports[i], "Midi-Through")) {
1249 phy.push_back (ports[i]);
1255 /** Get physical ports for which JackPortIsOutput is set; ie those that correspond to
1256 * a physical input connector.
1259 AudioEngine::get_physical_inputs (DataType type, vector<string>& ins)
1261 get_physical (type, JackPortIsOutput, ins);
1264 /** Get physical ports for which JackPortIsInput is set; ie those that correspond to
1265 * a physical output connector.
1268 AudioEngine::get_physical_outputs (DataType type, vector<string>& outs)
1270 get_physical (type, JackPortIsInput, outs);
1274 AudioEngine::transport_stop ()
1276 GET_PRIVATE_JACK_POINTER (_jack);
1277 jack_transport_stop (_priv_jack);
1281 AudioEngine::transport_start ()
1283 GET_PRIVATE_JACK_POINTER (_jack);
1284 jack_transport_start (_priv_jack);
1288 AudioEngine::transport_locate (framepos_t where)
1290 GET_PRIVATE_JACK_POINTER (_jack);
1291 jack_transport_locate (_priv_jack, where);
1294 AudioEngine::TransportState
1295 AudioEngine::transport_state ()
1297 GET_PRIVATE_JACK_POINTER_RET (_jack, ((TransportState) JackTransportStopped));
1298 jack_position_t pos;
1299 return (TransportState) jack_transport_query (_priv_jack, &pos);
1303 AudioEngine::reset_timebase ()
1305 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
1307 if (_session->config.get_jack_time_master()) {
1308 return jack_set_timebase_callback (_priv_jack, 0, _jack_timebase_callback, this);
1310 return jack_release_timebase (_jack);
1317 AudioEngine::freewheel (bool onoff)
1319 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
1321 if (onoff != _freewheeling) {
1322 return jack_set_freewheel (_priv_jack, onoff);
1325 /* already doing what has been asked for */
1331 AudioEngine::remove_all_ports ()
1333 /* make sure that JACK callbacks that will be invoked as we cleanup
1334 * ports know that they have nothing to do.
1337 port_remove_in_progress = true;
1339 /* process lock MUST be held by caller
1343 RCUWriter<Ports> writer (ports);
1344 boost::shared_ptr<Ports> ps = writer.get_copy ();
1348 /* clear dead wood list in RCU */
1352 port_remove_in_progress = false;
1356 AudioEngine::connect_to_jack (string client_name, string session_uuid)
1358 EnvironmentalProtectionAgency* global_epa = EnvironmentalProtectionAgency::get_global_epa ();
1359 boost::scoped_ptr<EnvironmentalProtectionAgency> current_epa;
1360 jack_status_t status;
1362 /* revert all environment settings back to whatever they were when ardour started
1366 current_epa.reset (new EnvironmentalProtectionAgency(true)); /* will restore settings when we leave scope */
1367 global_epa->restore ();
1370 jack_client_name = client_name; /* might be reset below */
1371 #ifdef HAVE_JACK_SESSION
1372 if (! session_uuid.empty())
1373 _jack = jack_client_open (jack_client_name.c_str(), JackSessionID, &status, session_uuid.c_str());
1376 _jack = jack_client_open (jack_client_name.c_str(), JackNullOption, &status, 0);
1378 if (_jack == NULL) {
1379 // error message is not useful here
1383 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
1385 if (status & JackNameNotUnique) {
1386 jack_client_name = jack_get_client_name (_priv_jack);
1393 AudioEngine::disconnect_from_jack ()
1395 GET_PRIVATE_JACK_POINTER_RET (_jack, 0);
1398 stop_metering_thread ();
1402 Glib::Threads::Mutex::Lock lm (_process_lock);
1403 jack_client_close (_priv_jack);
1409 _raw_buffer_sizes.clear();
1413 MIDI::JackMIDIPort::JackHalted (); /* EMIT SIGNAL */
1414 Stopped(); /* EMIT SIGNAL */
1421 AudioEngine::reconnect_to_jack ()
1424 disconnect_from_jack ();
1425 /* XXX give jackd a chance */
1426 Glib::usleep (250000);
1429 if (connect_to_jack (jack_client_name, "")) {
1430 error << _("failed to connect to JACK") << endmsg;
1436 boost::shared_ptr<Ports> p = ports.reader ();
1438 for (i = p->begin(); i != p->end(); ++i) {
1439 if (i->second->reestablish ()) {
1444 if (i != p->end()) {
1446 remove_all_ports ();
1450 GET_PRIVATE_JACK_POINTER_RET (_jack,-1);
1452 MIDI::Manager::instance()->reestablish (_priv_jack);
1455 _session->reset_jack_connection (_priv_jack);
1456 jack_bufsize_callback (jack_get_buffer_size (_priv_jack));
1457 _session->set_frame_rate (jack_get_sample_rate (_priv_jack));
1460 last_monitor_check = 0;
1462 set_jack_callbacks ();
1464 if (jack_activate (_priv_jack) == 0) {
1471 /* re-establish connections */
1473 for (i = p->begin(); i != p->end(); ++i) {
1474 i->second->reconnect ();
1477 MIDI::Manager::instance()->reconnect ();
1479 Running (); /* EMIT SIGNAL*/
1481 start_metering_thread ();
1487 AudioEngine::request_buffer_size (pframes_t nframes)
1489 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
1491 if (nframes == jack_get_buffer_size (_priv_jack)) {
1495 return jack_set_buffer_size (_priv_jack, nframes);
1499 AudioEngine::make_port_name_relative (string portname) const
1501 string::size_type len;
1502 string::size_type n;
1504 len = portname.length();
1506 for (n = 0; n < len; ++n) {
1507 if (portname[n] == ':') {
1512 if ((n != len) && (portname.substr (0, n) == jack_client_name)) {
1513 return portname.substr (n+1);
1520 AudioEngine::make_port_name_non_relative (string portname) const
1524 if (portname.find_first_of (':') != string::npos) {
1528 str = jack_client_name;
1536 AudioEngine::port_is_mine (const string& portname) const
1538 if (portname.find_first_of (':') != string::npos) {
1539 if (portname.substr (0, jack_client_name.length ()) != jack_client_name) {
1547 AudioEngine::is_realtime () const
1549 GET_PRIVATE_JACK_POINTER_RET (_jack,false);
1550 return jack_is_realtime (_priv_jack);
1554 AudioEngine::create_process_thread (boost::function<void()> f, pthread_t* thread, size_t stacksize)
1556 GET_PRIVATE_JACK_POINTER_RET (_jack, 0);
1557 ThreadData* td = new ThreadData (this, f, stacksize);
1559 if (jack_client_create_thread (_priv_jack, thread, jack_client_real_time_priority (_priv_jack),
1560 jack_is_realtime (_priv_jack), _start_process_thread, td)) {
1568 AudioEngine::_start_process_thread (void* arg)
1570 ThreadData* td = reinterpret_cast<ThreadData*> (arg);
1571 boost::function<void()> f = td->f;
1580 AudioEngine::port_is_physical (const std::string& portname) const
1582 GET_PRIVATE_JACK_POINTER_RET(_jack, false);
1584 jack_port_t *port = jack_port_by_name (_priv_jack, portname.c_str());
1590 return jack_port_flags (port) & JackPortIsPhysical;
1594 AudioEngine::request_jack_monitors_input (const std::string& portname, bool yn) const
1596 GET_PRIVATE_JACK_POINTER(_jack);
1598 jack_port_t *port = jack_port_by_name (_priv_jack, portname.c_str());
1604 jack_port_request_monitor (port, yn);
1608 AudioEngine::update_latencies ()
1610 if (jack_recompute_total_latencies) {
1611 GET_PRIVATE_JACK_POINTER (_jack);
1612 jack_recompute_total_latencies (_priv_jack);
1617 AudioEngine::destroy ()