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/event_type_map.h"
47 #include "ardour/internal_return.h"
48 #include "ardour/internal_send.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;
87 _pre_freewheel_mmc_enabled = 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 AudioEngine* ae = static_cast<AudioEngine*> (arg);
321 if (ae->connected()) {
322 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 */
340 AudioEngine::_process_thread (void *arg)
342 return static_cast<AudioEngine *> (arg)->process_thread ();
346 AudioEngine::_freewheel_callback (int onoff, void *arg)
348 static_cast<AudioEngine*>(arg)->freewheel_callback (onoff);
352 AudioEngine::freewheel_callback (int onoff)
354 _freewheeling = onoff;
357 _pre_freewheel_mmc_enabled = MIDI::Manager::instance()->mmc()->send_enabled ();
358 MIDI::Manager::instance()->mmc()->enable_send (false);
360 MIDI::Manager::instance()->mmc()->enable_send (_pre_freewheel_mmc_enabled);
365 AudioEngine::_registration_callback (jack_port_id_t /*id*/, int /*reg*/, void* arg)
367 AudioEngine* ae = static_cast<AudioEngine*> (arg);
369 if (!ae->port_remove_in_progress) {
370 ae->PortRegisteredOrUnregistered (); /* EMIT SIGNAL */
375 AudioEngine::_latency_callback (jack_latency_callback_mode_t mode, void* arg)
377 return static_cast<AudioEngine *> (arg)->jack_latency_callback (mode);
381 AudioEngine::_connect_callback (jack_port_id_t id_a, jack_port_id_t id_b, int conn, void* arg)
383 AudioEngine* ae = static_cast<AudioEngine*> (arg);
385 if (ae->port_remove_in_progress) {
389 GET_PRIVATE_JACK_POINTER (ae->_jack);
391 jack_port_t* jack_port_a = jack_port_by_id (_priv_jack, id_a);
392 jack_port_t* jack_port_b = jack_port_by_id (_priv_jack, id_b);
394 boost::shared_ptr<Port> port_a;
395 boost::shared_ptr<Port> port_b;
397 boost::shared_ptr<Ports> pr = ae->ports.reader ();
398 Ports::iterator i = pr->begin ();
399 while (i != pr->end() && (port_a == 0 || port_b == 0)) {
400 if (jack_port_a == i->second->jack_port()) {
402 } else if (jack_port_b == i->second->jack_port()) {
408 ae->PortConnectedOrDisconnected (
409 port_a, jack_port_name (jack_port_a),
410 port_b, jack_port_name (jack_port_b),
411 conn == 0 ? false : true
416 AudioEngine::split_cycle (pframes_t offset)
418 /* caller must hold process lock */
420 Port::increment_global_port_buffer_offset (offset);
422 /* tell all Ports that we're going to start a new (split) cycle */
424 boost::shared_ptr<Ports> p = ports.reader();
426 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
427 i->second->cycle_split ();
432 AudioEngine::process_thread ()
434 /* JACK doesn't do this for us when we use the wait API
437 _thread_init_callback (0);
439 _main_thread = new ProcessThread;
442 GET_PRIVATE_JACK_POINTER_RET(_jack,0);
444 pframes_t nframes = jack_cycle_wait (_priv_jack);
446 if (process_callback (nframes)) {
450 jack_cycle_signal (_priv_jack, 0);
456 /** Method called by our ::process_thread when there is work to be done.
457 * @param nframes Number of frames to process.
460 AudioEngine::process_callback (pframes_t nframes)
462 GET_PRIVATE_JACK_POINTER_RET(_jack,0);
463 Glib::Mutex::Lock tm (_process_lock, Glib::TRY_LOCK);
468 /// The number of frames that will have been processed when we've finished
469 pframes_t next_processed_frames;
471 /* handle wrap around of total frames counter */
473 if (max_framepos - _processed_frames < nframes) {
474 next_processed_frames = nframes - (max_framepos - _processed_frames);
476 next_processed_frames = _processed_frames + nframes;
480 /* return having done nothing */
481 _processed_frames = next_processed_frames;
486 if (!_freewheeling) {
487 MIDI::Manager::instance()->cycle_start(nframes);
488 MIDI::Manager::instance()->cycle_end();
490 _processed_frames = next_processed_frames;
494 if (session_remove_pending) {
495 /* perform the actual session removal */
497 session_remove_pending = false;
498 session_removed.signal();
499 _processed_frames = next_processed_frames;
503 /* tell all relevant objects that we're starting a new cycle */
505 InternalSend::CycleStart (nframes);
506 Port::set_global_port_buffer_offset (0);
507 Port::set_cycle_framecnt (nframes);
509 /* tell all Ports that we're starting a new cycle */
511 boost::shared_ptr<Ports> p = ports.reader();
513 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
514 i->second->cycle_start (nframes);
517 /* test if we are freewheeling and there are freewheel signals connected.
518 ardour should act normally even when freewheeling unless /it/ is exporting */
521 if (_freewheeling && !Freewheel.empty()) {
522 /* emit the Freewheel signal and stop freewheeling in the event of trouble
524 boost::optional<int> r = Freewheel (nframes);
525 if (r.get_value_or (0)) {
526 jack_set_freewheel (_priv_jack, false);
530 MIDI::Manager::instance()->cycle_start(nframes);
533 _session->process (nframes);
536 MIDI::Manager::instance()->cycle_end();
544 _processed_frames = next_processed_frames;
548 if (last_monitor_check + monitor_check_interval < next_processed_frames) {
550 boost::shared_ptr<Ports> p = ports.reader();
552 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
556 if (i->second->last_monitor() != (x = i->second->jack_monitoring_input ())) {
557 i->second->set_last_monitor (x);
558 /* XXX I think this is dangerous, due to
559 a likely mutex in the signal handlers ...
561 i->second->MonitorInputChanged (x); /* EMIT SIGNAL */
564 last_monitor_check = next_processed_frames;
567 if (_session->silent()) {
569 boost::shared_ptr<Ports> p = ports.reader();
571 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
573 if (i->second->sends_output()) {
574 i->second->get_buffer(nframes).silence(nframes);
581 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
582 i->second->cycle_end (nframes);
585 _processed_frames = next_processed_frames;
593 AudioEngine::_sample_rate_callback (pframes_t nframes, void *arg)
595 return static_cast<AudioEngine *> (arg)->jack_sample_rate_callback (nframes);
599 AudioEngine::jack_sample_rate_callback (pframes_t nframes)
601 _frame_rate = nframes;
602 _usecs_per_cycle = (int) floor ((((double) frames_per_cycle() / nframes)) * 1000000.0);
604 /* check for monitor input change every 1/10th of second */
606 monitor_check_interval = nframes / 10;
607 last_monitor_check = 0;
610 _session->set_frame_rate (nframes);
613 SampleRateChanged (nframes); /* EMIT SIGNAL */
619 AudioEngine::jack_latency_callback (jack_latency_callback_mode_t mode)
622 _session->update_latency (mode == JackPlaybackLatency);
627 AudioEngine::_bufsize_callback (pframes_t nframes, void *arg)
629 return static_cast<AudioEngine *> (arg)->jack_bufsize_callback (nframes);
633 AudioEngine::jack_bufsize_callback (pframes_t nframes)
635 /* if the size has not changed, this should be a no-op */
637 if (nframes == _buffer_size) {
641 GET_PRIVATE_JACK_POINTER_RET (_jack, 1);
643 _buffer_size = nframes;
644 _usecs_per_cycle = (int) floor ((((double) nframes / frame_rate())) * 1000000.0);
645 last_monitor_check = 0;
647 if (jack_port_type_get_buffer_size) {
648 _raw_buffer_sizes[DataType::AUDIO] = jack_port_type_get_buffer_size (_priv_jack, JACK_DEFAULT_AUDIO_TYPE);
649 _raw_buffer_sizes[DataType::MIDI] = jack_port_type_get_buffer_size (_priv_jack, JACK_DEFAULT_MIDI_TYPE);
652 /* Old version of JACK.
654 These crude guesses, see below where we try to get the right answers.
656 Note that our guess for MIDI deliberatey tries to overestimate
657 by a little. It would be nicer if we could get the actual
658 size from a port, but we have to use this estimate in the
659 event that there are no MIDI ports currently. If there are
660 the value will be adjusted below.
663 _raw_buffer_sizes[DataType::AUDIO] = nframes * sizeof (Sample);
664 _raw_buffer_sizes[DataType::MIDI] = nframes * 4 - (nframes/2);
668 Glib::Mutex::Lock lm (_process_lock);
670 boost::shared_ptr<Ports> p = ports.reader();
672 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
678 _session->set_block_size (_buffer_size);
685 AudioEngine::stop_metering_thread ()
687 if (m_meter_thread) {
688 g_atomic_int_set (&m_meter_exit, 1);
689 m_meter_thread->join ();
695 AudioEngine::start_metering_thread ()
697 if (m_meter_thread == 0) {
698 g_atomic_int_set (&m_meter_exit, 0);
699 m_meter_thread = Glib::Thread::create (boost::bind (&AudioEngine::meter_thread, this),
700 500000, true, true, Glib::THREAD_PRIORITY_NORMAL);
705 AudioEngine::meter_thread ()
707 pthread_set_name (X_("meter"));
710 Glib::usleep (10000); /* 1/100th sec interval */
711 if (g_atomic_int_get(&m_meter_exit)) {
719 AudioEngine::set_session (Session *s)
721 Glib::Mutex::Lock pl (_process_lock);
723 SessionHandlePtr::set_session (s);
727 start_metering_thread ();
729 pframes_t blocksize = jack_get_buffer_size (_jack);
731 /* page in as much of the session process code as we
732 can before we really start running.
735 boost::shared_ptr<Ports> p = ports.reader();
737 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
738 i->second->cycle_start (blocksize);
741 _session->process (blocksize);
742 _session->process (blocksize);
743 _session->process (blocksize);
744 _session->process (blocksize);
745 _session->process (blocksize);
746 _session->process (blocksize);
747 _session->process (blocksize);
748 _session->process (blocksize);
750 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
751 i->second->cycle_end (blocksize);
757 AudioEngine::remove_session ()
759 Glib::Mutex::Lock lm (_process_lock);
763 stop_metering_thread ();
766 session_remove_pending = true;
767 session_removed.wait(_process_lock);
771 SessionHandlePtr::set_session (0);
778 AudioEngine::port_registration_failure (const std::string& portname)
780 GET_PRIVATE_JACK_POINTER (_jack);
781 string full_portname = jack_client_name;
782 full_portname += ':';
783 full_portname += portname;
786 jack_port_t* p = jack_port_by_name (_priv_jack, full_portname.c_str());
790 reason = string_compose (_("a port with the name \"%1\" already exists: check for duplicated track/bus names"), portname);
792 reason = string_compose (_("No more JACK ports are available. You will need to stop %1 and restart JACK with more ports if you need this many tracks."), PROGRAM_NAME);
795 throw PortRegistrationFailure (string_compose (_("AudioEngine: cannot register port \"%1\": %2"), portname, reason).c_str());
798 boost::shared_ptr<Port>
799 AudioEngine::register_port (DataType dtype, const string& portname, bool input)
801 boost::shared_ptr<Port> newport;
804 if (dtype == DataType::AUDIO) {
805 newport.reset (new AudioPort (portname, (input ? Port::IsInput : Port::IsOutput)));
806 } else if (dtype == DataType::MIDI) {
807 newport.reset (new MidiPort (portname, (input ? Port::IsInput : Port::IsOutput)));
809 throw PortRegistrationFailure("unable to create port (unknown type)");
812 RCUWriter<Ports> writer (ports);
813 boost::shared_ptr<Ports> ps = writer.get_copy ();
814 ps->insert (make_pair (make_port_name_relative (portname), newport));
816 /* writer goes out of scope, forces update */
821 catch (PortRegistrationFailure& err) {
823 } catch (std::exception& e) {
824 throw PortRegistrationFailure(string_compose(
825 _("unable to create port: %1"), e.what()).c_str());
827 throw PortRegistrationFailure("unable to create port (unknown error)");
831 boost::shared_ptr<Port>
832 AudioEngine::register_input_port (DataType type, const string& portname)
834 return register_port (type, portname, true);
837 boost::shared_ptr<Port>
838 AudioEngine::register_output_port (DataType type, const string& portname)
840 return register_port (type, portname, false);
844 AudioEngine::unregister_port (boost::shared_ptr<Port> port)
846 /* caller must hold process lock */
849 /* probably happening when the engine has been halted by JACK,
850 in which case, there is nothing we can do here.
856 RCUWriter<Ports> writer (ports);
857 boost::shared_ptr<Ports> ps = writer.get_copy ();
858 Ports::iterator x = ps->find (make_port_name_relative (port->name()));
860 if (x != ps->end()) {
864 /* writer goes out of scope, forces update */
873 AudioEngine::connect (const string& source, const string& destination)
879 fatal << _("connect called before engine was started") << endmsg;
886 string s = make_port_name_non_relative (source);
887 string d = make_port_name_non_relative (destination);
890 boost::shared_ptr<Port> src = get_port_by_name (s);
891 boost::shared_ptr<Port> dst = get_port_by_name (d);
894 ret = src->connect (d);
896 ret = dst->connect (s);
898 /* neither port is known to us, and this API isn't intended for use as a general patch bay */
903 /* already exists - no error, no warning */
904 } else if (ret < 0) {
905 error << string_compose(_("AudioEngine: cannot connect %1 (%2) to %3 (%4)"),
906 source, s, destination, d)
914 AudioEngine::disconnect (const string& source, const string& destination)
920 fatal << _("disconnect called before engine was started") << endmsg;
927 string s = make_port_name_non_relative (source);
928 string d = make_port_name_non_relative (destination);
930 boost::shared_ptr<Port> src = get_port_by_name (s);
931 boost::shared_ptr<Port> dst = get_port_by_name (d);
934 ret = src->disconnect (d);
936 ret = dst->disconnect (s);
938 /* neither port is known to us, and this API isn't intended for use as a general patch bay */
945 AudioEngine::disconnect (boost::shared_ptr<Port> port)
947 GET_PRIVATE_JACK_POINTER_RET (_jack,-1);
951 fatal << _("disconnect called before engine was started") << endmsg;
958 return port->disconnect_all ();
962 AudioEngine::frame_rate () const
964 GET_PRIVATE_JACK_POINTER_RET (_jack, 0);
965 if (_frame_rate == 0) {
966 return (_frame_rate = jack_get_sample_rate (_priv_jack));
973 AudioEngine::raw_buffer_size (DataType t)
975 std::map<DataType,size_t>::const_iterator s = _raw_buffer_sizes.find(t);
976 return (s != _raw_buffer_sizes.end()) ? s->second : 0;
980 AudioEngine::frames_per_cycle () const
982 GET_PRIVATE_JACK_POINTER_RET (_jack,0);
983 if (_buffer_size == 0) {
984 return jack_get_buffer_size (_jack);
990 /** @param name Full or short name of port
991 * @return Corresponding Port or 0.
994 boost::shared_ptr<Port>
995 AudioEngine::get_port_by_name (const string& portname)
999 fatal << _("get_port_by_name() called before engine was started") << endmsg;
1002 boost::shared_ptr<Port> ();
1006 if (!port_is_mine (portname)) {
1007 /* not an ardour port */
1008 return boost::shared_ptr<Port> ();
1011 boost::shared_ptr<Ports> pr = ports.reader();
1012 std::string rel = make_port_name_relative (portname);
1013 Ports::iterator x = pr->find (rel);
1015 if (x != pr->end()) {
1016 /* its possible that the port was renamed by some 3rd party and
1017 we don't know about it. check for this (the check is quick
1018 and cheap), and if so, rename the port (which will alter
1019 the port map as a side effect).
1021 const std::string check = make_port_name_relative (jack_port_name (x->second->jack_port()));
1023 x->second->set_name (check);
1028 return boost::shared_ptr<Port> ();
1032 AudioEngine::port_renamed (const std::string& old_relative_name, const std::string& new_relative_name)
1034 RCUWriter<Ports> writer (ports);
1035 boost::shared_ptr<Ports> p = writer.get_copy();
1036 Ports::iterator x = p->find (old_relative_name);
1038 if (x != p->end()) {
1039 boost::shared_ptr<Port> port = x->second;
1041 p->insert (make_pair (new_relative_name, port));
1046 AudioEngine::get_ports (const string& port_name_pattern, const string& type_name_pattern, uint32_t flags)
1048 GET_PRIVATE_JACK_POINTER_RET (_jack,0);
1051 fatal << _("get_ports called before engine was started") << endmsg;
1057 return jack_get_ports (_priv_jack, port_name_pattern.c_str(), type_name_pattern.c_str(), flags);
1061 AudioEngine::halted_info (jack_status_t code, const char* reason, void *arg)
1063 /* called from jack shutdown handler */
1065 AudioEngine* ae = static_cast<AudioEngine *> (arg);
1066 bool was_running = ae->_running;
1068 ae->stop_metering_thread ();
1070 ae->_running = false;
1071 ae->_buffer_size = 0;
1072 ae->_frame_rate = 0;
1076 #ifdef HAVE_JACK_ON_INFO_SHUTDOWN
1078 case JackBackendError:
1079 ae->Halted(reason); /* EMIT SIGNAL */
1082 ae->Halted(""); /* EMIT SIGNAL */
1085 ae->Halted(""); /* EMIT SIGNAL */
1091 AudioEngine::halted (void *arg)
1093 cerr << "HALTED by JACK\n";
1095 /* called from jack shutdown handler */
1097 AudioEngine* ae = static_cast<AudioEngine *> (arg);
1098 bool was_running = ae->_running;
1100 ae->stop_metering_thread ();
1102 ae->_running = false;
1103 ae->_buffer_size = 0;
1104 ae->_frame_rate = 0;
1108 ae->Halted(""); /* EMIT SIGNAL */
1109 MIDI::Port::JackHalted (); /* EMIT SIGNAL */
1114 AudioEngine::died ()
1116 /* called from a signal handler for SIGPIPE */
1118 stop_metering_thread ();
1127 AudioEngine::can_request_hardware_monitoring ()
1129 GET_PRIVATE_JACK_POINTER_RET (_jack,false);
1130 const char ** ports;
1132 if ((ports = jack_get_ports (_priv_jack, NULL, JACK_DEFAULT_AUDIO_TYPE, JackPortCanMonitor)) == 0) {
1142 AudioEngine::n_physical (unsigned long flags) const
1146 GET_PRIVATE_JACK_POINTER_RET (_jack, c);
1148 const char ** ports = jack_get_ports (_priv_jack, NULL, NULL, JackPortIsPhysical | flags);
1153 for (uint32_t i = 0; ports[i]; ++i) {
1154 if (!strstr (ports[i], "Midi-Through")) {
1155 DataType t (jack_port_type (jack_port_by_name (_jack, ports[i])));
1156 c.set (t, c.get (t) + 1);
1166 AudioEngine::n_physical_inputs () const
1168 return n_physical (JackPortIsInput);
1172 AudioEngine::n_physical_outputs () const
1174 return n_physical (JackPortIsOutput);
1178 AudioEngine::get_physical (DataType type, unsigned long flags, vector<string>& phy)
1180 GET_PRIVATE_JACK_POINTER (_jack);
1181 const char ** ports;
1183 if ((ports = jack_get_ports (_priv_jack, NULL, type.to_jack_type(), JackPortIsPhysical | flags)) == 0) {
1188 for (uint32_t i = 0; ports[i]; ++i) {
1189 if (strstr (ports[i], "Midi-Through")) {
1192 phy.push_back (ports[i]);
1198 /** Get physical ports for which JackPortIsOutput is set; ie those that correspond to
1199 * a physical input connector.
1202 AudioEngine::get_physical_inputs (DataType type, vector<string>& ins)
1204 get_physical (type, JackPortIsOutput, ins);
1207 /** Get physical ports for which JackPortIsInput is set; ie those that correspond to
1208 * a physical output connector.
1211 AudioEngine::get_physical_outputs (DataType type, vector<string>& outs)
1213 get_physical (type, JackPortIsInput, outs);
1217 AudioEngine::transport_stop ()
1219 GET_PRIVATE_JACK_POINTER (_jack);
1220 jack_transport_stop (_priv_jack);
1224 AudioEngine::transport_start ()
1226 GET_PRIVATE_JACK_POINTER (_jack);
1227 jack_transport_start (_priv_jack);
1231 AudioEngine::transport_locate (framepos_t where)
1233 GET_PRIVATE_JACK_POINTER (_jack);
1234 jack_transport_locate (_priv_jack, where);
1237 AudioEngine::TransportState
1238 AudioEngine::transport_state ()
1240 GET_PRIVATE_JACK_POINTER_RET (_jack, ((TransportState) JackTransportStopped));
1241 jack_position_t pos;
1242 return (TransportState) jack_transport_query (_priv_jack, &pos);
1246 AudioEngine::reset_timebase ()
1248 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
1250 if (_session->config.get_jack_time_master()) {
1251 return jack_set_timebase_callback (_priv_jack, 0, _jack_timebase_callback, this);
1253 return jack_release_timebase (_jack);
1260 AudioEngine::freewheel (bool onoff)
1262 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
1264 if (onoff != _freewheeling) {
1265 return jack_set_freewheel (_priv_jack, onoff);
1268 /* already doing what has been asked for */
1274 AudioEngine::remove_all_ports ()
1276 /* make sure that JACK callbacks that will be invoked as we cleanup
1277 * ports know that they have nothing to do.
1280 port_remove_in_progress = true;
1282 /* process lock MUST be held by caller
1286 RCUWriter<Ports> writer (ports);
1287 boost::shared_ptr<Ports> ps = writer.get_copy ();
1291 /* clear dead wood list in RCU */
1295 port_remove_in_progress = false;
1299 AudioEngine::connect_to_jack (string client_name, string session_uuid)
1301 EnvironmentalProtectionAgency* global_epa = EnvironmentalProtectionAgency::get_global_epa ();
1302 boost::scoped_ptr<EnvironmentalProtectionAgency> current_epa;
1303 jack_options_t options = JackNullOption;
1304 jack_status_t status;
1305 const char *server_name = NULL;
1307 /* revert all environment settings back to whatever they were when ardour started
1311 current_epa.reset (new EnvironmentalProtectionAgency(true)); /* will restore settings when we leave scope */
1312 global_epa->restore ();
1315 jack_client_name = client_name; /* might be reset below */
1316 #ifdef HAVE_JACK_SESSION
1317 if (! session_uuid.empty())
1318 _jack = jack_client_open (jack_client_name.c_str(), JackSessionID, &status, session_uuid.c_str());
1321 _jack = jack_client_open (jack_client_name.c_str(), options, &status, server_name);
1323 if (_jack == NULL) {
1324 // error message is not useful here
1328 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
1330 if (status & JackNameNotUnique) {
1331 jack_client_name = jack_get_client_name (_priv_jack);
1338 AudioEngine::disconnect_from_jack ()
1340 GET_PRIVATE_JACK_POINTER_RET (_jack, 0);
1343 stop_metering_thread ();
1347 Glib::Mutex::Lock lm (_process_lock);
1348 jack_client_close (_priv_jack);
1354 _raw_buffer_sizes.clear();
1358 Stopped(); /* EMIT SIGNAL */
1359 MIDI::Port::JackHalted (); /* EMIT SIGNAL */
1366 AudioEngine::reconnect_to_jack ()
1369 disconnect_from_jack ();
1370 /* XXX give jackd a chance */
1371 Glib::usleep (250000);
1374 if (connect_to_jack (jack_client_name, "")) {
1375 error << _("failed to connect to JACK") << endmsg;
1381 boost::shared_ptr<Ports> p = ports.reader ();
1383 for (i = p->begin(); i != p->end(); ++i) {
1384 if (i->second->reestablish ()) {
1389 if (i != p->end()) {
1391 remove_all_ports ();
1395 GET_PRIVATE_JACK_POINTER_RET (_jack,-1);
1397 MIDI::Manager::instance()->reestablish (_priv_jack);
1400 _session->reset_jack_connection (_priv_jack);
1401 jack_bufsize_callback (jack_get_buffer_size (_priv_jack));
1402 _session->set_frame_rate (jack_get_sample_rate (_priv_jack));
1405 last_monitor_check = 0;
1407 set_jack_callbacks ();
1409 if (jack_activate (_priv_jack) == 0) {
1416 /* re-establish connections */
1418 for (i = p->begin(); i != p->end(); ++i) {
1419 i->second->reconnect ();
1422 MIDI::Manager::instance()->reconnect ();
1424 Running (); /* EMIT SIGNAL*/
1426 start_metering_thread ();
1432 AudioEngine::request_buffer_size (pframes_t nframes)
1434 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
1436 if (nframes == jack_get_buffer_size (_priv_jack)) {
1440 return jack_set_buffer_size (_priv_jack, nframes);
1444 AudioEngine::make_port_name_relative (string portname) const
1446 string::size_type len;
1447 string::size_type n;
1449 len = portname.length();
1451 for (n = 0; n < len; ++n) {
1452 if (portname[n] == ':') {
1457 if ((n != len) && (portname.substr (0, n) == jack_client_name)) {
1458 return portname.substr (n+1);
1465 AudioEngine::make_port_name_non_relative (string portname) const
1469 if (portname.find_first_of (':') != string::npos) {
1473 str = jack_client_name;
1481 AudioEngine::port_is_mine (const string& portname) const
1483 if (portname.find_first_of (':') != string::npos) {
1484 if (portname.substr (0, jack_client_name.length ()) != jack_client_name) {
1492 AudioEngine::is_realtime () const
1494 GET_PRIVATE_JACK_POINTER_RET (_jack,false);
1495 return jack_is_realtime (_priv_jack);
1499 AudioEngine::create_process_thread (boost::function<void()> f, pthread_t* thread, size_t stacksize)
1501 GET_PRIVATE_JACK_POINTER_RET (_jack, 0);
1502 ThreadData* td = new ThreadData (this, f, stacksize);
1504 if (jack_client_create_thread (_priv_jack, thread, jack_client_real_time_priority (_priv_jack),
1505 jack_is_realtime (_priv_jack), _start_process_thread, td)) {
1513 AudioEngine::_start_process_thread (void* arg)
1515 ThreadData* td = reinterpret_cast<ThreadData*> (arg);
1516 boost::function<void()> f = td->f;
1525 AudioEngine::port_is_physical (const std::string& portname) const
1527 GET_PRIVATE_JACK_POINTER_RET(_jack, false);
1529 jack_port_t *port = jack_port_by_name (_priv_jack, portname.c_str());
1535 return jack_port_flags (port) & JackPortIsPhysical;
1539 AudioEngine::request_jack_monitors_input (const std::string& portname, bool yn) const
1541 GET_PRIVATE_JACK_POINTER(_jack);
1543 jack_port_t *port = jack_port_by_name (_priv_jack, portname.c_str());
1549 jack_port_request_monitor (port, yn);
1553 AudioEngine::update_latencies ()
1555 if (jack_recompute_total_latencies) {
1556 GET_PRIVATE_JACK_POINTER (_jack);
1557 jack_recompute_total_latencies (_priv_jack);
1562 AudioEngine::destroy ()