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 Glib::Mutex::Lock tm (_process_lock, Glib::TRY_LOCK);
454 /// The number of frames that will have been processed when we've finished
455 pframes_t next_processed_frames;
457 /* handle wrap around of total frames counter */
459 if (max_framepos - _processed_frames < nframes) {
460 next_processed_frames = nframes - (max_framepos - _processed_frames);
462 next_processed_frames = _processed_frames + nframes;
465 if (!tm.locked() || _session == 0) {
466 /* return having done nothing */
467 _processed_frames = next_processed_frames;
471 if (session_remove_pending) {
472 /* perform the actual session removal */
474 session_remove_pending = false;
475 session_removed.signal();
476 _processed_frames = next_processed_frames;
480 /* tell all relevant objects that we're starting a new cycle */
482 Delivery::CycleStart (nframes);
483 Port::set_global_port_buffer_offset (0);
484 Port::set_cycle_framecnt (nframes);
486 /* tell all Ports that we're starting a new cycle */
488 boost::shared_ptr<Ports> p = ports.reader();
490 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
491 (*i)->cycle_start (nframes);
494 /* test if we are freewheeling and there are freewheel signals connected.
495 ardour should act normally even when freewheeling unless /it/ is exporting */
498 if (_freewheeling && !Freewheel.empty()) {
499 /* emit the Freewheel signal and stop freewheeling in the event of trouble
501 boost::optional<int> r = Freewheel (nframes);
502 if (r.get_value_or (0)) {
503 jack_set_freewheel (_priv_jack, false);
508 _session->process (nframes);
517 _processed_frames = next_processed_frames;
521 if (last_monitor_check + monitor_check_interval < next_processed_frames) {
523 boost::shared_ptr<Ports> p = ports.reader();
525 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
529 if ((*i)->last_monitor() != (x = (*i)->jack_monitoring_input ())) {
530 (*i)->set_last_monitor (x);
531 /* XXX I think this is dangerous, due to
532 a likely mutex in the signal handlers ...
534 (*i)->MonitorInputChanged (x); /* EMIT SIGNAL */
537 last_monitor_check = next_processed_frames;
540 if (_session->silent()) {
542 boost::shared_ptr<Ports> p = ports.reader();
544 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
546 if ((*i)->sends_output()) {
547 (*i)->get_buffer(nframes).silence(nframes);
554 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
555 (*i)->cycle_end (nframes);
558 _processed_frames = next_processed_frames;
566 AudioEngine::_sample_rate_callback (pframes_t nframes, void *arg)
568 return static_cast<AudioEngine *> (arg)->jack_sample_rate_callback (nframes);
572 AudioEngine::jack_sample_rate_callback (pframes_t nframes)
574 _frame_rate = nframes;
575 _usecs_per_cycle = (int) floor ((((double) frames_per_cycle() / nframes)) * 1000000.0);
577 /* check for monitor input change every 1/10th of second */
579 monitor_check_interval = nframes / 10;
580 last_monitor_check = 0;
583 _session->set_frame_rate (nframes);
586 SampleRateChanged (nframes); /* EMIT SIGNAL */
592 AudioEngine::jack_latency_callback (jack_latency_callback_mode_t mode)
595 _session->update_latency (mode == JackPlaybackLatency);
600 AudioEngine::_bufsize_callback (pframes_t nframes, void *arg)
602 return static_cast<AudioEngine *> (arg)->jack_bufsize_callback (nframes);
606 AudioEngine::jack_bufsize_callback (pframes_t nframes)
608 /* if the size has not changed, this should be a no-op */
610 if (nframes == _buffer_size) {
614 GET_PRIVATE_JACK_POINTER_RET (_jack, 1);
616 _buffer_size = nframes;
617 _usecs_per_cycle = (int) floor ((((double) nframes / frame_rate())) * 1000000.0);
618 last_monitor_check = 0;
620 if (jack_port_type_get_buffer_size) {
621 _raw_buffer_sizes[DataType::AUDIO] = jack_port_type_get_buffer_size (_priv_jack, JACK_DEFAULT_AUDIO_TYPE);
622 _raw_buffer_sizes[DataType::MIDI] = jack_port_type_get_buffer_size (_priv_jack, JACK_DEFAULT_MIDI_TYPE);
625 /* Old version of JACK.
627 These crude guesses, see below where we try to get the right answers.
629 Note that our guess for MIDI deliberatey tries to overestimate
630 by a little. It would be nicer if we could get the actual
631 size from a port, but we have to use this estimate in the
632 event that there are no MIDI ports currently. If there are
633 the value will be adjusted below.
636 _raw_buffer_sizes[DataType::AUDIO] = nframes * sizeof (Sample);
637 _raw_buffer_sizes[DataType::MIDI] = nframes * 4 - (nframes/2);
641 Glib::Mutex::Lock lm (_process_lock);
643 boost::shared_ptr<Ports> p = ports.reader();
645 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
651 _session->set_block_size (_buffer_size);
658 AudioEngine::stop_metering_thread ()
660 if (m_meter_thread) {
661 g_atomic_int_set (&m_meter_exit, 1);
662 m_meter_thread->join ();
668 AudioEngine::start_metering_thread ()
670 if (m_meter_thread == 0) {
671 g_atomic_int_set (&m_meter_exit, 0);
672 m_meter_thread = Glib::Thread::create (boost::bind (&AudioEngine::meter_thread, this),
673 500000, true, true, Glib::THREAD_PRIORITY_NORMAL);
678 AudioEngine::meter_thread ()
680 pthread_set_name (X_("meter"));
683 Glib::usleep (10000); /* 1/100th sec interval */
684 if (g_atomic_int_get(&m_meter_exit)) {
692 AudioEngine::set_session (Session *s)
694 Glib::Mutex::Lock pl (_process_lock);
696 SessionHandlePtr::set_session (s);
700 start_metering_thread ();
702 pframes_t blocksize = jack_get_buffer_size (_jack);
704 /* page in as much of the session process code as we
705 can before we really start running.
708 boost::shared_ptr<Ports> p = ports.reader();
710 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
711 (*i)->cycle_start (blocksize);
714 _session->process (blocksize);
715 _session->process (blocksize);
716 _session->process (blocksize);
717 _session->process (blocksize);
718 _session->process (blocksize);
719 _session->process (blocksize);
720 _session->process (blocksize);
721 _session->process (blocksize);
723 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
724 (*i)->cycle_end (blocksize);
730 AudioEngine::remove_session ()
732 Glib::Mutex::Lock lm (_process_lock);
736 stop_metering_thread ();
739 session_remove_pending = true;
740 session_removed.wait(_process_lock);
744 SessionHandlePtr::set_session (0);
751 AudioEngine::port_registration_failure (const std::string& portname)
753 GET_PRIVATE_JACK_POINTER (_jack);
754 string full_portname = jack_client_name;
755 full_portname += ':';
756 full_portname += portname;
759 jack_port_t* p = jack_port_by_name (_priv_jack, full_portname.c_str());
763 reason = string_compose (_("a port with the name \"%1\" already exists: check for duplicated track/bus names"), portname);
765 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);
768 throw PortRegistrationFailure (string_compose (_("AudioEngine: cannot register port \"%1\": %2"), portname, reason).c_str());
771 boost::shared_ptr<Port>
772 AudioEngine::register_port (DataType dtype, const string& portname, bool input)
774 boost::shared_ptr<Port> newport;
777 if (dtype == DataType::AUDIO) {
778 newport.reset (new AudioPort (portname, (input ? Port::IsInput : Port::IsOutput)));
779 } else if (dtype == DataType::MIDI) {
780 newport.reset (new MidiPort (portname, (input ? Port::IsInput : Port::IsOutput)));
782 throw PortRegistrationFailure("unable to create port (unknown type)");
785 RCUWriter<Ports> writer (ports);
786 boost::shared_ptr<Ports> ps = writer.get_copy ();
787 ps->insert (ps->begin(), newport);
789 /* writer goes out of scope, forces update */
794 catch (PortRegistrationFailure& err) {
796 } catch (std::exception& e) {
797 throw PortRegistrationFailure(string_compose(
798 _("unable to create port: %1"), e.what()).c_str());
800 throw PortRegistrationFailure("unable to create port (unknown error)");
804 boost::shared_ptr<Port>
805 AudioEngine::register_input_port (DataType type, const string& portname)
807 return register_port (type, portname, true);
810 boost::shared_ptr<Port>
811 AudioEngine::register_output_port (DataType type, const string& portname)
813 return register_port (type, portname, false);
817 AudioEngine::unregister_port (boost::shared_ptr<Port> port)
819 /* caller must hold process lock */
822 /* probably happening when the engine has been halted by JACK,
823 in which case, there is nothing we can do here.
829 RCUWriter<Ports> writer (ports);
830 boost::shared_ptr<Ports> ps = writer.get_copy ();
833 /* writer goes out of scope, forces update */
842 AudioEngine::connect (const string& source, const string& destination)
848 fatal << _("connect called before engine was started") << endmsg;
855 string s = make_port_name_non_relative (source);
856 string d = make_port_name_non_relative (destination);
859 boost::shared_ptr<Port> src = get_port_by_name (s);
860 boost::shared_ptr<Port> dst = get_port_by_name (d);
863 ret = src->connect (d);
865 ret = dst->connect (s);
867 /* neither port is known to us, and this API isn't intended for use as a general patch bay */
872 /* already exists - no error, no warning */
873 } else if (ret < 0) {
874 error << string_compose(_("AudioEngine: cannot connect %1 (%2) to %3 (%4)"),
875 source, s, destination, d)
883 AudioEngine::disconnect (const string& source, const string& destination)
889 fatal << _("disconnect called before engine was started") << endmsg;
896 string s = make_port_name_non_relative (source);
897 string d = make_port_name_non_relative (destination);
899 boost::shared_ptr<Port> src = get_port_by_name (s);
900 boost::shared_ptr<Port> dst = get_port_by_name (d);
903 ret = src->disconnect (d);
905 ret = dst->disconnect (s);
907 /* neither port is known to us, and this API isn't intended for use as a general patch bay */
914 AudioEngine::disconnect (boost::shared_ptr<Port> port)
916 GET_PRIVATE_JACK_POINTER_RET (_jack,-1);
920 fatal << _("disconnect called before engine was started") << endmsg;
927 return port->disconnect_all ();
931 AudioEngine::frame_rate () const
933 GET_PRIVATE_JACK_POINTER_RET (_jack, 0);
934 if (_frame_rate == 0) {
935 return (_frame_rate = jack_get_sample_rate (_priv_jack));
942 AudioEngine::raw_buffer_size (DataType t)
944 std::map<DataType,size_t>::const_iterator s = _raw_buffer_sizes.find(t);
945 return (s != _raw_buffer_sizes.end()) ? s->second : 0;
949 AudioEngine::frames_per_cycle () const
951 GET_PRIVATE_JACK_POINTER_RET (_jack,0);
952 if (_buffer_size == 0) {
953 return jack_get_buffer_size (_jack);
959 /** @param name Full or short name of port
960 * @return Corresponding Port or 0.
963 boost::shared_ptr<Port>
964 AudioEngine::get_port_by_name (const string& portname)
968 fatal << _("get_port_by_name() called before engine was started") << endmsg;
971 boost::shared_ptr<Port> ();
975 if (!port_is_mine (portname)) {
976 /* not an ardour port */
977 return boost::shared_ptr<Port> ();
980 std::string const rel = make_port_name_relative (portname);
982 boost::shared_ptr<Ports> pr = ports.reader();
984 for (Ports::iterator i = pr->begin(); i != pr->end(); ++i) {
985 if (rel == (*i)->name()) {
990 return boost::shared_ptr<Port> ();
994 AudioEngine::get_ports (const string& port_name_pattern, const string& type_name_pattern, uint32_t flags)
996 GET_PRIVATE_JACK_POINTER_RET (_jack,0);
999 fatal << _("get_ports called before engine was started") << endmsg;
1005 return jack_get_ports (_priv_jack, port_name_pattern.c_str(), type_name_pattern.c_str(), flags);
1009 AudioEngine::halted_info (jack_status_t code, const char* reason, void *arg)
1011 /* called from jack shutdown handler */
1013 AudioEngine* ae = static_cast<AudioEngine *> (arg);
1014 bool was_running = ae->_running;
1016 ae->stop_metering_thread ();
1018 ae->_running = false;
1019 ae->_buffer_size = 0;
1020 ae->_frame_rate = 0;
1024 #ifdef HAVE_JACK_ON_INFO_SHUTDOWN
1026 case JackBackendError:
1027 ae->Halted(reason); /* EMIT SIGNAL */
1030 ae->Halted(""); /* EMIT SIGNAL */
1033 ae->Halted(""); /* EMIT SIGNAL */
1039 AudioEngine::halted (void *arg)
1041 cerr << "HALTED by JACK\n";
1043 /* called from jack shutdown handler */
1045 AudioEngine* ae = static_cast<AudioEngine *> (arg);
1046 bool was_running = ae->_running;
1048 ae->stop_metering_thread ();
1050 ae->_running = false;
1051 ae->_buffer_size = 0;
1052 ae->_frame_rate = 0;
1056 ae->Halted(""); /* EMIT SIGNAL */
1057 MIDI::Port::JackHalted (); /* EMIT SIGNAL */
1062 AudioEngine::died ()
1064 /* called from a signal handler for SIGPIPE */
1066 stop_metering_thread ();
1075 AudioEngine::can_request_hardware_monitoring ()
1077 GET_PRIVATE_JACK_POINTER_RET (_jack,false);
1078 const char ** ports;
1080 if ((ports = jack_get_ports (_priv_jack, NULL, JACK_DEFAULT_AUDIO_TYPE, JackPortCanMonitor)) == 0) {
1090 AudioEngine::n_physical (unsigned long flags) const
1094 GET_PRIVATE_JACK_POINTER_RET (_jack, c);
1096 const char ** ports = jack_get_ports (_priv_jack, NULL, NULL, JackPortIsPhysical | flags);
1101 for (uint32_t i = 0; ports[i]; ++i) {
1102 if (!strstr (ports[i], "Midi-Through")) {
1103 DataType t (jack_port_type (jack_port_by_name (_jack, ports[i])));
1104 c.set (t, c.get (t) + 1);
1114 AudioEngine::n_physical_inputs () const
1116 return n_physical (JackPortIsInput);
1120 AudioEngine::n_physical_outputs () const
1122 return n_physical (JackPortIsOutput);
1126 AudioEngine::get_physical (DataType type, unsigned long flags, vector<string>& phy)
1128 GET_PRIVATE_JACK_POINTER (_jack);
1129 const char ** ports;
1131 if ((ports = jack_get_ports (_priv_jack, NULL, type.to_jack_type(), JackPortIsPhysical | flags)) == 0) {
1136 for (uint32_t i = 0; ports[i]; ++i) {
1137 if (strstr (ports[i], "Midi-Through")) {
1140 phy.push_back (ports[i]);
1146 /** Get physical ports for which JackPortIsOutput is set; ie those that correspond to
1147 * a physical input connector.
1150 AudioEngine::get_physical_inputs (DataType type, vector<string>& ins)
1152 get_physical (type, JackPortIsOutput, ins);
1155 /** Get physical ports for which JackPortIsInput is set; ie those that correspond to
1156 * a physical output connector.
1159 AudioEngine::get_physical_outputs (DataType type, vector<string>& outs)
1161 get_physical (type, JackPortIsInput, outs);
1165 AudioEngine::transport_stop ()
1167 GET_PRIVATE_JACK_POINTER (_jack);
1168 jack_transport_stop (_priv_jack);
1172 AudioEngine::transport_start ()
1174 GET_PRIVATE_JACK_POINTER (_jack);
1175 jack_transport_start (_priv_jack);
1179 AudioEngine::transport_locate (framepos_t where)
1181 GET_PRIVATE_JACK_POINTER (_jack);
1182 jack_transport_locate (_priv_jack, where);
1185 AudioEngine::TransportState
1186 AudioEngine::transport_state ()
1188 GET_PRIVATE_JACK_POINTER_RET (_jack, ((TransportState) JackTransportStopped));
1189 jack_position_t pos;
1190 return (TransportState) jack_transport_query (_priv_jack, &pos);
1194 AudioEngine::reset_timebase ()
1196 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
1198 if (_session->config.get_jack_time_master()) {
1199 return jack_set_timebase_callback (_priv_jack, 0, _jack_timebase_callback, this);
1201 return jack_release_timebase (_jack);
1208 AudioEngine::freewheel (bool onoff)
1210 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
1212 if (onoff != _freewheeling) {
1213 return jack_set_freewheel (_priv_jack, onoff);
1216 /* already doing what has been asked for */
1222 AudioEngine::remove_all_ports ()
1224 /* make sure that JACK callbacks that will be invoked as we cleanup
1225 * ports know that they have nothing to do.
1228 port_remove_in_progress = true;
1230 /* process lock MUST be held by caller
1234 RCUWriter<Ports> writer (ports);
1235 boost::shared_ptr<Ports> ps = writer.get_copy ();
1239 /* clear dead wood list in RCU */
1243 port_remove_in_progress = false;
1247 AudioEngine::connect_to_jack (string client_name, string session_uuid)
1249 EnvironmentalProtectionAgency* global_epa = EnvironmentalProtectionAgency::get_global_epa ();
1250 boost::scoped_ptr<EnvironmentalProtectionAgency> current_epa;
1251 jack_options_t options = JackNullOption;
1252 jack_status_t status;
1253 const char *server_name = NULL;
1255 /* revert all environment settings back to whatever they were when ardour started
1259 current_epa.reset (new EnvironmentalProtectionAgency(true)); /* will restore settings when we leave scope */
1260 global_epa->restore ();
1263 jack_client_name = client_name; /* might be reset below */
1264 #ifdef HAVE_JACK_SESSION
1265 if (! session_uuid.empty())
1266 _jack = jack_client_open (jack_client_name.c_str(), JackSessionID, &status, session_uuid.c_str());
1269 _jack = jack_client_open (jack_client_name.c_str(), options, &status, server_name);
1271 if (_jack == NULL) {
1272 // error message is not useful here
1276 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
1278 if (status & JackNameNotUnique) {
1279 jack_client_name = jack_get_client_name (_priv_jack);
1286 AudioEngine::disconnect_from_jack ()
1288 GET_PRIVATE_JACK_POINTER_RET (_jack, 0);
1291 stop_metering_thread ();
1295 Glib::Mutex::Lock lm (_process_lock);
1296 jack_client_close (_priv_jack);
1302 _raw_buffer_sizes.clear();
1306 Stopped(); /* EMIT SIGNAL */
1307 MIDI::Port::JackHalted (); /* EMIT SIGNAL */
1314 AudioEngine::reconnect_to_jack ()
1317 disconnect_from_jack ();
1318 /* XXX give jackd a chance */
1319 Glib::usleep (250000);
1322 if (connect_to_jack (jack_client_name, "")) {
1323 error << _("failed to connect to JACK") << endmsg;
1329 boost::shared_ptr<Ports> p = ports.reader ();
1331 for (i = p->begin(); i != p->end(); ++i) {
1332 if ((*i)->reestablish ()) {
1337 if (i != p->end()) {
1339 remove_all_ports ();
1343 GET_PRIVATE_JACK_POINTER_RET (_jack,-1);
1345 MIDI::Manager::instance()->reestablish (_priv_jack);
1348 _session->reset_jack_connection (_priv_jack);
1349 jack_bufsize_callback (jack_get_buffer_size (_priv_jack));
1350 _session->set_frame_rate (jack_get_sample_rate (_priv_jack));
1353 last_monitor_check = 0;
1355 set_jack_callbacks ();
1357 if (jack_activate (_priv_jack) == 0) {
1364 /* re-establish connections */
1366 for (i = p->begin(); i != p->end(); ++i) {
1370 MIDI::Manager::instance()->reconnect ();
1372 Running (); /* EMIT SIGNAL*/
1374 start_metering_thread ();
1380 AudioEngine::request_buffer_size (pframes_t nframes)
1382 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
1384 if (nframes == jack_get_buffer_size (_priv_jack)) {
1388 return jack_set_buffer_size (_priv_jack, nframes);
1392 AudioEngine::make_port_name_relative (string portname) const
1394 string::size_type len;
1395 string::size_type n;
1397 len = portname.length();
1399 for (n = 0; n < len; ++n) {
1400 if (portname[n] == ':') {
1405 if ((n != len) && (portname.substr (0, n) == jack_client_name)) {
1406 return portname.substr (n+1);
1413 AudioEngine::make_port_name_non_relative (string portname) const
1417 if (portname.find_first_of (':') != string::npos) {
1421 str = jack_client_name;
1429 AudioEngine::port_is_mine (const string& portname) const
1431 if (portname.find_first_of (':') != string::npos) {
1432 if (portname.substr (0, jack_client_name.length ()) != jack_client_name) {
1440 AudioEngine::is_realtime () const
1442 GET_PRIVATE_JACK_POINTER_RET (_jack,false);
1443 return jack_is_realtime (_priv_jack);
1447 AudioEngine::create_process_thread (boost::function<void()> f, pthread_t* thread, size_t stacksize)
1449 GET_PRIVATE_JACK_POINTER_RET (_jack, 0);
1450 ThreadData* td = new ThreadData (this, f, stacksize);
1452 if (jack_client_create_thread (_priv_jack, thread, jack_client_real_time_priority (_priv_jack),
1453 jack_is_realtime (_priv_jack), _start_process_thread, td)) {
1461 AudioEngine::_start_process_thread (void* arg)
1463 ThreadData* td = reinterpret_cast<ThreadData*> (arg);
1464 boost::function<void()> f = td->f;
1473 AudioEngine::port_is_physical (const std::string& portname) const
1475 GET_PRIVATE_JACK_POINTER_RET(_jack, false);
1477 jack_port_t *port = jack_port_by_name (_priv_jack, portname.c_str());
1483 return jack_port_flags (port) & JackPortIsPhysical;
1487 AudioEngine::request_jack_monitors_input (const std::string& portname, bool yn) const
1489 GET_PRIVATE_JACK_POINTER(_jack);
1491 jack_port_t *port = jack_port_by_name (_priv_jack, portname.c_str());
1497 jack_port_request_monitor (port, yn);
1501 AudioEngine::update_latencies ()
1503 if (jack_recompute_total_latencies) {
1504 GET_PRIVATE_JACK_POINTER (_jack);
1505 jack_recompute_total_latencies (_priv_jack);
1510 AudioEngine::destroy ()