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>
28 #include <jack/weakjack.h>
29 #include <jack/jack.h>
30 #include <jack/thread.h>
32 #include "pbd/pthread_utils.h"
33 #include "pbd/stacktrace.h"
34 #include "pbd/unknown_type.h"
37 #include "midi++/port.h"
38 #include "midi++/mmc.h"
39 #include "midi++/manager.h"
41 #include "ardour/amp.h"
42 #include "ardour/audio_port.h"
43 #include "ardour/audioengine.h"
44 #include "ardour/buffer.h"
45 #include "ardour/buffer_set.h"
46 #include "ardour/cycle_timer.h"
47 #include "ardour/delivery.h"
48 #include "ardour/event_type_map.h"
49 #include "ardour/internal_return.h"
50 #include "ardour/io.h"
51 #include "ardour/meter.h"
52 #include "ardour/midi_port.h"
53 #include "ardour/process_thread.h"
54 #include "ardour/port.h"
55 #include "ardour/port_set.h"
56 #include "ardour/session.h"
57 #include "ardour/timestamps.h"
58 #include "ardour/utils.h"
63 using namespace ARDOUR;
66 gint AudioEngine::m_meter_exit;
67 AudioEngine* AudioEngine::_instance = 0;
69 #define GET_PRIVATE_JACK_POINTER(j) jack_client_t* _priv_jack = (jack_client_t*) (j); if (!_priv_jack) { return; }
70 #define GET_PRIVATE_JACK_POINTER_RET(j,r) jack_client_t* _priv_jack = (jack_client_t*) (j); if (!_priv_jack) { return r; }
72 AudioEngine::AudioEngine (string client_name, string session_uuid)
75 _instance = this; /* singleton */
77 session_remove_pending = false;
80 last_monitor_check = 0;
81 monitor_check_interval = INT32_MAX;
82 _processed_frames = 0;
87 _freewheeling = false;
89 port_remove_in_progress = false;
92 g_atomic_int_set (&m_meter_exit, 0);
94 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 */
338 /** Wrapped which is called by JACK as its process callback. It is just
339 * here to get us back into C++ land by calling AudioEngine::process_callback()
340 * @param nframes Number of frames passed by JACK.
341 * @param arg User argument passed by JACK, which will be the AudioEngine*.
344 AudioEngine::_process_callback (pframes_t nframes, void *arg)
346 return static_cast<AudioEngine *> (arg)->process_callback (nframes);
350 AudioEngine::_process_thread (void *arg)
352 return static_cast<AudioEngine *> (arg)->process_thread ();
356 AudioEngine::_freewheel_callback (int onoff, void *arg)
358 static_cast<AudioEngine*>(arg)->_freewheeling = onoff;
362 AudioEngine::_registration_callback (jack_port_id_t /*id*/, int /*reg*/, void* arg)
364 AudioEngine* ae = static_cast<AudioEngine*> (arg);
366 if (!ae->port_remove_in_progress) {
367 ae->PortRegisteredOrUnregistered (); /* EMIT SIGNAL */
372 AudioEngine::_latency_callback (jack_latency_callback_mode_t mode, void* arg)
374 return static_cast<AudioEngine *> (arg)->jack_latency_callback (mode);
378 AudioEngine::_connect_callback (jack_port_id_t id_a, jack_port_id_t id_b, int conn, void* arg)
380 AudioEngine* ae = static_cast<AudioEngine*> (arg);
382 if (ae->port_remove_in_progress) {
386 GET_PRIVATE_JACK_POINTER (ae->_jack);
388 jack_port_t* jack_port_a = jack_port_by_id (_priv_jack, id_a);
389 jack_port_t* jack_port_b = jack_port_by_id (_priv_jack, id_b);
394 boost::shared_ptr<Ports> pr = ae->ports.reader ();
395 Ports::iterator i = pr->begin ();
396 while (i != pr->end() && (port_a == 0 || port_b == 0)) {
397 if (jack_port_a == (*i)->jack_port()) {
399 } else if (jack_port_b == (*i)->jack_port()) {
405 ae->PortConnectedOrDisconnected (port_a, port_b, conn == 0 ? false : true); /* EMIT SIGNAL */
409 AudioEngine::split_cycle (pframes_t offset)
411 /* caller must hold process lock */
413 Port::increment_global_port_buffer_offset (offset);
415 /* tell all Ports that we're going to start a new (split) cycle */
417 boost::shared_ptr<Ports> p = ports.reader();
419 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
420 (*i)->cycle_split ();
425 AudioEngine::process_thread ()
427 /* JACK doesn't do this for us when we use the wait API
430 _thread_init_callback (0);
432 _main_thread = new ProcessThread;
435 GET_PRIVATE_JACK_POINTER_RET(_jack,0);
437 pframes_t nframes = jack_cycle_wait (_priv_jack);
439 if (process_callback (nframes)) {
443 jack_cycle_signal (_priv_jack, 0);
449 /** Method called by JACK (via _process_callback) which says that there
450 * is work to be done.
451 * @param nframes Number of frames to process.
454 AudioEngine::process_callback (pframes_t nframes)
456 GET_PRIVATE_JACK_POINTER_RET(_jack,0);
457 // CycleTimer ct ("AudioEngine::process");
458 Glib::Mutex::Lock tm (_process_lock, Glib::TRY_LOCK);
460 /// The number of frames that will have been processed when we've finished
461 pframes_t next_processed_frames;
463 /* handle wrap around of total frames counter */
465 if (max_framepos - _processed_frames < nframes) {
466 next_processed_frames = nframes - (max_framepos - _processed_frames);
468 next_processed_frames = _processed_frames + nframes;
471 if (!tm.locked() || _session == 0) {
472 /* return having done nothing */
473 _processed_frames = next_processed_frames;
477 if (session_remove_pending) {
478 /* perform the actual session removal */
480 session_remove_pending = false;
481 session_removed.signal();
482 _processed_frames = next_processed_frames;
486 /* tell all relevant objects that we're starting a new cycle */
488 Delivery::CycleStart (nframes);
489 Port::set_global_port_buffer_offset (0);
490 Port::set_cycle_framecnt (nframes);
491 InternalReturn::CycleStart (nframes);
493 /* tell all Ports that we're starting a new cycle */
495 boost::shared_ptr<Ports> p = ports.reader();
497 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
498 (*i)->cycle_start (nframes);
501 /* test if we are freewheeling and there are freewheel signals connected.
502 ardour should act normally even when freewheeling unless /it/ is exporting */
505 if (_freewheeling && !Freewheel.empty()) {
506 /* emit the Freewheel signal and stop freewheeling in the event of trouble
508 boost::optional<int> r = Freewheel (nframes);
509 if (r.get_value_or (0)) {
510 jack_set_freewheel (_priv_jack, false);
515 _session->process (nframes);
525 _processed_frames = next_processed_frames;
529 if (last_monitor_check + monitor_check_interval < next_processed_frames) {
531 boost::shared_ptr<Ports> p = ports.reader();
533 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
538 if (port->last_monitor() != (x = port->monitoring_input ())) {
539 port->set_last_monitor (x);
540 /* XXX I think this is dangerous, due to
541 a likely mutex in the signal handlers ...
543 port->MonitorInputChanged (x); /* EMIT SIGNAL */
546 last_monitor_check = next_processed_frames;
549 if (_session->silent()) {
551 boost::shared_ptr<Ports> p = ports.reader();
553 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
557 if (port->sends_output()) {
558 port->get_buffer(nframes).silence(nframes);
565 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
566 (*i)->cycle_end (nframes);
569 _processed_frames = next_processed_frames;
574 AudioEngine::_sample_rate_callback (pframes_t nframes, void *arg)
576 return static_cast<AudioEngine *> (arg)->jack_sample_rate_callback (nframes);
580 AudioEngine::jack_sample_rate_callback (pframes_t nframes)
582 _frame_rate = nframes;
583 _usecs_per_cycle = (int) floor ((((double) frames_per_cycle() / nframes)) * 1000000.0);
585 /* check for monitor input change every 1/10th of second */
587 monitor_check_interval = nframes / 10;
588 last_monitor_check = 0;
591 _session->set_frame_rate (nframes);
594 SampleRateChanged (nframes); /* EMIT SIGNAL */
600 AudioEngine::jack_latency_callback (jack_latency_callback_mode_t mode)
603 _session->update_latency (mode == JackPlaybackLatency);
608 AudioEngine::_bufsize_callback (pframes_t nframes, void *arg)
610 return static_cast<AudioEngine *> (arg)->jack_bufsize_callback (nframes);
614 AudioEngine::jack_bufsize_callback (pframes_t nframes)
616 /* if the size has not changed, this should be a no-op */
618 if (nframes == _buffer_size) {
622 GET_PRIVATE_JACK_POINTER_RET (_jack, 1);
624 _buffer_size = nframes;
625 _usecs_per_cycle = (int) floor ((((double) nframes / frame_rate())) * 1000000.0);
626 last_monitor_check = 0;
628 if (jack_port_type_get_buffer_size) {
629 _raw_buffer_sizes[DataType::AUDIO] = jack_port_type_get_buffer_size (_priv_jack, JACK_DEFAULT_AUDIO_TYPE);
630 _raw_buffer_sizes[DataType::MIDI] = jack_port_type_get_buffer_size (_priv_jack, JACK_DEFAULT_MIDI_TYPE);
633 /* Old version of JACK.
635 These crude guesses, see below where we try to get the right answers.
637 Note that our guess for MIDI deliberatey tries to overestimate
638 by a little. It would be nicer if we could get the actual
639 size from a port, but we have to use this estimate in the
640 event that there are no MIDI ports currently. If there are
641 the value will be adjusted below.
644 _raw_buffer_sizes[DataType::AUDIO] = nframes * sizeof (Sample);
645 _raw_buffer_sizes[DataType::MIDI] = nframes * 4 - (nframes/2);
649 Glib::Mutex::Lock lm (_process_lock);
651 boost::shared_ptr<Ports> p = ports.reader();
653 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
659 _session->set_block_size (_buffer_size);
666 AudioEngine::stop_metering_thread ()
668 if (m_meter_thread) {
669 g_atomic_int_set (&m_meter_exit, 1);
670 m_meter_thread->join ();
676 AudioEngine::start_metering_thread ()
678 if (m_meter_thread == 0) {
679 g_atomic_int_set (&m_meter_exit, 0);
680 m_meter_thread = Glib::Thread::create (boost::bind (&AudioEngine::meter_thread, this),
681 500000, true, true, Glib::THREAD_PRIORITY_NORMAL);
686 AudioEngine::meter_thread ()
688 pthread_set_name (X_("meter"));
691 Glib::usleep (10000); /* 1/100th sec interval */
692 if (g_atomic_int_get(&m_meter_exit)) {
700 AudioEngine::set_session (Session *s)
702 Glib::Mutex::Lock pl (_process_lock);
704 SessionHandlePtr::set_session (s);
708 start_metering_thread ();
710 pframes_t blocksize = jack_get_buffer_size (_jack);
712 /* page in as much of the session process code as we
713 can before we really start running.
716 boost::shared_ptr<Ports> p = ports.reader();
718 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
719 (*i)->cycle_start (blocksize);
722 _session->process (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);
731 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
732 (*i)->cycle_end (blocksize);
738 AudioEngine::remove_session ()
740 Glib::Mutex::Lock lm (_process_lock);
744 stop_metering_thread ();
747 session_remove_pending = true;
748 session_removed.wait(_process_lock);
752 SessionHandlePtr::set_session (0);
759 AudioEngine::port_registration_failure (const std::string& portname)
761 GET_PRIVATE_JACK_POINTER (_jack);
762 string full_portname = jack_client_name;
763 full_portname += ':';
764 full_portname += portname;
767 jack_port_t* p = jack_port_by_name (_priv_jack, full_portname.c_str());
771 reason = string_compose (_("a port with the name \"%1\" already exists: check for duplicated track/bus names"), portname);
773 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);
776 throw PortRegistrationFailure (string_compose (_("AudioEngine: cannot register port \"%1\": %2"), portname, reason).c_str());
780 AudioEngine::register_port (DataType dtype, const string& portname, bool input)
785 if (dtype == DataType::AUDIO) {
786 newport = new AudioPort (portname, (input ? Port::IsInput : Port::IsOutput));
787 } else if (dtype == DataType::MIDI) {
788 newport = new MidiPort (portname, (input ? Port::IsInput : Port::IsOutput));
790 throw PortRegistrationFailure("unable to create port (unknown type)");
793 RCUWriter<Ports> writer (ports);
794 boost::shared_ptr<Ports> ps = writer.get_copy ();
795 ps->insert (ps->begin(), newport);
797 /* writer goes out of scope, forces update */
802 catch (PortRegistrationFailure& err) {
804 } catch (std::exception& e) {
805 throw PortRegistrationFailure(string_compose(
806 _("unable to create port: %1"), e.what()).c_str());
808 throw PortRegistrationFailure("unable to create port (unknown error)");
813 AudioEngine::register_input_port (DataType type, const string& portname)
815 return register_port (type, portname, true);
819 AudioEngine::register_output_port (DataType type, const string& portname)
821 return register_port (type, portname, false);
825 AudioEngine::unregister_port (Port& port)
827 /* caller must hold process lock */
830 /* probably happening when the engine has been halted by JACK,
831 in which case, there is nothing we can do here.
837 RCUWriter<Ports> writer (ports);
838 boost::shared_ptr<Ports> ps = writer.get_copy ();
840 for (Ports::iterator i = ps->begin(); i != ps->end(); ++i) {
848 /* writer goes out of scope, forces update */
855 AudioEngine::connect (const string& source, const string& destination)
861 fatal << _("connect called before engine was started") << endmsg;
868 string s = make_port_name_non_relative (source);
869 string d = make_port_name_non_relative (destination);
872 Port* src = get_port_by_name (s);
873 Port* dst = get_port_by_name (d);
876 ret = src->connect (d);
878 ret = dst->connect (s);
880 /* neither port is known to us, and this API isn't intended for use as a general patch bay */
885 /* already exists - no error, no warning */
886 } else if (ret < 0) {
887 error << string_compose(_("AudioEngine: cannot connect %1 (%2) to %3 (%4)"),
888 source, s, destination, d)
896 AudioEngine::disconnect (const string& source, const string& destination)
902 fatal << _("disconnect called before engine was started") << endmsg;
909 string s = make_port_name_non_relative (source);
910 string d = make_port_name_non_relative (destination);
912 Port* src = get_port_by_name (s);
913 Port* dst = get_port_by_name (d);
916 ret = src->disconnect (d);
918 ret = dst->disconnect (s);
920 /* neither port is known to us, and this API isn't intended for use as a general patch bay */
927 AudioEngine::disconnect (Port& port)
929 GET_PRIVATE_JACK_POINTER_RET (_jack,-1);
933 fatal << _("disconnect called before engine was started") << endmsg;
940 return port.disconnect_all ();
944 AudioEngine::frame_rate () const
946 GET_PRIVATE_JACK_POINTER_RET (_jack, 0);
947 if (_frame_rate == 0) {
948 return (_frame_rate = jack_get_sample_rate (_priv_jack));
955 AudioEngine::raw_buffer_size (DataType t)
957 std::map<DataType,size_t>::const_iterator s = _raw_buffer_sizes.find(t);
958 return (s != _raw_buffer_sizes.end()) ? s->second : 0;
962 AudioEngine::frames_per_cycle () const
964 GET_PRIVATE_JACK_POINTER_RET (_jack,0);
965 if (_buffer_size == 0) {
966 return jack_get_buffer_size (_jack);
972 /** @param name Full or short name of port
973 * @return Corresponding Port* or 0. This object remains the property of the AudioEngine
974 * so must not be deleted.
977 AudioEngine::get_port_by_name (const string& portname)
981 fatal << _("get_port_by_name() called before engine was started") << endmsg;
988 if (!port_is_mine (portname)) {
989 /* not an ardour port */
993 std::string const rel = make_port_name_relative (portname);
995 boost::shared_ptr<Ports> pr = ports.reader();
997 for (Ports::iterator i = pr->begin(); i != pr->end(); ++i) {
998 if (rel == (*i)->name()) {
1007 AudioEngine::get_ports (const string& port_name_pattern, const string& type_name_pattern, uint32_t flags)
1009 GET_PRIVATE_JACK_POINTER_RET (_jack,0);
1012 fatal << _("get_ports called before engine was started") << endmsg;
1018 return jack_get_ports (_priv_jack, port_name_pattern.c_str(), type_name_pattern.c_str(), flags);
1022 AudioEngine::halted_info (jack_status_t code, const char* reason, void *arg)
1024 /* called from jack shutdown handler */
1026 AudioEngine* ae = static_cast<AudioEngine *> (arg);
1027 bool was_running = ae->_running;
1029 ae->stop_metering_thread ();
1031 ae->_running = false;
1032 ae->_buffer_size = 0;
1033 ae->_frame_rate = 0;
1037 #ifdef HAVE_JACK_ON_INFO_SHUTDOWN
1039 case JackBackendError:
1040 ae->Halted(reason); /* EMIT SIGNAL */
1043 ae->Halted(""); /* EMIT SIGNAL */
1046 ae->Halted(""); /* EMIT SIGNAL */
1052 AudioEngine::halted (void *arg)
1054 cerr << "HALTED by JACK\n";
1056 /* called from jack shutdown handler */
1058 AudioEngine* ae = static_cast<AudioEngine *> (arg);
1059 bool was_running = ae->_running;
1061 ae->stop_metering_thread ();
1063 ae->_running = false;
1064 ae->_buffer_size = 0;
1065 ae->_frame_rate = 0;
1069 ae->Halted(""); /* EMIT SIGNAL */
1070 MIDI::Port::JackHalted (); /* EMIT SIGNAL */
1075 AudioEngine::died ()
1077 /* called from a signal handler for SIGPIPE */
1079 stop_metering_thread ();
1088 AudioEngine::can_request_hardware_monitoring ()
1090 GET_PRIVATE_JACK_POINTER_RET (_jack,false);
1091 const char ** ports;
1093 if ((ports = jack_get_ports (_priv_jack, NULL, JACK_DEFAULT_AUDIO_TYPE, JackPortCanMonitor)) == 0) {
1103 AudioEngine::n_physical (unsigned long flags) const
1107 GET_PRIVATE_JACK_POINTER_RET (_jack, c);
1109 const char ** ports = jack_get_ports (_priv_jack, NULL, NULL, JackPortIsPhysical | flags);
1114 for (uint32_t i = 0; ports[i]; ++i) {
1115 if (!strstr (ports[i], "Midi-Through")) {
1116 DataType t (jack_port_type (jack_port_by_name (_jack, ports[i])));
1117 c.set (t, c.get (t) + 1);
1127 AudioEngine::n_physical_inputs () const
1129 return n_physical (JackPortIsInput);
1133 AudioEngine::n_physical_outputs () const
1135 return n_physical (JackPortIsOutput);
1139 AudioEngine::get_physical (DataType type, unsigned long flags, vector<string>& phy)
1141 GET_PRIVATE_JACK_POINTER (_jack);
1142 const char ** ports;
1144 if ((ports = jack_get_ports (_priv_jack, NULL, type.to_jack_type(), JackPortIsPhysical | flags)) == 0) {
1149 for (uint32_t i = 0; ports[i]; ++i) {
1150 if (strstr (ports[i], "Midi-Through")) {
1153 phy.push_back (ports[i]);
1159 /** Get physical ports for which JackPortIsOutput is set; ie those that correspond to
1160 * a physical input connector.
1163 AudioEngine::get_physical_inputs (DataType type, vector<string>& ins)
1165 get_physical (type, JackPortIsOutput, ins);
1168 /** Get physical ports for which JackPortIsInput is set; ie those that correspond to
1169 * a physical output connector.
1172 AudioEngine::get_physical_outputs (DataType type, vector<string>& outs)
1174 get_physical (type, JackPortIsInput, outs);
1178 AudioEngine::transport_stop ()
1180 GET_PRIVATE_JACK_POINTER (_jack);
1181 jack_transport_stop (_priv_jack);
1185 AudioEngine::transport_start ()
1187 GET_PRIVATE_JACK_POINTER (_jack);
1188 jack_transport_start (_priv_jack);
1192 AudioEngine::transport_locate (framepos_t where)
1194 GET_PRIVATE_JACK_POINTER (_jack);
1195 jack_transport_locate (_priv_jack, where);
1198 AudioEngine::TransportState
1199 AudioEngine::transport_state ()
1201 GET_PRIVATE_JACK_POINTER_RET (_jack, ((TransportState) JackTransportStopped));
1202 jack_position_t pos;
1203 return (TransportState) jack_transport_query (_priv_jack, &pos);
1207 AudioEngine::reset_timebase ()
1209 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
1211 if (_session->config.get_jack_time_master()) {
1212 return jack_set_timebase_callback (_priv_jack, 0, _jack_timebase_callback, this);
1214 return jack_release_timebase (_jack);
1221 AudioEngine::freewheel (bool onoff)
1223 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
1225 if (onoff != _freewheeling) {
1226 return jack_set_freewheel (_priv_jack, onoff);
1229 /* already doing what has been asked for */
1235 AudioEngine::remove_all_ports ()
1237 /* make sure that JACK callbacks that will be invoked as we cleanup
1238 * ports know that they have nothing to do.
1241 port_remove_in_progress = true;
1243 /* process lock MUST be held by caller
1246 vector<Port*> to_be_deleted;
1249 RCUWriter<Ports> writer (ports);
1250 boost::shared_ptr<Ports> ps = writer.get_copy ();
1251 for (Ports::iterator i = ps->begin(); i != ps->end(); ++i) {
1252 to_be_deleted.push_back (*i);
1257 /* clear dead wood list in RCU */
1261 /* now do the actual deletion, given that "ports" is now empty, thus
1262 preventing anyone else from getting a handle on a Port
1265 for (vector<Port*>::iterator p = to_be_deleted.begin(); p != to_be_deleted.end(); ++p) {
1269 port_remove_in_progress = false;
1273 AudioEngine::connect_to_jack (string client_name, string session_uuid)
1275 EnvironmentalProtectionAgency* global_epa = EnvironmentalProtectionAgency::get_global_epa ();
1276 boost::scoped_ptr<EnvironmentalProtectionAgency> current_epa;
1277 jack_options_t options = JackNullOption;
1278 jack_status_t status;
1279 const char *server_name = NULL;
1281 /* revert all environment settings back to whatever they were when ardour started
1285 current_epa.reset (new EnvironmentalProtectionAgency(true)); /* will restore settings when we leave scope */
1286 global_epa->restore ();
1289 jack_client_name = client_name; /* might be reset below */
1290 #ifdef HAVE_JACK_SESSION
1291 if (! session_uuid.empty())
1292 _jack = jack_client_open (jack_client_name.c_str(), JackSessionID, &status, session_uuid.c_str());
1295 _jack = jack_client_open (jack_client_name.c_str(), options, &status, server_name);
1297 if (_jack == NULL) {
1298 // error message is not useful here
1302 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
1304 if (status & JackNameNotUnique) {
1305 jack_client_name = jack_get_client_name (_priv_jack);
1312 AudioEngine::disconnect_from_jack ()
1314 GET_PRIVATE_JACK_POINTER_RET (_jack, 0);
1317 stop_metering_thread ();
1321 Glib::Mutex::Lock lm (_process_lock);
1322 jack_client_close (_priv_jack);
1328 _raw_buffer_sizes.clear();
1332 Stopped(); /* EMIT SIGNAL */
1333 MIDI::Port::JackHalted (); /* EMIT SIGNAL */
1340 AudioEngine::reconnect_to_jack ()
1343 disconnect_from_jack ();
1344 /* XXX give jackd a chance */
1345 Glib::usleep (250000);
1348 if (connect_to_jack (jack_client_name, "")) {
1349 error << _("failed to connect to JACK") << endmsg;
1355 boost::shared_ptr<Ports> p = ports.reader ();
1357 for (i = p->begin(); i != p->end(); ++i) {
1358 if ((*i)->reestablish ()) {
1363 if (i != p->end()) {
1365 remove_all_ports ();
1369 GET_PRIVATE_JACK_POINTER_RET (_jack,-1);
1371 MIDI::Manager::instance()->reestablish (_priv_jack);
1374 _session->reset_jack_connection (_priv_jack);
1375 jack_bufsize_callback (jack_get_buffer_size (_priv_jack));
1376 _session->set_frame_rate (jack_get_sample_rate (_priv_jack));
1379 last_monitor_check = 0;
1381 set_jack_callbacks ();
1383 if (jack_activate (_priv_jack) == 0) {
1390 /* re-establish connections */
1392 for (i = p->begin(); i != p->end(); ++i) {
1396 MIDI::Manager::instance()->reconnect ();
1398 Running (); /* EMIT SIGNAL*/
1400 start_metering_thread ();
1406 AudioEngine::request_buffer_size (pframes_t nframes)
1408 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
1410 if (nframes == jack_get_buffer_size (_priv_jack)) {
1414 return jack_set_buffer_size (_priv_jack, nframes);
1418 AudioEngine::update_total_latencies ()
1420 GET_PRIVATE_JACK_POINTER (_jack);
1421 jack_recompute_total_latencies (_priv_jack);
1425 AudioEngine::make_port_name_relative (string portname) const
1427 string::size_type len;
1428 string::size_type n;
1430 len = portname.length();
1432 for (n = 0; n < len; ++n) {
1433 if (portname[n] == ':') {
1438 if ((n != len) && (portname.substr (0, n) == jack_client_name)) {
1439 return portname.substr (n+1);
1446 AudioEngine::make_port_name_non_relative (string portname) const
1450 if (portname.find_first_of (':') != string::npos) {
1454 str = jack_client_name;
1462 AudioEngine::port_is_mine (const string& portname) const
1464 if (portname.find_first_of (':') != string::npos) {
1465 if (portname.substr (0, jack_client_name.length ()) != jack_client_name) {
1473 AudioEngine::is_realtime () const
1475 GET_PRIVATE_JACK_POINTER_RET (_jack,false);
1476 return jack_is_realtime (_priv_jack);
1480 AudioEngine::create_process_thread (boost::function<void()> f, pthread_t* thread, size_t stacksize)
1482 GET_PRIVATE_JACK_POINTER_RET (_jack, 0);
1483 ThreadData* td = new ThreadData (this, f, stacksize);
1485 if (jack_client_create_thread (_priv_jack, thread, jack_client_real_time_priority (_priv_jack),
1486 jack_is_realtime (_priv_jack), _start_process_thread, td)) {
1494 AudioEngine::_start_process_thread (void* arg)
1496 ThreadData* td = reinterpret_cast<ThreadData*> (arg);
1497 boost::function<void()> f = td->f;
1506 AudioEngine::port_is_physical (const std::string& portname) const
1508 GET_PRIVATE_JACK_POINTER_RET(_jack, false);
1510 jack_port_t *port = jack_port_by_name (_priv_jack, portname.c_str());
1516 return jack_port_flags (port) & JackPortIsPhysical;
1520 AudioEngine::ensure_monitor_input (const std::string& portname, bool yn) const
1522 GET_PRIVATE_JACK_POINTER(_jack);
1524 jack_port_t *port = jack_port_by_name (_priv_jack, portname.c_str());
1530 jack_port_request_monitor (port, yn);