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)) {
94 throw NoBackendAvailable ();
97 Port::set_engine (this);
100 AudioEngine::~AudioEngine ()
103 Glib::Mutex::Lock tm (_process_lock);
104 session_removed.signal ();
107 jack_client_close (_jack);
111 stop_metering_thread ();
116 AudioEngine::jack() const
122 _thread_init_callback (void * /*arg*/)
124 /* make sure that anybody who needs to know about this thread
128 pthread_set_name (X_("audioengine"));
130 PBD::notify_gui_about_thread_creation ("gui", pthread_self(), X_("Audioengine"), 4096);
131 PBD::notify_gui_about_thread_creation ("midiui", pthread_self(), X_("Audioengine"), 128);
133 SessionEvent::create_per_thread_pool (X_("Audioengine"), 512);
135 MIDI::Port::set_process_thread (pthread_self());
139 AudioEngine::set_jack_callbacks ()
141 GET_PRIVATE_JACK_POINTER (_jack);
143 if (jack_on_info_shutdown) {
144 jack_on_info_shutdown (_priv_jack, halted_info, this);
146 jack_on_shutdown (_priv_jack, halted, this);
149 jack_set_thread_init_callback (_priv_jack, _thread_init_callback, this);
150 jack_set_process_thread (_priv_jack, _process_thread, this);
151 jack_set_sample_rate_callback (_priv_jack, _sample_rate_callback, this);
152 jack_set_buffer_size_callback (_priv_jack, _bufsize_callback, this);
153 jack_set_graph_order_callback (_priv_jack, _graph_order_callback, this);
154 jack_set_port_registration_callback (_priv_jack, _registration_callback, this);
155 jack_set_port_connect_callback (_priv_jack, _connect_callback, this);
156 jack_set_xrun_callback (_priv_jack, _xrun_callback, this);
157 jack_set_sync_callback (_priv_jack, _jack_sync_callback, this);
158 jack_set_freewheel_callback (_priv_jack, _freewheel_callback, this);
160 if (_session && _session->config.get_jack_time_master()) {
161 jack_set_timebase_callback (_priv_jack, 0, _jack_timebase_callback, this);
164 #ifdef HAVE_JACK_SESSION
165 if( jack_set_session_callback)
166 jack_set_session_callback (_priv_jack, _session_callback, this);
169 if (jack_set_latency_callback) {
170 jack_set_latency_callback (_priv_jack, _latency_callback, this);
173 // jack_set_error_function (ardour_jack_error);
177 AudioEngine::start ()
179 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
183 if (!jack_port_type_get_buffer_size) {
184 warning << _("This version of JACK is old - you should upgrade to a newer version that supports jack_port_type_get_buffer_size()") << endmsg;
188 BootMessage (_("Connect session to engine"));
189 _session->set_frame_rate (jack_get_sample_rate (_priv_jack));
192 /* a proxy for whether jack_activate() will definitely call the buffer size
193 * callback. with older versions of JACK, this function symbol will be null.
194 * this is reliable, but not clean.
197 if (!jack_port_type_get_buffer_size) {
198 jack_bufsize_callback (jack_get_buffer_size (_priv_jack));
201 _processed_frames = 0;
202 last_monitor_check = 0;
204 set_jack_callbacks ();
206 if (jack_activate (_priv_jack) == 0) {
209 Running(); /* EMIT SIGNAL */
211 // error << _("cannot activate JACK client") << endmsg;
215 return _running ? 0 : -1;
219 AudioEngine::stop (bool forever)
221 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
225 disconnect_from_jack ();
227 jack_deactivate (_priv_jack);
228 Stopped(); /* EMIT SIGNAL */
229 MIDI::Port::JackHalted (); /* EMIT SIGNAL */
234 stop_metering_thread ();
237 return _running ? -1 : 0;
242 AudioEngine::get_sync_offset (pframes_t& offset) const
245 #ifdef HAVE_JACK_VIDEO_SUPPORT
247 GET_PRIVATE_JACK_POINTER_RET (_jack, false);
252 (void) jack_transport_query (_priv_jack, &pos);
254 if (pos.valid & JackVideoFrameOffset) {
255 offset = pos.video_offset;
268 AudioEngine::_jack_timebase_callback (jack_transport_state_t state, pframes_t nframes,
269 jack_position_t* pos, int new_position, void *arg)
271 static_cast<AudioEngine*> (arg)->jack_timebase_callback (state, nframes, pos, new_position);
275 AudioEngine::jack_timebase_callback (jack_transport_state_t state, pframes_t nframes,
276 jack_position_t* pos, int new_position)
278 if (_jack && _session && _session->synced_to_jack()) {
279 _session->jack_timebase_callback (state, nframes, pos, new_position);
284 AudioEngine::_jack_sync_callback (jack_transport_state_t state, jack_position_t* pos, void* arg)
286 return static_cast<AudioEngine*> (arg)->jack_sync_callback (state, pos);
290 AudioEngine::jack_sync_callback (jack_transport_state_t state, jack_position_t* pos)
292 if (_jack && _session) {
293 return _session->jack_sync_callback (state, pos);
300 AudioEngine::_xrun_callback (void *arg)
302 AudioEngine* ae = static_cast<AudioEngine*> (arg);
303 if (ae->connected()) {
304 ae->Xrun (); /* EMIT SIGNAL */
309 #ifdef HAVE_JACK_SESSION
311 AudioEngine::_session_callback (jack_session_event_t *event, void *arg)
313 printf( "helo.... " );
314 AudioEngine* ae = static_cast<AudioEngine*> (arg);
315 if (ae->connected()) {
316 ae->JackSessionEvent ( event ); /* EMIT SIGNAL */
321 AudioEngine::_graph_order_callback (void *arg)
323 AudioEngine* ae = static_cast<AudioEngine*> (arg);
325 if (ae->connected() && !ae->port_remove_in_progress) {
326 ae->GraphReordered (); /* EMIT SIGNAL */
332 /** Wrapped which is called by JACK as its process callback. It is just
333 * here to get us back into C++ land by calling AudioEngine::process_callback()
334 * @param nframes Number of frames passed by JACK.
335 * @param arg User argument passed by JACK, which will be the AudioEngine*.
338 AudioEngine::_process_callback (pframes_t nframes, void *arg)
340 return static_cast<AudioEngine *> (arg)->process_callback (nframes);
344 AudioEngine::_process_thread (void *arg)
346 return static_cast<AudioEngine *> (arg)->process_thread ();
350 AudioEngine::_freewheel_callback (int onoff, void *arg)
352 static_cast<AudioEngine*>(arg)->_freewheeling = onoff;
356 AudioEngine::_registration_callback (jack_port_id_t /*id*/, int /*reg*/, void* arg)
358 AudioEngine* ae = static_cast<AudioEngine*> (arg);
360 if (!ae->port_remove_in_progress) {
361 ae->PortRegisteredOrUnregistered (); /* EMIT SIGNAL */
366 AudioEngine::_latency_callback (jack_latency_callback_mode_t mode, void* arg)
368 return static_cast<AudioEngine *> (arg)->jack_latency_callback (mode);
372 AudioEngine::_connect_callback (jack_port_id_t id_a, jack_port_id_t id_b, int conn, void* arg)
374 AudioEngine* ae = static_cast<AudioEngine*> (arg);
376 if (ae->port_remove_in_progress) {
380 GET_PRIVATE_JACK_POINTER (ae->_jack);
382 jack_port_t* jack_port_a = jack_port_by_id (_priv_jack, id_a);
383 jack_port_t* jack_port_b = jack_port_by_id (_priv_jack, id_b);
385 boost::shared_ptr<Port> port_a;
386 boost::shared_ptr<Port> port_b;
388 boost::shared_ptr<Ports> pr = ae->ports.reader ();
389 Ports::iterator i = pr->begin ();
390 while (i != pr->end() && (port_a == 0 || port_b == 0)) {
391 if (jack_port_a == (*i)->jack_port()) {
393 } else if (jack_port_b == (*i)->jack_port()) {
399 ae->PortConnectedOrDisconnected (
400 port_a, jack_port_name (jack_port_a),
401 port_b, jack_port_name (jack_port_b),
402 conn == 0 ? false : true
407 AudioEngine::split_cycle (pframes_t offset)
409 /* caller must hold process lock */
411 Port::increment_global_port_buffer_offset (offset);
413 /* tell all Ports that we're going to start a new (split) cycle */
415 boost::shared_ptr<Ports> p = ports.reader();
417 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
418 (*i)->cycle_split ();
423 AudioEngine::process_thread ()
425 /* JACK doesn't do this for us when we use the wait API
428 _thread_init_callback (0);
430 _main_thread = new ProcessThread;
433 GET_PRIVATE_JACK_POINTER_RET(_jack,0);
435 pframes_t nframes = jack_cycle_wait (_priv_jack);
437 if (process_callback (nframes)) {
441 jack_cycle_signal (_priv_jack, 0);
447 /** Method called by JACK (via _process_callback) which says that there
448 * is work to be done.
449 * @param nframes Number of frames to process.
452 AudioEngine::process_callback (pframes_t nframes)
454 GET_PRIVATE_JACK_POINTER_RET(_jack,0);
455 // CycleTimer ct ("AudioEngine::process");
456 Glib::Mutex::Lock tm (_process_lock, Glib::TRY_LOCK);
458 /// The number of frames that will have been processed when we've finished
459 pframes_t next_processed_frames;
461 /* handle wrap around of total frames counter */
463 if (max_framepos - _processed_frames < nframes) {
464 next_processed_frames = nframes - (max_framepos - _processed_frames);
466 next_processed_frames = _processed_frames + nframes;
469 if (!tm.locked() || _session == 0) {
470 /* return having done nothing */
471 _processed_frames = next_processed_frames;
475 if (session_remove_pending) {
476 /* perform the actual session removal */
478 session_remove_pending = false;
479 session_removed.signal();
480 _processed_frames = next_processed_frames;
484 /* tell all relevant objects that we're starting a new cycle */
486 Delivery::CycleStart (nframes);
487 Port::set_global_port_buffer_offset (0);
488 Port::set_cycle_framecnt (nframes);
489 InternalReturn::CycleStart (nframes);
491 /* tell all Ports that we're starting a new cycle */
493 boost::shared_ptr<Ports> p = ports.reader();
495 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
496 (*i)->cycle_start (nframes);
499 /* test if we are freewheeling and there are freewheel signals connected.
500 ardour should act normally even when freewheeling unless /it/ is exporting */
503 if (_freewheeling && !Freewheel.empty()) {
504 /* emit the Freewheel signal and stop freewheeling in the event of trouble
506 boost::optional<int> r = Freewheel (nframes);
507 if (r.get_value_or (0)) {
508 jack_set_freewheel (_priv_jack, false);
513 _session->process (nframes);
523 _processed_frames = next_processed_frames;
527 if (last_monitor_check + monitor_check_interval < next_processed_frames) {
529 boost::shared_ptr<Ports> p = ports.reader();
531 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
535 if ((*i)->last_monitor() != (x = (*i)->monitoring_input ())) {
536 (*i)->set_last_monitor (x);
537 /* XXX I think this is dangerous, due to
538 a likely mutex in the signal handlers ...
540 (*i)->MonitorInputChanged (x); /* EMIT SIGNAL */
543 last_monitor_check = next_processed_frames;
546 if (_session->silent()) {
548 boost::shared_ptr<Ports> p = ports.reader();
550 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
552 if ((*i)->sends_output()) {
553 (*i)->get_buffer(nframes).silence(nframes);
560 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
561 (*i)->cycle_end (nframes);
564 _processed_frames = next_processed_frames;
569 AudioEngine::_sample_rate_callback (pframes_t nframes, void *arg)
571 return static_cast<AudioEngine *> (arg)->jack_sample_rate_callback (nframes);
575 AudioEngine::jack_sample_rate_callback (pframes_t nframes)
577 _frame_rate = nframes;
578 _usecs_per_cycle = (int) floor ((((double) frames_per_cycle() / nframes)) * 1000000.0);
580 /* check for monitor input change every 1/10th of second */
582 monitor_check_interval = nframes / 10;
583 last_monitor_check = 0;
586 _session->set_frame_rate (nframes);
589 SampleRateChanged (nframes); /* EMIT SIGNAL */
595 AudioEngine::jack_latency_callback (jack_latency_callback_mode_t mode)
598 _session->update_latency (mode == JackPlaybackLatency);
603 AudioEngine::_bufsize_callback (pframes_t nframes, void *arg)
605 return static_cast<AudioEngine *> (arg)->jack_bufsize_callback (nframes);
609 AudioEngine::jack_bufsize_callback (pframes_t nframes)
611 /* if the size has not changed, this should be a no-op */
613 if (nframes == _buffer_size) {
617 GET_PRIVATE_JACK_POINTER_RET (_jack, 1);
619 _buffer_size = nframes;
620 _usecs_per_cycle = (int) floor ((((double) nframes / frame_rate())) * 1000000.0);
621 last_monitor_check = 0;
623 if (jack_port_type_get_buffer_size) {
624 _raw_buffer_sizes[DataType::AUDIO] = jack_port_type_get_buffer_size (_priv_jack, JACK_DEFAULT_AUDIO_TYPE);
625 _raw_buffer_sizes[DataType::MIDI] = jack_port_type_get_buffer_size (_priv_jack, JACK_DEFAULT_MIDI_TYPE);
628 /* Old version of JACK.
630 These crude guesses, see below where we try to get the right answers.
632 Note that our guess for MIDI deliberatey tries to overestimate
633 by a little. It would be nicer if we could get the actual
634 size from a port, but we have to use this estimate in the
635 event that there are no MIDI ports currently. If there are
636 the value will be adjusted below.
639 _raw_buffer_sizes[DataType::AUDIO] = nframes * sizeof (Sample);
640 _raw_buffer_sizes[DataType::MIDI] = nframes * 4 - (nframes/2);
644 Glib::Mutex::Lock lm (_process_lock);
646 boost::shared_ptr<Ports> p = ports.reader();
648 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
654 _session->set_block_size (_buffer_size);
661 AudioEngine::stop_metering_thread ()
663 if (m_meter_thread) {
664 g_atomic_int_set (&m_meter_exit, 1);
665 m_meter_thread->join ();
671 AudioEngine::start_metering_thread ()
673 if (m_meter_thread == 0) {
674 g_atomic_int_set (&m_meter_exit, 0);
675 m_meter_thread = Glib::Thread::create (boost::bind (&AudioEngine::meter_thread, this),
676 500000, true, true, Glib::THREAD_PRIORITY_NORMAL);
681 AudioEngine::meter_thread ()
683 pthread_set_name (X_("meter"));
686 Glib::usleep (10000); /* 1/100th sec interval */
687 if (g_atomic_int_get(&m_meter_exit)) {
695 AudioEngine::set_session (Session *s)
697 Glib::Mutex::Lock pl (_process_lock);
699 SessionHandlePtr::set_session (s);
703 start_metering_thread ();
705 pframes_t blocksize = jack_get_buffer_size (_jack);
707 /* page in as much of the session process code as we
708 can before we really start running.
711 boost::shared_ptr<Ports> p = ports.reader();
713 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
714 (*i)->cycle_start (blocksize);
717 _session->process (blocksize);
718 _session->process (blocksize);
719 _session->process (blocksize);
720 _session->process (blocksize);
721 _session->process (blocksize);
722 _session->process (blocksize);
723 _session->process (blocksize);
724 _session->process (blocksize);
726 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
727 (*i)->cycle_end (blocksize);
733 AudioEngine::remove_session ()
735 Glib::Mutex::Lock lm (_process_lock);
739 stop_metering_thread ();
742 session_remove_pending = true;
743 session_removed.wait(_process_lock);
747 SessionHandlePtr::set_session (0);
754 AudioEngine::port_registration_failure (const std::string& portname)
756 GET_PRIVATE_JACK_POINTER (_jack);
757 string full_portname = jack_client_name;
758 full_portname += ':';
759 full_portname += portname;
762 jack_port_t* p = jack_port_by_name (_priv_jack, full_portname.c_str());
766 reason = string_compose (_("a port with the name \"%1\" already exists: check for duplicated track/bus names"), portname);
768 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);
771 throw PortRegistrationFailure (string_compose (_("AudioEngine: cannot register port \"%1\": %2"), portname, reason).c_str());
774 boost::shared_ptr<Port>
775 AudioEngine::register_port (DataType dtype, const string& portname, bool input)
777 boost::shared_ptr<Port> newport;
780 if (dtype == DataType::AUDIO) {
781 newport.reset (new AudioPort (portname, (input ? Port::IsInput : Port::IsOutput)));
782 } else if (dtype == DataType::MIDI) {
783 newport.reset (new MidiPort (portname, (input ? Port::IsInput : Port::IsOutput)));
785 throw PortRegistrationFailure("unable to create port (unknown type)");
788 RCUWriter<Ports> writer (ports);
789 boost::shared_ptr<Ports> ps = writer.get_copy ();
790 ps->insert (ps->begin(), newport);
792 /* writer goes out of scope, forces update */
797 catch (PortRegistrationFailure& err) {
799 } catch (std::exception& e) {
800 throw PortRegistrationFailure(string_compose(
801 _("unable to create port: %1"), e.what()).c_str());
803 throw PortRegistrationFailure("unable to create port (unknown error)");
807 boost::shared_ptr<Port>
808 AudioEngine::register_input_port (DataType type, const string& portname)
810 return register_port (type, portname, true);
813 boost::shared_ptr<Port>
814 AudioEngine::register_output_port (DataType type, const string& portname)
816 return register_port (type, portname, false);
820 AudioEngine::unregister_port (boost::shared_ptr<Port> port)
822 /* caller must hold process lock */
825 /* probably happening when the engine has been halted by JACK,
826 in which case, there is nothing we can do here.
832 RCUWriter<Ports> writer (ports);
833 boost::shared_ptr<Ports> ps = writer.get_copy ();
836 /* writer goes out of scope, forces update */
845 AudioEngine::connect (const string& source, const string& destination)
851 fatal << _("connect called before engine was started") << endmsg;
858 string s = make_port_name_non_relative (source);
859 string d = make_port_name_non_relative (destination);
862 boost::shared_ptr<Port> src = get_port_by_name (s);
863 boost::shared_ptr<Port> dst = get_port_by_name (d);
866 ret = src->connect (d);
868 ret = dst->connect (s);
870 /* neither port is known to us, and this API isn't intended for use as a general patch bay */
875 /* already exists - no error, no warning */
876 } else if (ret < 0) {
877 error << string_compose(_("AudioEngine: cannot connect %1 (%2) to %3 (%4)"),
878 source, s, destination, d)
886 AudioEngine::disconnect (const string& source, const string& destination)
892 fatal << _("disconnect called before engine was started") << endmsg;
899 string s = make_port_name_non_relative (source);
900 string d = make_port_name_non_relative (destination);
902 boost::shared_ptr<Port> src = get_port_by_name (s);
903 boost::shared_ptr<Port> dst = get_port_by_name (d);
906 ret = src->disconnect (d);
908 ret = dst->disconnect (s);
910 /* neither port is known to us, and this API isn't intended for use as a general patch bay */
917 AudioEngine::disconnect (boost::shared_ptr<Port> port)
919 GET_PRIVATE_JACK_POINTER_RET (_jack,-1);
923 fatal << _("disconnect called before engine was started") << endmsg;
930 return port->disconnect_all ();
934 AudioEngine::frame_rate () const
936 GET_PRIVATE_JACK_POINTER_RET (_jack, 0);
937 if (_frame_rate == 0) {
938 return (_frame_rate = jack_get_sample_rate (_priv_jack));
945 AudioEngine::raw_buffer_size (DataType t)
947 std::map<DataType,size_t>::const_iterator s = _raw_buffer_sizes.find(t);
948 return (s != _raw_buffer_sizes.end()) ? s->second : 0;
952 AudioEngine::frames_per_cycle () const
954 GET_PRIVATE_JACK_POINTER_RET (_jack,0);
955 if (_buffer_size == 0) {
956 return jack_get_buffer_size (_jack);
962 /** @param name Full or short name of port
963 * @return Corresponding Port or 0.
966 boost::shared_ptr<Port>
967 AudioEngine::get_port_by_name (const string& portname)
971 fatal << _("get_port_by_name() called before engine was started") << endmsg;
974 boost::shared_ptr<Port> ();
978 if (!port_is_mine (portname)) {
979 /* not an ardour port */
980 return boost::shared_ptr<Port> ();
983 std::string const rel = make_port_name_relative (portname);
985 boost::shared_ptr<Ports> pr = ports.reader();
987 for (Ports::iterator i = pr->begin(); i != pr->end(); ++i) {
988 if (rel == (*i)->name()) {
993 return boost::shared_ptr<Port> ();
997 AudioEngine::get_ports (const string& port_name_pattern, const string& type_name_pattern, uint32_t flags)
999 GET_PRIVATE_JACK_POINTER_RET (_jack,0);
1002 fatal << _("get_ports called before engine was started") << endmsg;
1008 return jack_get_ports (_priv_jack, port_name_pattern.c_str(), type_name_pattern.c_str(), flags);
1012 AudioEngine::halted_info (jack_status_t code, const char* reason, void *arg)
1014 /* called from jack shutdown handler */
1016 AudioEngine* ae = static_cast<AudioEngine *> (arg);
1017 bool was_running = ae->_running;
1019 ae->stop_metering_thread ();
1021 ae->_running = false;
1022 ae->_buffer_size = 0;
1023 ae->_frame_rate = 0;
1027 #ifdef HAVE_JACK_ON_INFO_SHUTDOWN
1029 case JackBackendError:
1030 ae->Halted(reason); /* EMIT SIGNAL */
1033 ae->Halted(""); /* EMIT SIGNAL */
1036 ae->Halted(""); /* EMIT SIGNAL */
1042 AudioEngine::halted (void *arg)
1044 cerr << "HALTED by JACK\n";
1046 /* called from jack shutdown handler */
1048 AudioEngine* ae = static_cast<AudioEngine *> (arg);
1049 bool was_running = ae->_running;
1051 ae->stop_metering_thread ();
1053 ae->_running = false;
1054 ae->_buffer_size = 0;
1055 ae->_frame_rate = 0;
1059 ae->Halted(""); /* EMIT SIGNAL */
1060 MIDI::Port::JackHalted (); /* EMIT SIGNAL */
1065 AudioEngine::died ()
1067 /* called from a signal handler for SIGPIPE */
1069 stop_metering_thread ();
1078 AudioEngine::can_request_hardware_monitoring ()
1080 GET_PRIVATE_JACK_POINTER_RET (_jack,false);
1081 const char ** ports;
1083 if ((ports = jack_get_ports (_priv_jack, NULL, JACK_DEFAULT_AUDIO_TYPE, JackPortCanMonitor)) == 0) {
1093 AudioEngine::n_physical (unsigned long flags) const
1097 GET_PRIVATE_JACK_POINTER_RET (_jack, c);
1099 const char ** ports = jack_get_ports (_priv_jack, NULL, NULL, JackPortIsPhysical | flags);
1104 for (uint32_t i = 0; ports[i]; ++i) {
1105 if (!strstr (ports[i], "Midi-Through")) {
1106 DataType t (jack_port_type (jack_port_by_name (_jack, ports[i])));
1107 c.set (t, c.get (t) + 1);
1117 AudioEngine::n_physical_inputs () const
1119 return n_physical (JackPortIsInput);
1123 AudioEngine::n_physical_outputs () const
1125 return n_physical (JackPortIsOutput);
1129 AudioEngine::get_physical (DataType type, unsigned long flags, vector<string>& phy)
1131 GET_PRIVATE_JACK_POINTER (_jack);
1132 const char ** ports;
1134 if ((ports = jack_get_ports (_priv_jack, NULL, type.to_jack_type(), JackPortIsPhysical | flags)) == 0) {
1139 for (uint32_t i = 0; ports[i]; ++i) {
1140 if (strstr (ports[i], "Midi-Through")) {
1143 phy.push_back (ports[i]);
1149 /** Get physical ports for which JackPortIsOutput is set; ie those that correspond to
1150 * a physical input connector.
1153 AudioEngine::get_physical_inputs (DataType type, vector<string>& ins)
1155 get_physical (type, JackPortIsOutput, ins);
1158 /** Get physical ports for which JackPortIsInput is set; ie those that correspond to
1159 * a physical output connector.
1162 AudioEngine::get_physical_outputs (DataType type, vector<string>& outs)
1164 get_physical (type, JackPortIsInput, outs);
1168 AudioEngine::transport_stop ()
1170 GET_PRIVATE_JACK_POINTER (_jack);
1171 jack_transport_stop (_priv_jack);
1175 AudioEngine::transport_start ()
1177 GET_PRIVATE_JACK_POINTER (_jack);
1178 jack_transport_start (_priv_jack);
1182 AudioEngine::transport_locate (framepos_t where)
1184 GET_PRIVATE_JACK_POINTER (_jack);
1185 jack_transport_locate (_priv_jack, where);
1188 AudioEngine::TransportState
1189 AudioEngine::transport_state ()
1191 GET_PRIVATE_JACK_POINTER_RET (_jack, ((TransportState) JackTransportStopped));
1192 jack_position_t pos;
1193 return (TransportState) jack_transport_query (_priv_jack, &pos);
1197 AudioEngine::reset_timebase ()
1199 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
1201 if (_session->config.get_jack_time_master()) {
1202 return jack_set_timebase_callback (_priv_jack, 0, _jack_timebase_callback, this);
1204 return jack_release_timebase (_jack);
1211 AudioEngine::freewheel (bool onoff)
1213 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
1215 if (onoff != _freewheeling) {
1216 return jack_set_freewheel (_priv_jack, onoff);
1219 /* already doing what has been asked for */
1225 AudioEngine::remove_all_ports ()
1227 /* make sure that JACK callbacks that will be invoked as we cleanup
1228 * ports know that they have nothing to do.
1231 port_remove_in_progress = true;
1233 /* process lock MUST be held by caller
1237 RCUWriter<Ports> writer (ports);
1238 boost::shared_ptr<Ports> ps = writer.get_copy ();
1242 /* clear dead wood list in RCU */
1246 port_remove_in_progress = false;
1250 AudioEngine::connect_to_jack (string client_name, string session_uuid)
1252 EnvironmentalProtectionAgency* global_epa = EnvironmentalProtectionAgency::get_global_epa ();
1253 boost::scoped_ptr<EnvironmentalProtectionAgency> current_epa;
1254 jack_options_t options = JackNullOption;
1255 jack_status_t status;
1256 const char *server_name = NULL;
1258 /* revert all environment settings back to whatever they were when ardour started
1262 current_epa.reset (new EnvironmentalProtectionAgency(true)); /* will restore settings when we leave scope */
1263 global_epa->restore ();
1266 jack_client_name = client_name; /* might be reset below */
1267 #ifdef HAVE_JACK_SESSION
1268 if (! session_uuid.empty())
1269 _jack = jack_client_open (jack_client_name.c_str(), JackSessionID, &status, session_uuid.c_str());
1272 _jack = jack_client_open (jack_client_name.c_str(), options, &status, server_name);
1274 if (_jack == NULL) {
1275 // error message is not useful here
1279 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
1281 if (status & JackNameNotUnique) {
1282 jack_client_name = jack_get_client_name (_priv_jack);
1289 AudioEngine::disconnect_from_jack ()
1291 GET_PRIVATE_JACK_POINTER_RET (_jack, 0);
1294 stop_metering_thread ();
1298 Glib::Mutex::Lock lm (_process_lock);
1299 jack_client_close (_priv_jack);
1305 _raw_buffer_sizes.clear();
1309 Stopped(); /* EMIT SIGNAL */
1310 MIDI::Port::JackHalted (); /* EMIT SIGNAL */
1317 AudioEngine::reconnect_to_jack ()
1320 disconnect_from_jack ();
1321 /* XXX give jackd a chance */
1322 Glib::usleep (250000);
1325 if (connect_to_jack (jack_client_name, "")) {
1326 error << _("failed to connect to JACK") << endmsg;
1332 boost::shared_ptr<Ports> p = ports.reader ();
1334 for (i = p->begin(); i != p->end(); ++i) {
1335 if ((*i)->reestablish ()) {
1340 if (i != p->end()) {
1342 remove_all_ports ();
1346 GET_PRIVATE_JACK_POINTER_RET (_jack,-1);
1348 MIDI::Manager::instance()->reestablish (_priv_jack);
1351 _session->reset_jack_connection (_priv_jack);
1352 jack_bufsize_callback (jack_get_buffer_size (_priv_jack));
1353 _session->set_frame_rate (jack_get_sample_rate (_priv_jack));
1356 last_monitor_check = 0;
1358 set_jack_callbacks ();
1360 if (jack_activate (_priv_jack) == 0) {
1367 /* re-establish connections */
1369 for (i = p->begin(); i != p->end(); ++i) {
1373 MIDI::Manager::instance()->reconnect ();
1375 Running (); /* EMIT SIGNAL*/
1377 start_metering_thread ();
1383 AudioEngine::request_buffer_size (pframes_t nframes)
1385 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
1387 if (nframes == jack_get_buffer_size (_priv_jack)) {
1391 return jack_set_buffer_size (_priv_jack, nframes);
1395 AudioEngine::make_port_name_relative (string portname) const
1397 string::size_type len;
1398 string::size_type n;
1400 len = portname.length();
1402 for (n = 0; n < len; ++n) {
1403 if (portname[n] == ':') {
1408 if ((n != len) && (portname.substr (0, n) == jack_client_name)) {
1409 return portname.substr (n+1);
1416 AudioEngine::make_port_name_non_relative (string portname) const
1420 if (portname.find_first_of (':') != string::npos) {
1424 str = jack_client_name;
1432 AudioEngine::port_is_mine (const string& portname) const
1434 if (portname.find_first_of (':') != string::npos) {
1435 if (portname.substr (0, jack_client_name.length ()) != jack_client_name) {
1443 AudioEngine::is_realtime () const
1445 GET_PRIVATE_JACK_POINTER_RET (_jack,false);
1446 return jack_is_realtime (_priv_jack);
1450 AudioEngine::create_process_thread (boost::function<void()> f, pthread_t* thread, size_t stacksize)
1452 GET_PRIVATE_JACK_POINTER_RET (_jack, 0);
1453 ThreadData* td = new ThreadData (this, f, stacksize);
1455 if (jack_client_create_thread (_priv_jack, thread, jack_client_real_time_priority (_priv_jack),
1456 jack_is_realtime (_priv_jack), _start_process_thread, td)) {
1464 AudioEngine::_start_process_thread (void* arg)
1466 ThreadData* td = reinterpret_cast<ThreadData*> (arg);
1467 boost::function<void()> f = td->f;
1476 AudioEngine::port_is_physical (const std::string& portname) const
1478 GET_PRIVATE_JACK_POINTER_RET(_jack, false);
1480 jack_port_t *port = jack_port_by_name (_priv_jack, portname.c_str());
1486 return jack_port_flags (port) & JackPortIsPhysical;
1490 AudioEngine::ensure_monitor_input (const std::string& portname, bool yn) const
1492 GET_PRIVATE_JACK_POINTER(_jack);
1494 jack_port_t *port = jack_port_by_name (_priv_jack, portname.c_str());
1500 jack_port_request_monitor (port, yn);
1504 AudioEngine::update_latencies ()
1506 if (jack_recompute_total_latencies) {
1507 GET_PRIVATE_JACK_POINTER (_jack);
1508 jack_recompute_total_latencies (_priv_jack);