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++/mmc.h"
38 #include "midi++/manager.h"
40 #include "ardour/amp.h"
41 #include "ardour/audio_port.h"
42 #include "ardour/audioengine.h"
43 #include "ardour/buffer.h"
44 #include "ardour/buffer_set.h"
45 #include "ardour/cycle_timer.h"
46 #include "ardour/delivery.h"
47 #include "ardour/event_type_map.h"
48 #include "ardour/internal_return.h"
49 #include "ardour/io.h"
50 #include "ardour/meter.h"
51 #include "ardour/midi_port.h"
52 #include "ardour/process_thread.h"
53 #include "ardour/port.h"
54 #include "ardour/port_set.h"
55 #include "ardour/session.h"
56 #include "ardour/timestamps.h"
57 #include "ardour/utils.h"
62 using namespace ARDOUR;
65 gint AudioEngine::m_meter_exit;
66 AudioEngine* AudioEngine::_instance = 0;
68 #define GET_PRIVATE_JACK_POINTER(j) jack_client_t* _priv_jack = (jack_client_t*) (j); if (!_priv_jack) { return; }
69 #define GET_PRIVATE_JACK_POINTER_RET(j,r) jack_client_t* _priv_jack = (jack_client_t*) (j); if (!_priv_jack) { return r; }
71 AudioEngine::AudioEngine (string client_name, string session_uuid)
74 _instance = this; /* singleton */
76 session_remove_pending = false;
79 last_monitor_check = 0;
80 monitor_check_interval = INT32_MAX;
81 _processed_frames = 0;
86 _freewheeling = false;
88 port_remove_in_progress = false;
91 g_atomic_int_set (&m_meter_exit, 0);
93 if (connect_to_jack (client_name, session_uuid)) {
95 throw NoBackendAvailable ();
98 Port::set_engine (this);
101 AudioEngine::~AudioEngine ()
104 Glib::Mutex::Lock tm (_process_lock);
105 session_removed.signal ();
108 jack_client_close (_jack);
112 stop_metering_thread ();
117 AudioEngine::jack() const
123 _thread_init_callback (void * /*arg*/)
125 /* make sure that anybody who needs to know about this thread
129 pthread_set_name (X_("audioengine"));
131 PBD::notify_gui_about_thread_creation ("gui", pthread_self(), X_("Audioengine"), 4096);
132 PBD::notify_gui_about_thread_creation ("midiui", pthread_self(), X_("Audioengine"), 128);
134 SessionEvent::create_per_thread_pool (X_("Audioengine"), 512);
136 MIDI::Port::set_process_thread (pthread_self());
140 ardour_jack_error (const char* msg)
142 error << "JACK: " << msg << endmsg;
146 AudioEngine::set_jack_callbacks ()
148 GET_PRIVATE_JACK_POINTER (_jack);
150 if (jack_on_info_shutdown) {
151 jack_on_info_shutdown (_priv_jack, halted_info, this);
153 jack_on_shutdown (_priv_jack, halted, this);
156 jack_set_thread_init_callback (_priv_jack, _thread_init_callback, this);
157 jack_set_process_thread (_priv_jack, _process_thread, this);
158 jack_set_sample_rate_callback (_priv_jack, _sample_rate_callback, this);
159 jack_set_buffer_size_callback (_priv_jack, _bufsize_callback, this);
160 jack_set_graph_order_callback (_priv_jack, _graph_order_callback, this);
161 jack_set_port_registration_callback (_priv_jack, _registration_callback, this);
162 jack_set_port_connect_callback (_priv_jack, _connect_callback, this);
163 jack_set_xrun_callback (_priv_jack, _xrun_callback, this);
164 jack_set_sync_callback (_priv_jack, _jack_sync_callback, this);
165 jack_set_freewheel_callback (_priv_jack, _freewheel_callback, this);
167 if (_session && _session->config.get_jack_time_master()) {
168 jack_set_timebase_callback (_priv_jack, 0, _jack_timebase_callback, this);
171 #ifdef HAVE_JACK_SESSION
172 if( jack_set_session_callback)
173 jack_set_session_callback (_priv_jack, _session_callback, this);
176 if (jack_set_latency_callback) {
177 jack_set_latency_callback (_priv_jack, _latency_callback, this);
180 jack_set_error_function (ardour_jack_error);
184 AudioEngine::start ()
186 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
190 if (!jack_port_type_get_buffer_size) {
191 warning << _("This version of JACK is old - you should upgrade to a newer version that supports jack_port_type_get_buffer_size()") << endmsg;
195 BootMessage (_("Connect session to engine"));
196 _session->set_frame_rate (jack_get_sample_rate (_priv_jack));
199 /* a proxy for whether jack_activate() will definitely call the buffer size
200 * callback. with older versions of JACK, this function symbol will be null.
201 * this is reliable, but not clean.
204 if (!jack_port_type_get_buffer_size) {
205 jack_bufsize_callback (jack_get_buffer_size (_priv_jack));
208 _processed_frames = 0;
209 last_monitor_check = 0;
211 set_jack_callbacks ();
213 if (jack_activate (_priv_jack) == 0) {
216 Running(); /* EMIT SIGNAL */
218 // error << _("cannot activate JACK client") << endmsg;
222 return _running ? 0 : -1;
226 AudioEngine::stop (bool forever)
228 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
232 disconnect_from_jack ();
234 jack_deactivate (_priv_jack);
235 Stopped(); /* EMIT SIGNAL */
236 MIDI::Port::JackHalted (); /* EMIT SIGNAL */
241 stop_metering_thread ();
244 return _running ? -1 : 0;
249 AudioEngine::get_sync_offset (pframes_t& offset) const
252 #ifdef HAVE_JACK_VIDEO_SUPPORT
254 GET_PRIVATE_JACK_POINTER_RET (_jack, false);
259 (void) jack_transport_query (_priv_jack, &pos);
261 if (pos.valid & JackVideoFrameOffset) {
262 offset = pos.video_offset;
275 AudioEngine::_jack_timebase_callback (jack_transport_state_t state, pframes_t nframes,
276 jack_position_t* pos, int new_position, void *arg)
278 static_cast<AudioEngine*> (arg)->jack_timebase_callback (state, nframes, pos, new_position);
282 AudioEngine::jack_timebase_callback (jack_transport_state_t state, pframes_t nframes,
283 jack_position_t* pos, int new_position)
285 if (_jack && _session && _session->synced_to_jack()) {
286 _session->jack_timebase_callback (state, nframes, pos, new_position);
291 AudioEngine::_jack_sync_callback (jack_transport_state_t state, jack_position_t* pos, void* arg)
293 return static_cast<AudioEngine*> (arg)->jack_sync_callback (state, pos);
297 AudioEngine::jack_sync_callback (jack_transport_state_t state, jack_position_t* pos)
299 if (_jack && _session) {
300 return _session->jack_sync_callback (state, pos);
307 AudioEngine::_xrun_callback (void *arg)
309 AudioEngine* ae = static_cast<AudioEngine*> (arg);
310 if (ae->connected()) {
311 ae->Xrun (); /* EMIT SIGNAL */
316 #ifdef HAVE_JACK_SESSION
318 AudioEngine::_session_callback (jack_session_event_t *event, void *arg)
320 printf( "helo.... " );
321 AudioEngine* ae = static_cast<AudioEngine*> (arg);
322 if (ae->connected()) {
323 ae->JackSessionEvent ( event ); /* EMIT SIGNAL */
328 AudioEngine::_graph_order_callback (void *arg)
330 AudioEngine* ae = static_cast<AudioEngine*> (arg);
332 if (ae->connected() && !ae->port_remove_in_progress) {
333 ae->GraphReordered (); /* EMIT SIGNAL */
339 /** Wrapped which is called by JACK as its process callback. It is just
340 * here to get us back into C++ land by calling AudioEngine::process_callback()
341 * @param nframes Number of frames passed by JACK.
342 * @param arg User argument passed by JACK, which will be the AudioEngine*.
345 AudioEngine::_process_callback (pframes_t nframes, void *arg)
347 return static_cast<AudioEngine *> (arg)->process_callback (nframes);
351 AudioEngine::_process_thread (void *arg)
353 return static_cast<AudioEngine *> (arg)->process_thread ();
357 AudioEngine::_freewheel_callback (int onoff, void *arg)
359 static_cast<AudioEngine*>(arg)->_freewheeling = onoff;
363 AudioEngine::_registration_callback (jack_port_id_t /*id*/, int /*reg*/, void* arg)
365 AudioEngine* ae = static_cast<AudioEngine*> (arg);
367 if (!ae->port_remove_in_progress) {
368 ae->PortRegisteredOrUnregistered (); /* EMIT SIGNAL */
373 AudioEngine::_latency_callback (jack_latency_callback_mode_t mode, void* arg)
375 return static_cast<AudioEngine *> (arg)->jack_latency_callback (mode);
379 AudioEngine::_connect_callback (jack_port_id_t id_a, jack_port_id_t id_b, int conn, void* arg)
381 AudioEngine* ae = static_cast<AudioEngine*> (arg);
383 if (ae->port_remove_in_progress) {
387 GET_PRIVATE_JACK_POINTER (ae->_jack);
389 jack_port_t* jack_port_a = jack_port_by_id (_priv_jack, id_a);
390 jack_port_t* jack_port_b = jack_port_by_id (_priv_jack, id_b);
392 boost::shared_ptr<Port> port_a;
393 boost::shared_ptr<Port> port_b;
395 boost::shared_ptr<Ports> pr = ae->ports.reader ();
396 Ports::iterator i = pr->begin ();
397 while (i != pr->end() && (port_a == 0 || port_b == 0)) {
398 if (jack_port_a == (*i)->jack_port()) {
400 } else if (jack_port_b == (*i)->jack_port()) {
406 ae->PortConnectedOrDisconnected (
407 port_a, jack_port_name (jack_port_a),
408 port_b, jack_port_name (jack_port_b),
409 conn == 0 ? false : true
414 AudioEngine::split_cycle (pframes_t offset)
416 /* caller must hold process lock */
418 Port::increment_global_port_buffer_offset (offset);
420 /* tell all Ports that we're going to start a new (split) cycle */
422 boost::shared_ptr<Ports> p = ports.reader();
424 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
425 (*i)->cycle_split ();
430 AudioEngine::process_thread ()
432 /* JACK doesn't do this for us when we use the wait API
435 _thread_init_callback (0);
437 _main_thread = new ProcessThread;
440 GET_PRIVATE_JACK_POINTER_RET(_jack,0);
442 pframes_t nframes = jack_cycle_wait (_priv_jack);
444 if (process_callback (nframes)) {
448 jack_cycle_signal (_priv_jack, 0);
454 /** Method called by JACK (via _process_callback) which says that there
455 * is work to be done.
456 * @param nframes Number of frames to process.
459 AudioEngine::process_callback (pframes_t nframes)
461 GET_PRIVATE_JACK_POINTER_RET(_jack,0);
462 // CycleTimer ct ("AudioEngine::process");
463 Glib::Mutex::Lock tm (_process_lock, Glib::TRY_LOCK);
465 /// The number of frames that will have been processed when we've finished
466 pframes_t next_processed_frames;
468 /* handle wrap around of total frames counter */
470 if (max_framepos - _processed_frames < nframes) {
471 next_processed_frames = nframes - (max_framepos - _processed_frames);
473 next_processed_frames = _processed_frames + nframes;
476 if (!tm.locked() || _session == 0) {
477 /* return having done nothing */
478 _processed_frames = next_processed_frames;
482 if (session_remove_pending) {
483 /* perform the actual session removal */
485 session_remove_pending = false;
486 session_removed.signal();
487 _processed_frames = next_processed_frames;
491 /* tell all relevant objects that we're starting a new cycle */
493 Delivery::CycleStart (nframes);
494 Port::set_global_port_buffer_offset (0);
495 Port::set_cycle_framecnt (nframes);
497 /* tell all Ports that we're starting a new cycle */
499 boost::shared_ptr<Ports> p = ports.reader();
501 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
502 (*i)->cycle_start (nframes);
505 /* test if we are freewheeling and there are freewheel signals connected.
506 ardour should act normally even when freewheeling unless /it/ is exporting */
509 if (_freewheeling && !Freewheel.empty()) {
510 /* emit the Freewheel signal and stop freewheeling in the event of trouble
512 boost::optional<int> r = Freewheel (nframes);
513 if (r.get_value_or (0)) {
514 jack_set_freewheel (_priv_jack, false);
519 _session->process (nframes);
529 _processed_frames = next_processed_frames;
533 if (last_monitor_check + monitor_check_interval < next_processed_frames) {
535 boost::shared_ptr<Ports> p = ports.reader();
537 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
541 if ((*i)->last_monitor() != (x = (*i)->jack_monitoring_input ())) {
542 (*i)->set_last_monitor (x);
543 /* XXX I think this is dangerous, due to
544 a likely mutex in the signal handlers ...
546 (*i)->MonitorInputChanged (x); /* EMIT SIGNAL */
549 last_monitor_check = next_processed_frames;
552 if (_session->silent()) {
554 boost::shared_ptr<Ports> p = ports.reader();
556 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
558 if ((*i)->sends_output()) {
559 (*i)->get_buffer(nframes).silence(nframes);
566 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
567 (*i)->cycle_end (nframes);
570 _processed_frames = next_processed_frames;
575 AudioEngine::_sample_rate_callback (pframes_t nframes, void *arg)
577 return static_cast<AudioEngine *> (arg)->jack_sample_rate_callback (nframes);
581 AudioEngine::jack_sample_rate_callback (pframes_t nframes)
583 _frame_rate = nframes;
584 _usecs_per_cycle = (int) floor ((((double) frames_per_cycle() / nframes)) * 1000000.0);
586 /* check for monitor input change every 1/10th of second */
588 monitor_check_interval = nframes / 10;
589 last_monitor_check = 0;
592 _session->set_frame_rate (nframes);
595 SampleRateChanged (nframes); /* EMIT SIGNAL */
601 AudioEngine::jack_latency_callback (jack_latency_callback_mode_t mode)
604 _session->update_latency (mode == JackPlaybackLatency);
609 AudioEngine::_bufsize_callback (pframes_t nframes, void *arg)
611 return static_cast<AudioEngine *> (arg)->jack_bufsize_callback (nframes);
615 AudioEngine::jack_bufsize_callback (pframes_t nframes)
617 /* if the size has not changed, this should be a no-op */
619 if (nframes == _buffer_size) {
623 GET_PRIVATE_JACK_POINTER_RET (_jack, 1);
625 _buffer_size = nframes;
626 _usecs_per_cycle = (int) floor ((((double) nframes / frame_rate())) * 1000000.0);
627 last_monitor_check = 0;
629 if (jack_port_type_get_buffer_size) {
630 _raw_buffer_sizes[DataType::AUDIO] = jack_port_type_get_buffer_size (_priv_jack, JACK_DEFAULT_AUDIO_TYPE);
631 _raw_buffer_sizes[DataType::MIDI] = jack_port_type_get_buffer_size (_priv_jack, JACK_DEFAULT_MIDI_TYPE);
634 /* Old version of JACK.
636 These crude guesses, see below where we try to get the right answers.
638 Note that our guess for MIDI deliberatey tries to overestimate
639 by a little. It would be nicer if we could get the actual
640 size from a port, but we have to use this estimate in the
641 event that there are no MIDI ports currently. If there are
642 the value will be adjusted below.
645 _raw_buffer_sizes[DataType::AUDIO] = nframes * sizeof (Sample);
646 _raw_buffer_sizes[DataType::MIDI] = nframes * 4 - (nframes/2);
650 Glib::Mutex::Lock lm (_process_lock);
652 boost::shared_ptr<Ports> p = ports.reader();
654 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
660 _session->set_block_size (_buffer_size);
667 AudioEngine::stop_metering_thread ()
669 if (m_meter_thread) {
670 g_atomic_int_set (&m_meter_exit, 1);
671 m_meter_thread->join ();
677 AudioEngine::start_metering_thread ()
679 if (m_meter_thread == 0) {
680 g_atomic_int_set (&m_meter_exit, 0);
681 m_meter_thread = Glib::Thread::create (boost::bind (&AudioEngine::meter_thread, this),
682 500000, true, true, Glib::THREAD_PRIORITY_NORMAL);
687 AudioEngine::meter_thread ()
689 pthread_set_name (X_("meter"));
692 Glib::usleep (10000); /* 1/100th sec interval */
693 if (g_atomic_int_get(&m_meter_exit)) {
701 AudioEngine::set_session (Session *s)
703 Glib::Mutex::Lock pl (_process_lock);
705 SessionHandlePtr::set_session (s);
709 start_metering_thread ();
711 pframes_t blocksize = jack_get_buffer_size (_jack);
713 /* page in as much of the session process code as we
714 can before we really start running.
717 boost::shared_ptr<Ports> p = ports.reader();
719 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
720 (*i)->cycle_start (blocksize);
723 _session->process (blocksize);
724 _session->process (blocksize);
725 _session->process (blocksize);
726 _session->process (blocksize);
727 _session->process (blocksize);
728 _session->process (blocksize);
729 _session->process (blocksize);
730 _session->process (blocksize);
732 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
733 (*i)->cycle_end (blocksize);
739 AudioEngine::remove_session ()
741 Glib::Mutex::Lock lm (_process_lock);
745 stop_metering_thread ();
748 session_remove_pending = true;
749 session_removed.wait(_process_lock);
753 SessionHandlePtr::set_session (0);
760 AudioEngine::port_registration_failure (const std::string& portname)
762 GET_PRIVATE_JACK_POINTER (_jack);
763 string full_portname = jack_client_name;
764 full_portname += ':';
765 full_portname += portname;
768 jack_port_t* p = jack_port_by_name (_priv_jack, full_portname.c_str());
772 reason = string_compose (_("a port with the name \"%1\" already exists: check for duplicated track/bus names"), portname);
774 reason = string_compose (_("No more JACK ports are available. You will need to stop %1 and restart JACK with ports if you need this many tracks."), PROGRAM_NAME);
777 throw PortRegistrationFailure (string_compose (_("AudioEngine: cannot register port \"%1\": %2"), portname, reason).c_str());
780 boost::shared_ptr<Port>
781 AudioEngine::register_port (DataType dtype, const string& portname, bool input)
783 boost::shared_ptr<Port> newport;
786 if (dtype == DataType::AUDIO) {
787 newport.reset (new AudioPort (portname, (input ? Port::IsInput : Port::IsOutput)));
788 } else if (dtype == DataType::MIDI) {
789 newport.reset (new MidiPort (portname, (input ? Port::IsInput : Port::IsOutput)));
791 throw PortRegistrationFailure("unable to create port (unknown type)");
794 RCUWriter<Ports> writer (ports);
795 boost::shared_ptr<Ports> ps = writer.get_copy ();
796 ps->insert (ps->begin(), newport);
798 /* writer goes out of scope, forces update */
803 catch (PortRegistrationFailure& err) {
805 } catch (std::exception& e) {
806 throw PortRegistrationFailure(string_compose(
807 _("unable to create port: %1"), e.what()).c_str());
809 throw PortRegistrationFailure("unable to create port (unknown error)");
813 boost::shared_ptr<Port>
814 AudioEngine::register_input_port (DataType type, const string& portname)
816 return register_port (type, portname, true);
819 boost::shared_ptr<Port>
820 AudioEngine::register_output_port (DataType type, const string& portname)
822 return register_port (type, portname, false);
826 AudioEngine::unregister_port (boost::shared_ptr<Port> port)
828 /* caller must hold process lock */
831 /* probably happening when the engine has been halted by JACK,
832 in which case, there is nothing we can do here.
838 RCUWriter<Ports> writer (ports);
839 boost::shared_ptr<Ports> ps = writer.get_copy ();
842 /* writer goes out of scope, forces update */
851 AudioEngine::connect (const string& source, const string& destination)
857 fatal << _("connect called before engine was started") << endmsg;
864 string s = make_port_name_non_relative (source);
865 string d = make_port_name_non_relative (destination);
868 boost::shared_ptr<Port> src = get_port_by_name (s);
869 boost::shared_ptr<Port> dst = get_port_by_name (d);
872 ret = src->connect (d);
874 ret = dst->connect (s);
876 /* neither port is known to us, and this API isn't intended for use as a general patch bay */
881 /* already exists - no error, no warning */
882 } else if (ret < 0) {
883 error << string_compose(_("AudioEngine: cannot connect %1 (%2) to %3 (%4)"),
884 source, s, destination, d)
892 AudioEngine::disconnect (const string& source, const string& destination)
898 fatal << _("disconnect called before engine was started") << endmsg;
905 string s = make_port_name_non_relative (source);
906 string d = make_port_name_non_relative (destination);
908 boost::shared_ptr<Port> src = get_port_by_name (s);
909 boost::shared_ptr<Port> dst = get_port_by_name (d);
912 ret = src->disconnect (d);
914 ret = dst->disconnect (s);
916 /* neither port is known to us, and this API isn't intended for use as a general patch bay */
923 AudioEngine::disconnect (boost::shared_ptr<Port> port)
925 GET_PRIVATE_JACK_POINTER_RET (_jack,-1);
929 fatal << _("disconnect called before engine was started") << endmsg;
936 return port->disconnect_all ();
940 AudioEngine::frame_rate () const
942 GET_PRIVATE_JACK_POINTER_RET (_jack, 0);
943 if (_frame_rate == 0) {
944 return (_frame_rate = jack_get_sample_rate (_priv_jack));
951 AudioEngine::raw_buffer_size (DataType t)
953 std::map<DataType,size_t>::const_iterator s = _raw_buffer_sizes.find(t);
954 return (s != _raw_buffer_sizes.end()) ? s->second : 0;
958 AudioEngine::frames_per_cycle () const
960 GET_PRIVATE_JACK_POINTER_RET (_jack,0);
961 if (_buffer_size == 0) {
962 return jack_get_buffer_size (_jack);
968 /** @param name Full or short name of port
969 * @return Corresponding Port or 0.
972 boost::shared_ptr<Port>
973 AudioEngine::get_port_by_name (const string& portname)
977 fatal << _("get_port_by_name() called before engine was started") << endmsg;
980 boost::shared_ptr<Port> ();
984 if (!port_is_mine (portname)) {
985 /* not an ardour port */
986 return boost::shared_ptr<Port> ();
989 std::string const rel = make_port_name_relative (portname);
991 boost::shared_ptr<Ports> pr = ports.reader();
993 for (Ports::iterator i = pr->begin(); i != pr->end(); ++i) {
994 if (rel == (*i)->name()) {
999 return boost::shared_ptr<Port> ();
1003 AudioEngine::get_ports (const string& port_name_pattern, const string& type_name_pattern, uint32_t flags)
1005 GET_PRIVATE_JACK_POINTER_RET (_jack,0);
1008 fatal << _("get_ports called before engine was started") << endmsg;
1014 return jack_get_ports (_priv_jack, port_name_pattern.c_str(), type_name_pattern.c_str(), flags);
1018 AudioEngine::halted_info (jack_status_t code, const char* reason, void *arg)
1020 /* called from jack shutdown handler */
1022 AudioEngine* ae = static_cast<AudioEngine *> (arg);
1023 bool was_running = ae->_running;
1025 ae->stop_metering_thread ();
1027 ae->_running = false;
1028 ae->_buffer_size = 0;
1029 ae->_frame_rate = 0;
1033 #ifdef HAVE_JACK_ON_INFO_SHUTDOWN
1035 case JackBackendError:
1036 ae->Halted(reason); /* EMIT SIGNAL */
1039 ae->Halted(""); /* EMIT SIGNAL */
1042 ae->Halted(""); /* EMIT SIGNAL */
1048 AudioEngine::halted (void *arg)
1050 cerr << "HALTED by JACK\n";
1052 /* called from jack shutdown handler */
1054 AudioEngine* ae = static_cast<AudioEngine *> (arg);
1055 bool was_running = ae->_running;
1057 ae->stop_metering_thread ();
1059 ae->_running = false;
1060 ae->_buffer_size = 0;
1061 ae->_frame_rate = 0;
1065 ae->Halted(""); /* EMIT SIGNAL */
1066 MIDI::Port::JackHalted (); /* EMIT SIGNAL */
1071 AudioEngine::died ()
1073 /* called from a signal handler for SIGPIPE */
1075 stop_metering_thread ();
1084 AudioEngine::can_request_hardware_monitoring ()
1086 GET_PRIVATE_JACK_POINTER_RET (_jack,false);
1087 const char ** ports;
1089 if ((ports = jack_get_ports (_priv_jack, NULL, JACK_DEFAULT_AUDIO_TYPE, JackPortCanMonitor)) == 0) {
1099 AudioEngine::n_physical (unsigned long flags) const
1103 GET_PRIVATE_JACK_POINTER_RET (_jack, c);
1105 const char ** ports = jack_get_ports (_priv_jack, NULL, NULL, JackPortIsPhysical | flags);
1110 for (uint32_t i = 0; ports[i]; ++i) {
1111 if (!strstr (ports[i], "Midi-Through")) {
1112 DataType t (jack_port_type (jack_port_by_name (_jack, ports[i])));
1113 c.set (t, c.get (t) + 1);
1123 AudioEngine::n_physical_inputs () const
1125 return n_physical (JackPortIsInput);
1129 AudioEngine::n_physical_outputs () const
1131 return n_physical (JackPortIsOutput);
1135 AudioEngine::get_physical (DataType type, unsigned long flags, vector<string>& phy)
1137 GET_PRIVATE_JACK_POINTER (_jack);
1138 const char ** ports;
1140 if ((ports = jack_get_ports (_priv_jack, NULL, type.to_jack_type(), JackPortIsPhysical | flags)) == 0) {
1145 for (uint32_t i = 0; ports[i]; ++i) {
1146 if (strstr (ports[i], "Midi-Through")) {
1149 phy.push_back (ports[i]);
1155 /** Get physical ports for which JackPortIsOutput is set; ie those that correspond to
1156 * a physical input connector.
1159 AudioEngine::get_physical_inputs (DataType type, vector<string>& ins)
1161 get_physical (type, JackPortIsOutput, ins);
1164 /** Get physical ports for which JackPortIsInput is set; ie those that correspond to
1165 * a physical output connector.
1168 AudioEngine::get_physical_outputs (DataType type, vector<string>& outs)
1170 get_physical (type, JackPortIsInput, outs);
1174 AudioEngine::transport_stop ()
1176 GET_PRIVATE_JACK_POINTER (_jack);
1177 jack_transport_stop (_priv_jack);
1181 AudioEngine::transport_start ()
1183 GET_PRIVATE_JACK_POINTER (_jack);
1184 jack_transport_start (_priv_jack);
1188 AudioEngine::transport_locate (framepos_t where)
1190 GET_PRIVATE_JACK_POINTER (_jack);
1191 jack_transport_locate (_priv_jack, where);
1194 AudioEngine::TransportState
1195 AudioEngine::transport_state ()
1197 GET_PRIVATE_JACK_POINTER_RET (_jack, ((TransportState) JackTransportStopped));
1198 jack_position_t pos;
1199 return (TransportState) jack_transport_query (_priv_jack, &pos);
1203 AudioEngine::reset_timebase ()
1205 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
1207 if (_session->config.get_jack_time_master()) {
1208 return jack_set_timebase_callback (_priv_jack, 0, _jack_timebase_callback, this);
1210 return jack_release_timebase (_jack);
1217 AudioEngine::freewheel (bool onoff)
1219 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
1221 if (onoff != _freewheeling) {
1222 return jack_set_freewheel (_priv_jack, onoff);
1225 /* already doing what has been asked for */
1231 AudioEngine::remove_all_ports ()
1233 /* make sure that JACK callbacks that will be invoked as we cleanup
1234 * ports know that they have nothing to do.
1237 port_remove_in_progress = true;
1239 /* process lock MUST be held by caller
1243 RCUWriter<Ports> writer (ports);
1244 boost::shared_ptr<Ports> ps = writer.get_copy ();
1248 /* clear dead wood list in RCU */
1252 port_remove_in_progress = false;
1256 AudioEngine::connect_to_jack (string client_name, string session_uuid)
1258 EnvironmentalProtectionAgency* global_epa = EnvironmentalProtectionAgency::get_global_epa ();
1259 boost::scoped_ptr<EnvironmentalProtectionAgency> current_epa;
1260 jack_options_t options = JackNullOption;
1261 jack_status_t status;
1262 const char *server_name = NULL;
1264 /* revert all environment settings back to whatever they were when ardour started
1268 current_epa.reset (new EnvironmentalProtectionAgency(true)); /* will restore settings when we leave scope */
1269 global_epa->restore ();
1272 jack_client_name = client_name; /* might be reset below */
1273 #ifdef HAVE_JACK_SESSION
1274 if (! session_uuid.empty())
1275 _jack = jack_client_open (jack_client_name.c_str(), JackSessionID, &status, session_uuid.c_str());
1278 _jack = jack_client_open (jack_client_name.c_str(), options, &status, server_name);
1280 if (_jack == NULL) {
1281 // error message is not useful here
1285 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
1287 if (status & JackNameNotUnique) {
1288 jack_client_name = jack_get_client_name (_priv_jack);
1295 AudioEngine::disconnect_from_jack ()
1297 GET_PRIVATE_JACK_POINTER_RET (_jack, 0);
1300 stop_metering_thread ();
1304 Glib::Mutex::Lock lm (_process_lock);
1305 jack_client_close (_priv_jack);
1311 _raw_buffer_sizes.clear();
1315 Stopped(); /* EMIT SIGNAL */
1316 MIDI::Port::JackHalted (); /* EMIT SIGNAL */
1323 AudioEngine::reconnect_to_jack ()
1326 disconnect_from_jack ();
1327 /* XXX give jackd a chance */
1328 Glib::usleep (250000);
1331 if (connect_to_jack (jack_client_name, "")) {
1332 error << _("failed to connect to JACK") << endmsg;
1338 boost::shared_ptr<Ports> p = ports.reader ();
1340 for (i = p->begin(); i != p->end(); ++i) {
1341 if ((*i)->reestablish ()) {
1346 if (i != p->end()) {
1348 remove_all_ports ();
1352 GET_PRIVATE_JACK_POINTER_RET (_jack,-1);
1354 MIDI::Manager::instance()->reestablish (_priv_jack);
1357 _session->reset_jack_connection (_priv_jack);
1358 jack_bufsize_callback (jack_get_buffer_size (_priv_jack));
1359 _session->set_frame_rate (jack_get_sample_rate (_priv_jack));
1362 last_monitor_check = 0;
1364 set_jack_callbacks ();
1366 if (jack_activate (_priv_jack) == 0) {
1373 /* re-establish connections */
1375 for (i = p->begin(); i != p->end(); ++i) {
1379 MIDI::Manager::instance()->reconnect ();
1381 Running (); /* EMIT SIGNAL*/
1383 start_metering_thread ();
1389 AudioEngine::request_buffer_size (pframes_t nframes)
1391 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
1393 if (nframes == jack_get_buffer_size (_priv_jack)) {
1397 return jack_set_buffer_size (_priv_jack, nframes);
1401 AudioEngine::make_port_name_relative (string portname) const
1403 string::size_type len;
1404 string::size_type n;
1406 len = portname.length();
1408 for (n = 0; n < len; ++n) {
1409 if (portname[n] == ':') {
1414 if ((n != len) && (portname.substr (0, n) == jack_client_name)) {
1415 return portname.substr (n+1);
1422 AudioEngine::make_port_name_non_relative (string portname) const
1426 if (portname.find_first_of (':') != string::npos) {
1430 str = jack_client_name;
1438 AudioEngine::port_is_mine (const string& portname) const
1440 if (portname.find_first_of (':') != string::npos) {
1441 if (portname.substr (0, jack_client_name.length ()) != jack_client_name) {
1449 AudioEngine::is_realtime () const
1451 GET_PRIVATE_JACK_POINTER_RET (_jack,false);
1452 return jack_is_realtime (_priv_jack);
1456 AudioEngine::create_process_thread (boost::function<void()> f, pthread_t* thread, size_t stacksize)
1458 GET_PRIVATE_JACK_POINTER_RET (_jack, 0);
1459 ThreadData* td = new ThreadData (this, f, stacksize);
1461 if (jack_client_create_thread (_priv_jack, thread, jack_client_real_time_priority (_priv_jack),
1462 jack_is_realtime (_priv_jack), _start_process_thread, td)) {
1470 AudioEngine::_start_process_thread (void* arg)
1472 ThreadData* td = reinterpret_cast<ThreadData*> (arg);
1473 boost::function<void()> f = td->f;
1482 AudioEngine::port_is_physical (const std::string& portname) const
1484 GET_PRIVATE_JACK_POINTER_RET(_jack, false);
1486 jack_port_t *port = jack_port_by_name (_priv_jack, portname.c_str());
1492 return jack_port_flags (port) & JackPortIsPhysical;
1496 AudioEngine::request_jack_monitors_input (const std::string& portname, bool yn) const
1498 GET_PRIVATE_JACK_POINTER(_jack);
1500 jack_port_t *port = jack_port_by_name (_priv_jack, portname.c_str());
1506 jack_port_request_monitor (port, yn);
1510 AudioEngine::update_latencies ()
1512 if (jack_recompute_total_latencies) {
1513 GET_PRIVATE_JACK_POINTER (_jack);
1514 jack_recompute_total_latencies (_priv_jack);
1519 AudioEngine::destroy ()