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 ardour_jack_error (const char* msg)
141 error << "JACK: " << msg << endmsg;
145 AudioEngine::set_jack_callbacks ()
147 GET_PRIVATE_JACK_POINTER (_jack);
149 if (jack_on_info_shutdown) {
150 jack_on_info_shutdown (_priv_jack, halted_info, this);
152 jack_on_shutdown (_priv_jack, halted, this);
155 jack_set_thread_init_callback (_priv_jack, _thread_init_callback, this);
156 jack_set_process_thread (_priv_jack, _process_thread, this);
157 jack_set_sample_rate_callback (_priv_jack, _sample_rate_callback, this);
158 jack_set_buffer_size_callback (_priv_jack, _bufsize_callback, this);
159 jack_set_graph_order_callback (_priv_jack, _graph_order_callback, this);
160 jack_set_port_registration_callback (_priv_jack, _registration_callback, this);
161 jack_set_port_connect_callback (_priv_jack, _connect_callback, this);
162 jack_set_xrun_callback (_priv_jack, _xrun_callback, this);
163 jack_set_sync_callback (_priv_jack, _jack_sync_callback, this);
164 jack_set_freewheel_callback (_priv_jack, _freewheel_callback, this);
166 if (_session && _session->config.get_jack_time_master()) {
167 jack_set_timebase_callback (_priv_jack, 0, _jack_timebase_callback, this);
170 #ifdef HAVE_JACK_SESSION
171 if( jack_set_session_callback)
172 jack_set_session_callback (_priv_jack, _session_callback, this);
175 if (jack_set_latency_callback) {
176 jack_set_latency_callback (_priv_jack, _latency_callback, this);
179 jack_set_error_function (ardour_jack_error);
183 AudioEngine::start ()
185 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
189 if (!jack_port_type_get_buffer_size) {
190 warning << _("This version of JACK is old - you should upgrade to a newer version that supports jack_port_type_get_buffer_size()") << endmsg;
194 BootMessage (_("Connect session to engine"));
195 _session->set_frame_rate (jack_get_sample_rate (_priv_jack));
198 /* a proxy for whether jack_activate() will definitely call the buffer size
199 * callback. with older versions of JACK, this function symbol will be null.
200 * this is reliable, but not clean.
203 if (!jack_port_type_get_buffer_size) {
204 jack_bufsize_callback (jack_get_buffer_size (_priv_jack));
207 _processed_frames = 0;
208 last_monitor_check = 0;
210 set_jack_callbacks ();
212 if (jack_activate (_priv_jack) == 0) {
215 Running(); /* EMIT SIGNAL */
217 // error << _("cannot activate JACK client") << endmsg;
221 return _running ? 0 : -1;
225 AudioEngine::stop (bool forever)
227 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
231 disconnect_from_jack ();
233 jack_deactivate (_priv_jack);
234 Stopped(); /* EMIT SIGNAL */
235 MIDI::Port::JackHalted (); /* EMIT SIGNAL */
240 stop_metering_thread ();
243 return _running ? -1 : 0;
248 AudioEngine::get_sync_offset (pframes_t& offset) const
251 #ifdef HAVE_JACK_VIDEO_SUPPORT
253 GET_PRIVATE_JACK_POINTER_RET (_jack, false);
258 (void) jack_transport_query (_priv_jack, &pos);
260 if (pos.valid & JackVideoFrameOffset) {
261 offset = pos.video_offset;
274 AudioEngine::_jack_timebase_callback (jack_transport_state_t state, pframes_t nframes,
275 jack_position_t* pos, int new_position, void *arg)
277 static_cast<AudioEngine*> (arg)->jack_timebase_callback (state, nframes, pos, new_position);
281 AudioEngine::jack_timebase_callback (jack_transport_state_t state, pframes_t nframes,
282 jack_position_t* pos, int new_position)
284 if (_jack && _session && _session->synced_to_jack()) {
285 _session->jack_timebase_callback (state, nframes, pos, new_position);
290 AudioEngine::_jack_sync_callback (jack_transport_state_t state, jack_position_t* pos, void* arg)
292 return static_cast<AudioEngine*> (arg)->jack_sync_callback (state, pos);
296 AudioEngine::jack_sync_callback (jack_transport_state_t state, jack_position_t* pos)
298 if (_jack && _session) {
299 return _session->jack_sync_callback (state, pos);
306 AudioEngine::_xrun_callback (void *arg)
308 AudioEngine* ae = static_cast<AudioEngine*> (arg);
309 if (ae->connected()) {
310 ae->Xrun (); /* EMIT SIGNAL */
315 #ifdef HAVE_JACK_SESSION
317 AudioEngine::_session_callback (jack_session_event_t *event, void *arg)
319 printf( "helo.... " );
320 AudioEngine* ae = static_cast<AudioEngine*> (arg);
321 if (ae->connected()) {
322 ae->JackSessionEvent ( event ); /* EMIT SIGNAL */
327 AudioEngine::_graph_order_callback (void *arg)
329 AudioEngine* ae = static_cast<AudioEngine*> (arg);
331 if (ae->connected() && !ae->port_remove_in_progress) {
332 ae->GraphReordered (); /* EMIT SIGNAL */
339 AudioEngine::_process_thread (void *arg)
341 return static_cast<AudioEngine *> (arg)->process_thread ();
345 AudioEngine::_freewheel_callback (int onoff, void *arg)
347 static_cast<AudioEngine*>(arg)->_freewheeling = onoff;
351 AudioEngine::_registration_callback (jack_port_id_t /*id*/, int /*reg*/, void* arg)
353 AudioEngine* ae = static_cast<AudioEngine*> (arg);
355 if (!ae->port_remove_in_progress) {
356 ae->PortRegisteredOrUnregistered (); /* EMIT SIGNAL */
361 AudioEngine::_latency_callback (jack_latency_callback_mode_t mode, void* arg)
363 return static_cast<AudioEngine *> (arg)->jack_latency_callback (mode);
367 AudioEngine::_connect_callback (jack_port_id_t id_a, jack_port_id_t id_b, int conn, void* arg)
369 AudioEngine* ae = static_cast<AudioEngine*> (arg);
371 if (ae->port_remove_in_progress) {
375 GET_PRIVATE_JACK_POINTER (ae->_jack);
377 jack_port_t* jack_port_a = jack_port_by_id (_priv_jack, id_a);
378 jack_port_t* jack_port_b = jack_port_by_id (_priv_jack, id_b);
380 boost::shared_ptr<Port> port_a;
381 boost::shared_ptr<Port> port_b;
383 boost::shared_ptr<Ports> pr = ae->ports.reader ();
384 Ports::iterator i = pr->begin ();
385 while (i != pr->end() && (port_a == 0 || port_b == 0)) {
386 if (jack_port_a == (*i)->jack_port()) {
388 } else if (jack_port_b == (*i)->jack_port()) {
394 ae->PortConnectedOrDisconnected (
395 port_a, jack_port_name (jack_port_a),
396 port_b, jack_port_name (jack_port_b),
397 conn == 0 ? false : true
402 AudioEngine::split_cycle (pframes_t offset)
404 /* caller must hold process lock */
406 Port::increment_global_port_buffer_offset (offset);
408 /* tell all Ports that we're going to start a new (split) cycle */
410 boost::shared_ptr<Ports> p = ports.reader();
412 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
413 (*i)->cycle_split ();
418 AudioEngine::process_thread ()
420 /* JACK doesn't do this for us when we use the wait API
423 _thread_init_callback (0);
425 _main_thread = new ProcessThread;
428 GET_PRIVATE_JACK_POINTER_RET(_jack,0);
430 pframes_t nframes = jack_cycle_wait (_priv_jack);
432 if (process_callback (nframes)) {
436 jack_cycle_signal (_priv_jack, 0);
442 /** Method called by our ::process_thread when there is work to be done.
443 * @param nframes Number of frames to process.
446 AudioEngine::process_callback (pframes_t nframes)
448 GET_PRIVATE_JACK_POINTER_RET(_jack,0);
449 // CycleTimer ct ("AudioEngine::process");
450 Glib::Mutex::Lock tm (_process_lock, Glib::TRY_LOCK);
452 /// The number of frames that will have been processed when we've finished
453 pframes_t next_processed_frames;
455 /* handle wrap around of total frames counter */
457 if (max_framepos - _processed_frames < nframes) {
458 next_processed_frames = nframes - (max_framepos - _processed_frames);
460 next_processed_frames = _processed_frames + nframes;
463 if (!tm.locked() || _session == 0) {
464 /* return having done nothing */
465 _processed_frames = next_processed_frames;
469 if (session_remove_pending) {
470 /* perform the actual session removal */
472 session_remove_pending = false;
473 session_removed.signal();
474 _processed_frames = next_processed_frames;
478 /* tell all relevant objects that we're starting a new cycle */
480 Delivery::CycleStart (nframes);
481 Port::set_global_port_buffer_offset (0);
482 Port::set_cycle_framecnt (nframes);
484 /* tell all Ports that we're starting a new cycle */
486 boost::shared_ptr<Ports> p = ports.reader();
488 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
489 (*i)->cycle_start (nframes);
492 /* test if we are freewheeling and there are freewheel signals connected.
493 ardour should act normally even when freewheeling unless /it/ is exporting */
496 if (_freewheeling && !Freewheel.empty()) {
497 /* emit the Freewheel signal and stop freewheeling in the event of trouble
499 boost::optional<int> r = Freewheel (nframes);
500 if (r.get_value_or (0)) {
501 jack_set_freewheel (_priv_jack, false);
506 _session->process (nframes);
516 _processed_frames = next_processed_frames;
520 if (last_monitor_check + monitor_check_interval < next_processed_frames) {
522 boost::shared_ptr<Ports> p = ports.reader();
524 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
528 if ((*i)->last_monitor() != (x = (*i)->jack_monitoring_input ())) {
529 (*i)->set_last_monitor (x);
530 /* XXX I think this is dangerous, due to
531 a likely mutex in the signal handlers ...
533 (*i)->MonitorInputChanged (x); /* EMIT SIGNAL */
536 last_monitor_check = next_processed_frames;
539 if (_session->silent()) {
541 boost::shared_ptr<Ports> p = ports.reader();
543 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
545 if ((*i)->sends_output()) {
546 (*i)->get_buffer(nframes).silence(nframes);
553 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
554 (*i)->cycle_end (nframes);
557 _processed_frames = next_processed_frames;
562 AudioEngine::_sample_rate_callback (pframes_t nframes, void *arg)
564 return static_cast<AudioEngine *> (arg)->jack_sample_rate_callback (nframes);
568 AudioEngine::jack_sample_rate_callback (pframes_t nframes)
570 _frame_rate = nframes;
571 _usecs_per_cycle = (int) floor ((((double) frames_per_cycle() / nframes)) * 1000000.0);
573 /* check for monitor input change every 1/10th of second */
575 monitor_check_interval = nframes / 10;
576 last_monitor_check = 0;
579 _session->set_frame_rate (nframes);
582 SampleRateChanged (nframes); /* EMIT SIGNAL */
588 AudioEngine::jack_latency_callback (jack_latency_callback_mode_t mode)
591 _session->update_latency (mode == JackPlaybackLatency);
596 AudioEngine::_bufsize_callback (pframes_t nframes, void *arg)
598 return static_cast<AudioEngine *> (arg)->jack_bufsize_callback (nframes);
602 AudioEngine::jack_bufsize_callback (pframes_t nframes)
604 /* if the size has not changed, this should be a no-op */
606 if (nframes == _buffer_size) {
610 GET_PRIVATE_JACK_POINTER_RET (_jack, 1);
612 _buffer_size = nframes;
613 _usecs_per_cycle = (int) floor ((((double) nframes / frame_rate())) * 1000000.0);
614 last_monitor_check = 0;
616 if (jack_port_type_get_buffer_size) {
617 _raw_buffer_sizes[DataType::AUDIO] = jack_port_type_get_buffer_size (_priv_jack, JACK_DEFAULT_AUDIO_TYPE);
618 _raw_buffer_sizes[DataType::MIDI] = jack_port_type_get_buffer_size (_priv_jack, JACK_DEFAULT_MIDI_TYPE);
621 /* Old version of JACK.
623 These crude guesses, see below where we try to get the right answers.
625 Note that our guess for MIDI deliberatey tries to overestimate
626 by a little. It would be nicer if we could get the actual
627 size from a port, but we have to use this estimate in the
628 event that there are no MIDI ports currently. If there are
629 the value will be adjusted below.
632 _raw_buffer_sizes[DataType::AUDIO] = nframes * sizeof (Sample);
633 _raw_buffer_sizes[DataType::MIDI] = nframes * 4 - (nframes/2);
637 Glib::Mutex::Lock lm (_process_lock);
639 boost::shared_ptr<Ports> p = ports.reader();
641 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
647 _session->set_block_size (_buffer_size);
654 AudioEngine::stop_metering_thread ()
656 if (m_meter_thread) {
657 g_atomic_int_set (&m_meter_exit, 1);
658 m_meter_thread->join ();
664 AudioEngine::start_metering_thread ()
666 if (m_meter_thread == 0) {
667 g_atomic_int_set (&m_meter_exit, 0);
668 m_meter_thread = Glib::Thread::create (boost::bind (&AudioEngine::meter_thread, this),
669 500000, true, true, Glib::THREAD_PRIORITY_NORMAL);
674 AudioEngine::meter_thread ()
676 pthread_set_name (X_("meter"));
679 Glib::usleep (10000); /* 1/100th sec interval */
680 if (g_atomic_int_get(&m_meter_exit)) {
688 AudioEngine::set_session (Session *s)
690 Glib::Mutex::Lock pl (_process_lock);
692 SessionHandlePtr::set_session (s);
696 start_metering_thread ();
698 pframes_t blocksize = jack_get_buffer_size (_jack);
700 /* page in as much of the session process code as we
701 can before we really start running.
704 boost::shared_ptr<Ports> p = ports.reader();
706 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
707 (*i)->cycle_start (blocksize);
710 _session->process (blocksize);
711 _session->process (blocksize);
712 _session->process (blocksize);
713 _session->process (blocksize);
714 _session->process (blocksize);
715 _session->process (blocksize);
716 _session->process (blocksize);
717 _session->process (blocksize);
719 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
720 (*i)->cycle_end (blocksize);
726 AudioEngine::remove_session ()
728 Glib::Mutex::Lock lm (_process_lock);
732 stop_metering_thread ();
735 session_remove_pending = true;
736 session_removed.wait(_process_lock);
740 SessionHandlePtr::set_session (0);
747 AudioEngine::port_registration_failure (const std::string& portname)
749 GET_PRIVATE_JACK_POINTER (_jack);
750 string full_portname = jack_client_name;
751 full_portname += ':';
752 full_portname += portname;
755 jack_port_t* p = jack_port_by_name (_priv_jack, full_portname.c_str());
759 reason = string_compose (_("a port with the name \"%1\" already exists: check for duplicated track/bus names"), portname);
761 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);
764 throw PortRegistrationFailure (string_compose (_("AudioEngine: cannot register port \"%1\": %2"), portname, reason).c_str());
767 boost::shared_ptr<Port>
768 AudioEngine::register_port (DataType dtype, const string& portname, bool input)
770 boost::shared_ptr<Port> newport;
773 if (dtype == DataType::AUDIO) {
774 newport.reset (new AudioPort (portname, (input ? Port::IsInput : Port::IsOutput)));
775 } else if (dtype == DataType::MIDI) {
776 newport.reset (new MidiPort (portname, (input ? Port::IsInput : Port::IsOutput)));
778 throw PortRegistrationFailure("unable to create port (unknown type)");
781 RCUWriter<Ports> writer (ports);
782 boost::shared_ptr<Ports> ps = writer.get_copy ();
783 ps->insert (ps->begin(), newport);
785 /* writer goes out of scope, forces update */
790 catch (PortRegistrationFailure& err) {
792 } catch (std::exception& e) {
793 throw PortRegistrationFailure(string_compose(
794 _("unable to create port: %1"), e.what()).c_str());
796 throw PortRegistrationFailure("unable to create port (unknown error)");
800 boost::shared_ptr<Port>
801 AudioEngine::register_input_port (DataType type, const string& portname)
803 return register_port (type, portname, true);
806 boost::shared_ptr<Port>
807 AudioEngine::register_output_port (DataType type, const string& portname)
809 return register_port (type, portname, false);
813 AudioEngine::unregister_port (boost::shared_ptr<Port> port)
815 /* caller must hold process lock */
818 /* probably happening when the engine has been halted by JACK,
819 in which case, there is nothing we can do here.
825 RCUWriter<Ports> writer (ports);
826 boost::shared_ptr<Ports> ps = writer.get_copy ();
829 /* writer goes out of scope, forces update */
838 AudioEngine::connect (const string& source, const string& destination)
844 fatal << _("connect called before engine was started") << endmsg;
851 string s = make_port_name_non_relative (source);
852 string d = make_port_name_non_relative (destination);
855 boost::shared_ptr<Port> src = get_port_by_name (s);
856 boost::shared_ptr<Port> dst = get_port_by_name (d);
859 ret = src->connect (d);
861 ret = dst->connect (s);
863 /* neither port is known to us, and this API isn't intended for use as a general patch bay */
868 /* already exists - no error, no warning */
869 } else if (ret < 0) {
870 error << string_compose(_("AudioEngine: cannot connect %1 (%2) to %3 (%4)"),
871 source, s, destination, d)
879 AudioEngine::disconnect (const string& source, const string& destination)
885 fatal << _("disconnect called before engine was started") << endmsg;
892 string s = make_port_name_non_relative (source);
893 string d = make_port_name_non_relative (destination);
895 boost::shared_ptr<Port> src = get_port_by_name (s);
896 boost::shared_ptr<Port> dst = get_port_by_name (d);
899 ret = src->disconnect (d);
901 ret = dst->disconnect (s);
903 /* neither port is known to us, and this API isn't intended for use as a general patch bay */
910 AudioEngine::disconnect (boost::shared_ptr<Port> port)
912 GET_PRIVATE_JACK_POINTER_RET (_jack,-1);
916 fatal << _("disconnect called before engine was started") << endmsg;
923 return port->disconnect_all ();
927 AudioEngine::frame_rate () const
929 GET_PRIVATE_JACK_POINTER_RET (_jack, 0);
930 if (_frame_rate == 0) {
931 return (_frame_rate = jack_get_sample_rate (_priv_jack));
938 AudioEngine::raw_buffer_size (DataType t)
940 std::map<DataType,size_t>::const_iterator s = _raw_buffer_sizes.find(t);
941 return (s != _raw_buffer_sizes.end()) ? s->second : 0;
945 AudioEngine::frames_per_cycle () const
947 GET_PRIVATE_JACK_POINTER_RET (_jack,0);
948 if (_buffer_size == 0) {
949 return jack_get_buffer_size (_jack);
955 /** @param name Full or short name of port
956 * @return Corresponding Port or 0.
959 boost::shared_ptr<Port>
960 AudioEngine::get_port_by_name (const string& portname)
964 fatal << _("get_port_by_name() called before engine was started") << endmsg;
967 boost::shared_ptr<Port> ();
971 if (!port_is_mine (portname)) {
972 /* not an ardour port */
973 return boost::shared_ptr<Port> ();
976 std::string const rel = make_port_name_relative (portname);
978 boost::shared_ptr<Ports> pr = ports.reader();
980 for (Ports::iterator i = pr->begin(); i != pr->end(); ++i) {
981 if (rel == (*i)->name()) {
986 return boost::shared_ptr<Port> ();
990 AudioEngine::get_ports (const string& port_name_pattern, const string& type_name_pattern, uint32_t flags)
992 GET_PRIVATE_JACK_POINTER_RET (_jack,0);
995 fatal << _("get_ports called before engine was started") << endmsg;
1001 return jack_get_ports (_priv_jack, port_name_pattern.c_str(), type_name_pattern.c_str(), flags);
1005 AudioEngine::halted_info (jack_status_t code, const char* reason, void *arg)
1007 /* called from jack shutdown handler */
1009 AudioEngine* ae = static_cast<AudioEngine *> (arg);
1010 bool was_running = ae->_running;
1012 ae->stop_metering_thread ();
1014 ae->_running = false;
1015 ae->_buffer_size = 0;
1016 ae->_frame_rate = 0;
1020 #ifdef HAVE_JACK_ON_INFO_SHUTDOWN
1022 case JackBackendError:
1023 ae->Halted(reason); /* EMIT SIGNAL */
1026 ae->Halted(""); /* EMIT SIGNAL */
1029 ae->Halted(""); /* EMIT SIGNAL */
1035 AudioEngine::halted (void *arg)
1037 cerr << "HALTED by JACK\n";
1039 /* called from jack shutdown handler */
1041 AudioEngine* ae = static_cast<AudioEngine *> (arg);
1042 bool was_running = ae->_running;
1044 ae->stop_metering_thread ();
1046 ae->_running = false;
1047 ae->_buffer_size = 0;
1048 ae->_frame_rate = 0;
1052 ae->Halted(""); /* EMIT SIGNAL */
1053 MIDI::Port::JackHalted (); /* EMIT SIGNAL */
1058 AudioEngine::died ()
1060 /* called from a signal handler for SIGPIPE */
1062 stop_metering_thread ();
1071 AudioEngine::can_request_hardware_monitoring ()
1073 GET_PRIVATE_JACK_POINTER_RET (_jack,false);
1074 const char ** ports;
1076 if ((ports = jack_get_ports (_priv_jack, NULL, JACK_DEFAULT_AUDIO_TYPE, JackPortCanMonitor)) == 0) {
1086 AudioEngine::n_physical (unsigned long flags) const
1090 GET_PRIVATE_JACK_POINTER_RET (_jack, c);
1092 const char ** ports = jack_get_ports (_priv_jack, NULL, NULL, JackPortIsPhysical | flags);
1097 for (uint32_t i = 0; ports[i]; ++i) {
1098 if (!strstr (ports[i], "Midi-Through")) {
1099 DataType t (jack_port_type (jack_port_by_name (_jack, ports[i])));
1100 c.set (t, c.get (t) + 1);
1110 AudioEngine::n_physical_inputs () const
1112 return n_physical (JackPortIsInput);
1116 AudioEngine::n_physical_outputs () const
1118 return n_physical (JackPortIsOutput);
1122 AudioEngine::get_physical (DataType type, unsigned long flags, vector<string>& phy)
1124 GET_PRIVATE_JACK_POINTER (_jack);
1125 const char ** ports;
1127 if ((ports = jack_get_ports (_priv_jack, NULL, type.to_jack_type(), JackPortIsPhysical | flags)) == 0) {
1132 for (uint32_t i = 0; ports[i]; ++i) {
1133 if (strstr (ports[i], "Midi-Through")) {
1136 phy.push_back (ports[i]);
1142 /** Get physical ports for which JackPortIsOutput is set; ie those that correspond to
1143 * a physical input connector.
1146 AudioEngine::get_physical_inputs (DataType type, vector<string>& ins)
1148 get_physical (type, JackPortIsOutput, ins);
1151 /** Get physical ports for which JackPortIsInput is set; ie those that correspond to
1152 * a physical output connector.
1155 AudioEngine::get_physical_outputs (DataType type, vector<string>& outs)
1157 get_physical (type, JackPortIsInput, outs);
1161 AudioEngine::transport_stop ()
1163 GET_PRIVATE_JACK_POINTER (_jack);
1164 jack_transport_stop (_priv_jack);
1168 AudioEngine::transport_start ()
1170 GET_PRIVATE_JACK_POINTER (_jack);
1171 jack_transport_start (_priv_jack);
1175 AudioEngine::transport_locate (framepos_t where)
1177 GET_PRIVATE_JACK_POINTER (_jack);
1178 jack_transport_locate (_priv_jack, where);
1181 AudioEngine::TransportState
1182 AudioEngine::transport_state ()
1184 GET_PRIVATE_JACK_POINTER_RET (_jack, ((TransportState) JackTransportStopped));
1185 jack_position_t pos;
1186 return (TransportState) jack_transport_query (_priv_jack, &pos);
1190 AudioEngine::reset_timebase ()
1192 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
1194 if (_session->config.get_jack_time_master()) {
1195 return jack_set_timebase_callback (_priv_jack, 0, _jack_timebase_callback, this);
1197 return jack_release_timebase (_jack);
1204 AudioEngine::freewheel (bool onoff)
1206 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
1208 if (onoff != _freewheeling) {
1209 return jack_set_freewheel (_priv_jack, onoff);
1212 /* already doing what has been asked for */
1218 AudioEngine::remove_all_ports ()
1220 /* make sure that JACK callbacks that will be invoked as we cleanup
1221 * ports know that they have nothing to do.
1224 port_remove_in_progress = true;
1226 /* process lock MUST be held by caller
1230 RCUWriter<Ports> writer (ports);
1231 boost::shared_ptr<Ports> ps = writer.get_copy ();
1235 /* clear dead wood list in RCU */
1239 port_remove_in_progress = false;
1243 AudioEngine::connect_to_jack (string client_name, string session_uuid)
1245 EnvironmentalProtectionAgency* global_epa = EnvironmentalProtectionAgency::get_global_epa ();
1246 boost::scoped_ptr<EnvironmentalProtectionAgency> current_epa;
1247 jack_options_t options = JackNullOption;
1248 jack_status_t status;
1249 const char *server_name = NULL;
1251 /* revert all environment settings back to whatever they were when ardour started
1255 current_epa.reset (new EnvironmentalProtectionAgency(true)); /* will restore settings when we leave scope */
1256 global_epa->restore ();
1259 jack_client_name = client_name; /* might be reset below */
1260 #ifdef HAVE_JACK_SESSION
1261 if (! session_uuid.empty())
1262 _jack = jack_client_open (jack_client_name.c_str(), JackSessionID, &status, session_uuid.c_str());
1265 _jack = jack_client_open (jack_client_name.c_str(), options, &status, server_name);
1267 if (_jack == NULL) {
1268 // error message is not useful here
1272 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
1274 if (status & JackNameNotUnique) {
1275 jack_client_name = jack_get_client_name (_priv_jack);
1282 AudioEngine::disconnect_from_jack ()
1284 GET_PRIVATE_JACK_POINTER_RET (_jack, 0);
1287 stop_metering_thread ();
1291 Glib::Mutex::Lock lm (_process_lock);
1292 jack_client_close (_priv_jack);
1298 _raw_buffer_sizes.clear();
1302 Stopped(); /* EMIT SIGNAL */
1303 MIDI::Port::JackHalted (); /* EMIT SIGNAL */
1310 AudioEngine::reconnect_to_jack ()
1313 disconnect_from_jack ();
1314 /* XXX give jackd a chance */
1315 Glib::usleep (250000);
1318 if (connect_to_jack (jack_client_name, "")) {
1319 error << _("failed to connect to JACK") << endmsg;
1325 boost::shared_ptr<Ports> p = ports.reader ();
1327 for (i = p->begin(); i != p->end(); ++i) {
1328 if ((*i)->reestablish ()) {
1333 if (i != p->end()) {
1335 remove_all_ports ();
1339 GET_PRIVATE_JACK_POINTER_RET (_jack,-1);
1341 MIDI::Manager::instance()->reestablish (_priv_jack);
1344 _session->reset_jack_connection (_priv_jack);
1345 jack_bufsize_callback (jack_get_buffer_size (_priv_jack));
1346 _session->set_frame_rate (jack_get_sample_rate (_priv_jack));
1349 last_monitor_check = 0;
1351 set_jack_callbacks ();
1353 if (jack_activate (_priv_jack) == 0) {
1360 /* re-establish connections */
1362 for (i = p->begin(); i != p->end(); ++i) {
1366 MIDI::Manager::instance()->reconnect ();
1368 Running (); /* EMIT SIGNAL*/
1370 start_metering_thread ();
1376 AudioEngine::request_buffer_size (pframes_t nframes)
1378 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
1380 if (nframes == jack_get_buffer_size (_priv_jack)) {
1384 return jack_set_buffer_size (_priv_jack, nframes);
1388 AudioEngine::make_port_name_relative (string portname) const
1390 string::size_type len;
1391 string::size_type n;
1393 len = portname.length();
1395 for (n = 0; n < len; ++n) {
1396 if (portname[n] == ':') {
1401 if ((n != len) && (portname.substr (0, n) == jack_client_name)) {
1402 return portname.substr (n+1);
1409 AudioEngine::make_port_name_non_relative (string portname) const
1413 if (portname.find_first_of (':') != string::npos) {
1417 str = jack_client_name;
1425 AudioEngine::port_is_mine (const string& portname) const
1427 if (portname.find_first_of (':') != string::npos) {
1428 if (portname.substr (0, jack_client_name.length ()) != jack_client_name) {
1436 AudioEngine::is_realtime () const
1438 GET_PRIVATE_JACK_POINTER_RET (_jack,false);
1439 return jack_is_realtime (_priv_jack);
1443 AudioEngine::create_process_thread (boost::function<void()> f, pthread_t* thread, size_t stacksize)
1445 GET_PRIVATE_JACK_POINTER_RET (_jack, 0);
1446 ThreadData* td = new ThreadData (this, f, stacksize);
1448 if (jack_client_create_thread (_priv_jack, thread, jack_client_real_time_priority (_priv_jack),
1449 jack_is_realtime (_priv_jack), _start_process_thread, td)) {
1457 AudioEngine::_start_process_thread (void* arg)
1459 ThreadData* td = reinterpret_cast<ThreadData*> (arg);
1460 boost::function<void()> f = td->f;
1469 AudioEngine::port_is_physical (const std::string& portname) const
1471 GET_PRIVATE_JACK_POINTER_RET(_jack, false);
1473 jack_port_t *port = jack_port_by_name (_priv_jack, portname.c_str());
1479 return jack_port_flags (port) & JackPortIsPhysical;
1483 AudioEngine::request_jack_monitors_input (const std::string& portname, bool yn) const
1485 GET_PRIVATE_JACK_POINTER(_jack);
1487 jack_port_t *port = jack_port_by_name (_priv_jack, portname.c_str());
1493 jack_port_request_monitor (port, yn);
1497 AudioEngine::update_latencies ()
1499 if (jack_recompute_total_latencies) {
1500 GET_PRIVATE_JACK_POINTER (_jack);
1501 jack_recompute_total_latencies (_priv_jack);
1506 AudioEngine::destroy ()