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++/jack_midi_port.h"
38 #include "midi++/mmc.h"
39 #include "midi++/manager.h"
41 #include "ardour/audio_port.h"
42 #include "ardour/audioengine.h"
43 #include "ardour/buffer.h"
44 #include "ardour/cycle_timer.h"
45 #include "ardour/internal_send.h"
46 #include "ardour/meter.h"
47 #include "ardour/midi_port.h"
48 #include "ardour/port.h"
49 #include "ardour/process_thread.h"
50 #include "ardour/session.h"
55 using namespace ARDOUR;
58 gint AudioEngine::m_meter_exit;
59 AudioEngine* AudioEngine::_instance = 0;
61 #define GET_PRIVATE_JACK_POINTER(j) jack_client_t* _priv_jack = (jack_client_t*) (j); if (!_priv_jack) { return; }
62 #define GET_PRIVATE_JACK_POINTER_RET(j,r) jack_client_t* _priv_jack = (jack_client_t*) (j); if (!_priv_jack) { return r; }
64 AudioEngine::AudioEngine (string client_name, string session_uuid)
66 , session_remove_pending (false)
67 , session_removal_countdown (-1)
72 , monitor_check_interval (INT32_MAX)
73 , last_monitor_check (0)
74 , _processed_frames (0)
75 , _freewheeling (false)
76 , _pre_freewheel_mmc_enabled (false)
77 , _usecs_per_cycle (0)
78 , port_remove_in_progress (false)
83 _instance = this; /* singleton */
85 g_atomic_int_set (&m_meter_exit, 0);
87 if (connect_to_jack (client_name, session_uuid)) {
88 throw NoBackendAvailable ();
91 Port::set_engine (this);
93 _ltc_input = new AudioPort ("LTC in", Port::IsInput);
97 AudioEngine::~AudioEngine ()
100 Glib::Threads::Mutex::Lock tm (_process_lock);
101 session_removed.signal ();
104 jack_client_close (_jack);
108 stop_metering_thread ();
113 AudioEngine::jack() const
119 _thread_init_callback (void * /*arg*/)
121 /* make sure that anybody who needs to know about this thread
125 pthread_set_name (X_("audioengine"));
127 PBD::notify_gui_about_thread_creation ("gui", pthread_self(), X_("Audioengine"), 4096);
128 PBD::notify_gui_about_thread_creation ("midiui", pthread_self(), X_("Audioengine"), 128);
130 SessionEvent::create_per_thread_pool (X_("Audioengine"), 512);
132 MIDI::JackMIDIPort::set_process_thread (pthread_self());
136 ardour_jack_error (const char* msg)
138 error << "JACK: " << msg << endmsg;
142 AudioEngine::set_jack_callbacks ()
144 GET_PRIVATE_JACK_POINTER (_jack);
146 if (jack_on_info_shutdown) {
147 jack_on_info_shutdown (_priv_jack, halted_info, this);
149 jack_on_shutdown (_priv_jack, halted, this);
152 jack_set_thread_init_callback (_priv_jack, _thread_init_callback, this);
153 jack_set_process_thread (_priv_jack, _process_thread, this);
154 jack_set_sample_rate_callback (_priv_jack, _sample_rate_callback, this);
155 jack_set_buffer_size_callback (_priv_jack, _bufsize_callback, this);
156 jack_set_graph_order_callback (_priv_jack, _graph_order_callback, this);
157 jack_set_port_registration_callback (_priv_jack, _registration_callback, this);
158 jack_set_port_connect_callback (_priv_jack, _connect_callback, this);
159 jack_set_xrun_callback (_priv_jack, _xrun_callback, this);
160 jack_set_sync_callback (_priv_jack, _jack_sync_callback, this);
161 jack_set_freewheel_callback (_priv_jack, _freewheel_callback, this);
163 if (_session && _session->config.get_jack_time_master()) {
164 jack_set_timebase_callback (_priv_jack, 0, _jack_timebase_callback, this);
167 #ifdef HAVE_JACK_SESSION
168 if( jack_set_session_callback)
169 jack_set_session_callback (_priv_jack, _session_callback, this);
172 if (jack_set_latency_callback) {
173 jack_set_latency_callback (_priv_jack, _latency_callback, this);
176 jack_set_error_function (ardour_jack_error);
180 AudioEngine::start ()
182 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
186 if (!jack_port_type_get_buffer_size) {
187 warning << _("This version of JACK is old - you should upgrade to a newer version that supports jack_port_type_get_buffer_size()") << endmsg;
191 BootMessage (_("Connect session to engine"));
192 _session->set_frame_rate (jack_get_sample_rate (_priv_jack));
195 /* a proxy for whether jack_activate() will definitely call the buffer size
196 * callback. with older versions of JACK, this function symbol will be null.
197 * this is reliable, but not clean.
200 if (!jack_port_type_get_buffer_size) {
201 jack_bufsize_callback (jack_get_buffer_size (_priv_jack));
204 _processed_frames = 0;
205 last_monitor_check = 0;
207 set_jack_callbacks ();
209 if (jack_activate (_priv_jack) == 0) {
212 Running(); /* EMIT SIGNAL */
214 // error << _("cannot activate JACK client") << endmsg;
218 return _running ? 0 : -1;
222 AudioEngine::stop (bool forever)
224 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
228 disconnect_from_jack ();
230 jack_deactivate (_priv_jack);
231 Stopped(); /* EMIT SIGNAL */
232 MIDI::JackMIDIPort::JackHalted (); /* EMIT SIGNAL */
237 stop_metering_thread ();
240 return _running ? -1 : 0;
245 AudioEngine::get_sync_offset (pframes_t& offset) const
248 #ifdef HAVE_JACK_VIDEO_SUPPORT
250 GET_PRIVATE_JACK_POINTER_RET (_jack, false);
255 (void) jack_transport_query (_priv_jack, &pos);
257 if (pos.valid & JackVideoFrameOffset) {
258 offset = pos.video_offset;
271 AudioEngine::_jack_timebase_callback (jack_transport_state_t state, pframes_t nframes,
272 jack_position_t* pos, int new_position, void *arg)
274 static_cast<AudioEngine*> (arg)->jack_timebase_callback (state, nframes, pos, new_position);
278 AudioEngine::jack_timebase_callback (jack_transport_state_t state, pframes_t nframes,
279 jack_position_t* pos, int new_position)
281 if (_jack && _session && _session->synced_to_jack()) {
282 _session->jack_timebase_callback (state, nframes, pos, new_position);
287 AudioEngine::_jack_sync_callback (jack_transport_state_t state, jack_position_t* pos, void* arg)
289 return static_cast<AudioEngine*> (arg)->jack_sync_callback (state, pos);
293 AudioEngine::jack_sync_callback (jack_transport_state_t state, jack_position_t* pos)
295 if (_jack && _session) {
296 return _session->jack_sync_callback (state, pos);
303 AudioEngine::_xrun_callback (void *arg)
305 AudioEngine* ae = static_cast<AudioEngine*> (arg);
306 if (ae->connected()) {
307 ae->Xrun (); /* EMIT SIGNAL */
312 #ifdef HAVE_JACK_SESSION
314 AudioEngine::_session_callback (jack_session_event_t *event, void *arg)
316 AudioEngine* ae = static_cast<AudioEngine*> (arg);
317 if (ae->connected()) {
318 ae->JackSessionEvent ( event ); /* EMIT SIGNAL */
324 AudioEngine::_graph_order_callback (void *arg)
326 AudioEngine* ae = static_cast<AudioEngine*> (arg);
328 if (ae->connected() && !ae->port_remove_in_progress) {
329 ae->GraphReordered (); /* EMIT SIGNAL */
336 AudioEngine::_process_thread (void *arg)
338 return static_cast<AudioEngine *> (arg)->process_thread ();
342 AudioEngine::_freewheel_callback (int onoff, void *arg)
344 static_cast<AudioEngine*>(arg)->freewheel_callback (onoff);
348 AudioEngine::freewheel_callback (int onoff)
350 _freewheeling = onoff;
353 _pre_freewheel_mmc_enabled = MIDI::Manager::instance()->mmc()->send_enabled ();
354 MIDI::Manager::instance()->mmc()->enable_send (false);
356 MIDI::Manager::instance()->mmc()->enable_send (_pre_freewheel_mmc_enabled);
361 AudioEngine::_registration_callback (jack_port_id_t /*id*/, int /*reg*/, void* arg)
363 AudioEngine* ae = static_cast<AudioEngine*> (arg);
365 if (!ae->port_remove_in_progress) {
366 ae->PortRegisteredOrUnregistered (); /* EMIT SIGNAL */
371 AudioEngine::_latency_callback (jack_latency_callback_mode_t mode, void* arg)
373 return static_cast<AudioEngine *> (arg)->jack_latency_callback (mode);
377 AudioEngine::_connect_callback (jack_port_id_t id_a, jack_port_id_t id_b, int conn, void* arg)
379 AudioEngine* ae = static_cast<AudioEngine*> (arg);
381 if (ae->port_remove_in_progress) {
385 GET_PRIVATE_JACK_POINTER (ae->_jack);
387 jack_port_t* jack_port_a = jack_port_by_id (_priv_jack, id_a);
388 jack_port_t* jack_port_b = jack_port_by_id (_priv_jack, id_b);
390 boost::shared_ptr<Port> port_a;
391 boost::shared_ptr<Port> port_b;
393 boost::shared_ptr<Ports> pr = ae->ports.reader ();
394 Ports::iterator i = pr->begin ();
395 while (i != pr->end() && (port_a == 0 || port_b == 0)) {
396 if (jack_port_a == i->second->jack_port()) {
398 } else if (jack_port_b == i->second->jack_port()) {
404 ae->PortConnectedOrDisconnected (
405 port_a, jack_port_name (jack_port_a),
406 port_b, jack_port_name (jack_port_b),
407 conn == 0 ? false : true
412 AudioEngine::split_cycle (pframes_t offset)
414 /* caller must hold process lock */
416 Port::increment_global_port_buffer_offset (offset);
418 /* tell all Ports that we're going to start a new (split) cycle */
420 boost::shared_ptr<Ports> p = ports.reader();
422 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
423 i->second->cycle_split ();
428 AudioEngine::process_thread ()
430 /* JACK doesn't do this for us when we use the wait API
433 _thread_init_callback (0);
435 _main_thread = new ProcessThread;
438 GET_PRIVATE_JACK_POINTER_RET(_jack,0);
440 pframes_t nframes = jack_cycle_wait (_priv_jack);
442 if (process_callback (nframes)) {
446 jack_cycle_signal (_priv_jack, 0);
452 /** Method called by our ::process_thread when there is work to be done.
453 * @param nframes Number of frames to process.
456 AudioEngine::process_callback (pframes_t nframes)
458 GET_PRIVATE_JACK_POINTER_RET(_jack,0);
459 Glib::Threads::Mutex::Lock tm (_process_lock, Glib::Threads::TRY_LOCK);
464 /// The number of frames that will have been processed when we've finished
465 pframes_t next_processed_frames;
467 /* handle wrap around of total frames counter */
469 if (max_framepos - _processed_frames < nframes) {
470 next_processed_frames = nframes - (max_framepos - _processed_frames);
472 next_processed_frames = _processed_frames + nframes;
476 /* return having done nothing */
477 _processed_frames = next_processed_frames;
481 if (session_remove_pending) {
483 /* perform the actual session removal */
485 if (session_removal_countdown < 0) {
487 /* fade out over 1 second */
488 session_removal_countdown = _frame_rate/2;
489 session_removal_gain = 1.0;
490 session_removal_gain_step = 1.0/session_removal_countdown;
492 } else if (session_removal_countdown > 0) {
494 /* we'll be fading audio out.
496 if this is the last time we do this as part
497 of session removal, do a MIDI panic now
498 to get MIDI stopped. This relies on the fact
499 that "immediate data" (aka "out of band data") from
500 MIDI tracks is *appended* after any other data,
501 so that it emerges after any outbound note ons, etc.
504 if (session_removal_countdown <= nframes) {
505 _session->midi_panic ();
511 session_removal_countdown = -1; // reset to "not in progress"
512 session_remove_pending = false;
513 session_removed.signal(); // wakes up thread that initiated session removal
519 if (!_freewheeling) {
520 MIDI::Manager::instance()->cycle_start(nframes);
521 MIDI::Manager::instance()->cycle_end();
524 _processed_frames = next_processed_frames;
529 /* tell all relevant objects that we're starting a new cycle */
531 InternalSend::CycleStart (nframes);
532 Port::set_global_port_buffer_offset (0);
533 Port::set_cycle_framecnt (nframes);
535 /* tell all Ports that we're starting a new cycle */
537 boost::shared_ptr<Ports> p = ports.reader();
539 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
540 i->second->cycle_start (nframes);
543 /* test if we are freewheeling and there are freewheel signals connected.
544 ardour should act normally even when freewheeling unless /it/ is exporting */
547 if (_freewheeling && !Freewheel.empty()) {
548 /* emit the Freewheel signal and stop freewheeling in the event of trouble
550 boost::optional<int> r = Freewheel (nframes);
551 if (r.get_value_or (0)) {
552 jack_set_freewheel (_priv_jack, false);
556 MIDI::Manager::instance()->cycle_start(nframes);
559 _session->process (nframes);
562 MIDI::Manager::instance()->cycle_end();
570 _processed_frames = next_processed_frames;
574 if (last_monitor_check + monitor_check_interval < next_processed_frames) {
576 boost::shared_ptr<Ports> p = ports.reader();
578 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
582 if (i->second->last_monitor() != (x = i->second->jack_monitoring_input ())) {
583 i->second->set_last_monitor (x);
584 /* XXX I think this is dangerous, due to
585 a likely mutex in the signal handlers ...
587 i->second->MonitorInputChanged (x); /* EMIT SIGNAL */
590 last_monitor_check = next_processed_frames;
593 if (_session->silent()) {
595 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
597 if (i->second->sends_output()) {
598 i->second->get_buffer(nframes).silence(nframes);
603 if (session_remove_pending && session_removal_countdown) {
605 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
607 if (i->second->sends_output()) {
609 boost::shared_ptr<AudioPort> ap = boost::dynamic_pointer_cast<AudioPort> (i->second);
611 Sample* s = ap->engine_get_whole_audio_buffer ();
612 gain_t g = session_removal_gain;
614 for (pframes_t n = 0; n < nframes; ++n) {
616 g -= session_removal_gain_step;
622 if (session_removal_countdown > nframes) {
623 session_removal_countdown -= nframes;
625 session_removal_countdown = 0;
628 session_removal_gain -= (nframes * session_removal_gain_step);
633 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
634 i->second->cycle_end (nframes);
637 _processed_frames = next_processed_frames;
645 AudioEngine::_sample_rate_callback (pframes_t nframes, void *arg)
647 return static_cast<AudioEngine *> (arg)->jack_sample_rate_callback (nframes);
651 AudioEngine::jack_sample_rate_callback (pframes_t nframes)
653 _frame_rate = nframes;
654 _usecs_per_cycle = (int) floor ((((double) frames_per_cycle() / nframes)) * 1000000.0);
656 /* check for monitor input change every 1/10th of second */
658 monitor_check_interval = nframes / 10;
659 last_monitor_check = 0;
662 _session->set_frame_rate (nframes);
665 SampleRateChanged (nframes); /* EMIT SIGNAL */
671 AudioEngine::jack_latency_callback (jack_latency_callback_mode_t mode)
674 _session->update_latency (mode == JackPlaybackLatency);
679 AudioEngine::_bufsize_callback (pframes_t nframes, void *arg)
681 return static_cast<AudioEngine *> (arg)->jack_bufsize_callback (nframes);
685 AudioEngine::jack_bufsize_callback (pframes_t nframes)
687 /* if the size has not changed, this should be a no-op */
689 if (nframes == _buffer_size) {
693 GET_PRIVATE_JACK_POINTER_RET (_jack, 1);
695 _buffer_size = nframes;
696 _usecs_per_cycle = (int) floor ((((double) nframes / frame_rate())) * 1000000.0);
697 last_monitor_check = 0;
699 if (jack_port_type_get_buffer_size) {
700 _raw_buffer_sizes[DataType::AUDIO] = jack_port_type_get_buffer_size (_priv_jack, JACK_DEFAULT_AUDIO_TYPE);
701 _raw_buffer_sizes[DataType::MIDI] = jack_port_type_get_buffer_size (_priv_jack, JACK_DEFAULT_MIDI_TYPE);
704 /* Old version of JACK.
706 These crude guesses, see below where we try to get the right answers.
708 Note that our guess for MIDI deliberatey tries to overestimate
709 by a little. It would be nicer if we could get the actual
710 size from a port, but we have to use this estimate in the
711 event that there are no MIDI ports currently. If there are
712 the value will be adjusted below.
715 _raw_buffer_sizes[DataType::AUDIO] = nframes * sizeof (Sample);
716 _raw_buffer_sizes[DataType::MIDI] = nframes * 4 - (nframes/2);
720 Glib::Threads::Mutex::Lock lm (_process_lock);
722 boost::shared_ptr<Ports> p = ports.reader();
724 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
730 _session->set_block_size (_buffer_size);
737 AudioEngine::stop_metering_thread ()
739 if (m_meter_thread) {
740 g_atomic_int_set (&m_meter_exit, 1);
741 m_meter_thread->join ();
747 AudioEngine::start_metering_thread ()
749 if (m_meter_thread == 0) {
750 g_atomic_int_set (&m_meter_exit, 0);
751 m_meter_thread = Glib::Threads::Thread::create (boost::bind (&AudioEngine::meter_thread, this));
756 AudioEngine::meter_thread ()
758 pthread_set_name (X_("meter"));
761 Glib::usleep (10000); /* 1/100th sec interval */
762 if (g_atomic_int_get(&m_meter_exit)) {
770 AudioEngine::set_session (Session *s)
772 Glib::Threads::Mutex::Lock pl (_process_lock);
774 SessionHandlePtr::set_session (s);
778 start_metering_thread ();
780 pframes_t blocksize = jack_get_buffer_size (_jack);
782 /* page in as much of the session process code as we
783 can before we really start running.
786 boost::shared_ptr<Ports> p = ports.reader();
788 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
789 i->second->cycle_start (blocksize);
792 _session->process (blocksize);
793 _session->process (blocksize);
794 _session->process (blocksize);
795 _session->process (blocksize);
796 _session->process (blocksize);
797 _session->process (blocksize);
798 _session->process (blocksize);
799 _session->process (blocksize);
801 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
802 i->second->cycle_end (blocksize);
808 AudioEngine::remove_session ()
810 Glib::Threads::Mutex::Lock lm (_process_lock);
814 stop_metering_thread ();
817 session_remove_pending = true;
818 session_removed.wait(_process_lock);
822 SessionHandlePtr::set_session (0);
829 AudioEngine::port_registration_failure (const std::string& portname)
831 GET_PRIVATE_JACK_POINTER (_jack);
832 string full_portname = jack_client_name;
833 full_portname += ':';
834 full_portname += portname;
837 jack_port_t* p = jack_port_by_name (_priv_jack, full_portname.c_str());
841 reason = string_compose (_("a port with the name \"%1\" already exists: check for duplicated track/bus names"), portname);
843 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);
846 throw PortRegistrationFailure (string_compose (_("AudioEngine: cannot register port \"%1\": %2"), portname, reason).c_str());
849 boost::shared_ptr<Port>
850 AudioEngine::register_port (DataType dtype, const string& portname, bool input)
852 boost::shared_ptr<Port> newport;
855 if (dtype == DataType::AUDIO) {
856 newport.reset (new AudioPort (portname, (input ? Port::IsInput : Port::IsOutput)));
857 } else if (dtype == DataType::MIDI) {
858 newport.reset (new MidiPort (portname, (input ? Port::IsInput : Port::IsOutput)));
860 throw PortRegistrationFailure("unable to create port (unknown type)");
863 RCUWriter<Ports> writer (ports);
864 boost::shared_ptr<Ports> ps = writer.get_copy ();
865 ps->insert (make_pair (make_port_name_relative (portname), newport));
867 /* writer goes out of scope, forces update */
872 catch (PortRegistrationFailure& err) {
874 } catch (std::exception& e) {
875 throw PortRegistrationFailure(string_compose(
876 _("unable to create port: %1"), e.what()).c_str());
878 throw PortRegistrationFailure("unable to create port (unknown error)");
882 boost::shared_ptr<Port>
883 AudioEngine::register_input_port (DataType type, const string& portname)
885 return register_port (type, portname, true);
888 boost::shared_ptr<Port>
889 AudioEngine::register_output_port (DataType type, const string& portname)
891 return register_port (type, portname, false);
895 AudioEngine::unregister_port (boost::shared_ptr<Port> port)
897 /* caller must hold process lock */
900 /* probably happening when the engine has been halted by JACK,
901 in which case, there is nothing we can do here.
907 RCUWriter<Ports> writer (ports);
908 boost::shared_ptr<Ports> ps = writer.get_copy ();
909 Ports::iterator x = ps->find (make_port_name_relative (port->name()));
911 if (x != ps->end()) {
915 /* writer goes out of scope, forces update */
924 AudioEngine::connect (const string& source, const string& destination)
930 fatal << _("connect called before engine was started") << endmsg;
937 string s = make_port_name_non_relative (source);
938 string d = make_port_name_non_relative (destination);
941 boost::shared_ptr<Port> src = get_port_by_name (s);
942 boost::shared_ptr<Port> dst = get_port_by_name (d);
945 ret = src->connect (d);
947 ret = dst->connect (s);
949 /* neither port is known to us, and this API isn't intended for use as a general patch bay */
954 /* already exists - no error, no warning */
955 } else if (ret < 0) {
956 error << string_compose(_("AudioEngine: cannot connect %1 (%2) to %3 (%4)"),
957 source, s, destination, d)
965 AudioEngine::disconnect (const string& source, const string& destination)
971 fatal << _("disconnect called before engine was started") << endmsg;
978 string s = make_port_name_non_relative (source);
979 string d = make_port_name_non_relative (destination);
981 boost::shared_ptr<Port> src = get_port_by_name (s);
982 boost::shared_ptr<Port> dst = get_port_by_name (d);
985 ret = src->disconnect (d);
987 ret = dst->disconnect (s);
989 /* neither port is known to us, and this API isn't intended for use as a general patch bay */
996 AudioEngine::disconnect (boost::shared_ptr<Port> port)
998 GET_PRIVATE_JACK_POINTER_RET (_jack,-1);
1002 fatal << _("disconnect called before engine was started") << endmsg;
1009 return port->disconnect_all ();
1013 AudioEngine::frame_rate () const
1015 GET_PRIVATE_JACK_POINTER_RET (_jack, 0);
1016 if (_frame_rate == 0) {
1017 return (_frame_rate = jack_get_sample_rate (_priv_jack));
1024 AudioEngine::raw_buffer_size (DataType t)
1026 std::map<DataType,size_t>::const_iterator s = _raw_buffer_sizes.find(t);
1027 return (s != _raw_buffer_sizes.end()) ? s->second : 0;
1031 AudioEngine::frames_per_cycle () const
1033 GET_PRIVATE_JACK_POINTER_RET (_jack,0);
1034 if (_buffer_size == 0) {
1035 return jack_get_buffer_size (_jack);
1037 return _buffer_size;
1041 /** @param name Full or short name of port
1042 * @return Corresponding Port or 0.
1045 boost::shared_ptr<Port>
1046 AudioEngine::get_port_by_name (const string& portname)
1050 fatal << _("get_port_by_name() called before engine was started") << endmsg;
1053 boost::shared_ptr<Port> ();
1057 if (!port_is_mine (portname)) {
1058 /* not an ardour port */
1059 return boost::shared_ptr<Port> ();
1062 boost::shared_ptr<Ports> pr = ports.reader();
1063 std::string rel = make_port_name_relative (portname);
1064 Ports::iterator x = pr->find (rel);
1066 if (x != pr->end()) {
1067 /* its possible that the port was renamed by some 3rd party and
1068 we don't know about it. check for this (the check is quick
1069 and cheap), and if so, rename the port (which will alter
1070 the port map as a side effect).
1072 const std::string check = make_port_name_relative (jack_port_name (x->second->jack_port()));
1074 x->second->set_name (check);
1079 return boost::shared_ptr<Port> ();
1083 AudioEngine::port_renamed (const std::string& old_relative_name, const std::string& new_relative_name)
1085 RCUWriter<Ports> writer (ports);
1086 boost::shared_ptr<Ports> p = writer.get_copy();
1087 Ports::iterator x = p->find (old_relative_name);
1089 if (x != p->end()) {
1090 boost::shared_ptr<Port> port = x->second;
1092 p->insert (make_pair (new_relative_name, port));
1097 AudioEngine::get_ports (const string& port_name_pattern, const string& type_name_pattern, uint32_t flags)
1099 GET_PRIVATE_JACK_POINTER_RET (_jack,0);
1102 fatal << _("get_ports called before engine was started") << endmsg;
1108 return jack_get_ports (_priv_jack, port_name_pattern.c_str(), type_name_pattern.c_str(), flags);
1112 AudioEngine::halted_info (jack_status_t code, const char* reason, void *arg)
1114 /* called from jack shutdown handler */
1116 AudioEngine* ae = static_cast<AudioEngine *> (arg);
1117 bool was_running = ae->_running;
1119 ae->stop_metering_thread ();
1121 ae->_running = false;
1122 ae->_buffer_size = 0;
1123 ae->_frame_rate = 0;
1127 #ifdef HAVE_JACK_ON_INFO_SHUTDOWN
1129 case JackBackendError:
1130 ae->Halted(reason); /* EMIT SIGNAL */
1133 ae->Halted(""); /* EMIT SIGNAL */
1136 ae->Halted(""); /* EMIT SIGNAL */
1142 AudioEngine::halted (void *arg)
1144 cerr << "HALTED by JACK\n";
1146 /* called from jack shutdown handler */
1148 AudioEngine* ae = static_cast<AudioEngine *> (arg);
1149 bool was_running = ae->_running;
1151 ae->stop_metering_thread ();
1153 ae->_running = false;
1154 ae->_buffer_size = 0;
1155 ae->_frame_rate = 0;
1159 ae->Halted(""); /* EMIT SIGNAL */
1160 MIDI::JackMIDIPort::JackHalted (); /* EMIT SIGNAL */
1165 AudioEngine::died ()
1167 /* called from a signal handler for SIGPIPE */
1169 stop_metering_thread ();
1178 AudioEngine::can_request_hardware_monitoring ()
1180 GET_PRIVATE_JACK_POINTER_RET (_jack,false);
1181 const char ** ports;
1183 if ((ports = jack_get_ports (_priv_jack, NULL, JACK_DEFAULT_AUDIO_TYPE, JackPortCanMonitor)) == 0) {
1193 AudioEngine::n_physical (unsigned long flags) const
1197 GET_PRIVATE_JACK_POINTER_RET (_jack, c);
1199 const char ** ports = jack_get_ports (_priv_jack, NULL, NULL, JackPortIsPhysical | flags);
1204 for (uint32_t i = 0; ports[i]; ++i) {
1205 if (!strstr (ports[i], "Midi-Through")) {
1206 DataType t (jack_port_type (jack_port_by_name (_jack, ports[i])));
1207 c.set (t, c.get (t) + 1);
1217 AudioEngine::n_physical_inputs () const
1219 return n_physical (JackPortIsInput);
1223 AudioEngine::n_physical_outputs () const
1225 return n_physical (JackPortIsOutput);
1229 AudioEngine::get_physical (DataType type, unsigned long flags, vector<string>& phy)
1231 GET_PRIVATE_JACK_POINTER (_jack);
1232 const char ** ports;
1234 if ((ports = jack_get_ports (_priv_jack, NULL, type.to_jack_type(), JackPortIsPhysical | flags)) == 0) {
1239 for (uint32_t i = 0; ports[i]; ++i) {
1240 if (strstr (ports[i], "Midi-Through")) {
1243 phy.push_back (ports[i]);
1249 /** Get physical ports for which JackPortIsOutput is set; ie those that correspond to
1250 * a physical input connector.
1253 AudioEngine::get_physical_inputs (DataType type, vector<string>& ins)
1255 get_physical (type, JackPortIsOutput, ins);
1258 /** Get physical ports for which JackPortIsInput is set; ie those that correspond to
1259 * a physical output connector.
1262 AudioEngine::get_physical_outputs (DataType type, vector<string>& outs)
1264 get_physical (type, JackPortIsInput, outs);
1268 AudioEngine::transport_stop ()
1270 GET_PRIVATE_JACK_POINTER (_jack);
1271 jack_transport_stop (_priv_jack);
1275 AudioEngine::transport_start ()
1277 GET_PRIVATE_JACK_POINTER (_jack);
1278 jack_transport_start (_priv_jack);
1282 AudioEngine::transport_locate (framepos_t where)
1284 GET_PRIVATE_JACK_POINTER (_jack);
1285 jack_transport_locate (_priv_jack, where);
1288 AudioEngine::TransportState
1289 AudioEngine::transport_state ()
1291 GET_PRIVATE_JACK_POINTER_RET (_jack, ((TransportState) JackTransportStopped));
1292 jack_position_t pos;
1293 return (TransportState) jack_transport_query (_priv_jack, &pos);
1297 AudioEngine::reset_timebase ()
1299 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
1301 if (_session->config.get_jack_time_master()) {
1302 return jack_set_timebase_callback (_priv_jack, 0, _jack_timebase_callback, this);
1304 return jack_release_timebase (_jack);
1311 AudioEngine::freewheel (bool onoff)
1313 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
1315 if (onoff != _freewheeling) {
1316 return jack_set_freewheel (_priv_jack, onoff);
1319 /* already doing what has been asked for */
1325 AudioEngine::remove_all_ports ()
1327 /* make sure that JACK callbacks that will be invoked as we cleanup
1328 * ports know that they have nothing to do.
1331 port_remove_in_progress = true;
1333 /* process lock MUST be held by caller
1337 RCUWriter<Ports> writer (ports);
1338 boost::shared_ptr<Ports> ps = writer.get_copy ();
1342 /* clear dead wood list in RCU */
1346 port_remove_in_progress = false;
1350 AudioEngine::connect_to_jack (string client_name, string session_uuid)
1352 EnvironmentalProtectionAgency* global_epa = EnvironmentalProtectionAgency::get_global_epa ();
1353 boost::scoped_ptr<EnvironmentalProtectionAgency> current_epa;
1354 jack_status_t status;
1356 /* revert all environment settings back to whatever they were when ardour started
1360 current_epa.reset (new EnvironmentalProtectionAgency(true)); /* will restore settings when we leave scope */
1361 global_epa->restore ();
1364 jack_client_name = client_name; /* might be reset below */
1365 #ifdef HAVE_JACK_SESSION
1366 if (! session_uuid.empty())
1367 _jack = jack_client_open (jack_client_name.c_str(), JackSessionID, &status, session_uuid.c_str());
1370 _jack = jack_client_open (jack_client_name.c_str(), JackNullOption, &status, 0);
1372 if (_jack == NULL) {
1373 // error message is not useful here
1377 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
1379 if (status & JackNameNotUnique) {
1380 jack_client_name = jack_get_client_name (_priv_jack);
1387 AudioEngine::disconnect_from_jack ()
1389 GET_PRIVATE_JACK_POINTER_RET (_jack, 0);
1392 stop_metering_thread ();
1396 Glib::Threads::Mutex::Lock lm (_process_lock);
1397 jack_client_close (_priv_jack);
1403 _raw_buffer_sizes.clear();
1407 Stopped(); /* EMIT SIGNAL */
1408 MIDI::JackMIDIPort::JackHalted (); /* EMIT SIGNAL */
1415 AudioEngine::reconnect_to_jack ()
1418 disconnect_from_jack ();
1419 /* XXX give jackd a chance */
1420 Glib::usleep (250000);
1423 if (connect_to_jack (jack_client_name, "")) {
1424 error << _("failed to connect to JACK") << endmsg;
1430 boost::shared_ptr<Ports> p = ports.reader ();
1432 for (i = p->begin(); i != p->end(); ++i) {
1433 if (i->second->reestablish ()) {
1438 if (i != p->end()) {
1440 remove_all_ports ();
1444 GET_PRIVATE_JACK_POINTER_RET (_jack,-1);
1446 MIDI::Manager::instance()->reestablish (_priv_jack);
1449 _session->reset_jack_connection (_priv_jack);
1450 jack_bufsize_callback (jack_get_buffer_size (_priv_jack));
1451 _session->set_frame_rate (jack_get_sample_rate (_priv_jack));
1454 last_monitor_check = 0;
1456 set_jack_callbacks ();
1458 if (jack_activate (_priv_jack) == 0) {
1465 /* re-establish connections */
1467 for (i = p->begin(); i != p->end(); ++i) {
1468 i->second->reconnect ();
1471 MIDI::Manager::instance()->reconnect ();
1473 Running (); /* EMIT SIGNAL*/
1475 start_metering_thread ();
1481 AudioEngine::request_buffer_size (pframes_t nframes)
1483 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
1485 if (nframes == jack_get_buffer_size (_priv_jack)) {
1489 return jack_set_buffer_size (_priv_jack, nframes);
1493 AudioEngine::make_port_name_relative (string portname) const
1495 string::size_type len;
1496 string::size_type n;
1498 len = portname.length();
1500 for (n = 0; n < len; ++n) {
1501 if (portname[n] == ':') {
1506 if ((n != len) && (portname.substr (0, n) == jack_client_name)) {
1507 return portname.substr (n+1);
1514 AudioEngine::make_port_name_non_relative (string portname) const
1518 if (portname.find_first_of (':') != string::npos) {
1522 str = jack_client_name;
1530 AudioEngine::port_is_mine (const string& portname) const
1532 if (portname.find_first_of (':') != string::npos) {
1533 if (portname.substr (0, jack_client_name.length ()) != jack_client_name) {
1541 AudioEngine::is_realtime () const
1543 GET_PRIVATE_JACK_POINTER_RET (_jack,false);
1544 return jack_is_realtime (_priv_jack);
1548 AudioEngine::create_process_thread (boost::function<void()> f, pthread_t* thread, size_t stacksize)
1550 GET_PRIVATE_JACK_POINTER_RET (_jack, 0);
1551 ThreadData* td = new ThreadData (this, f, stacksize);
1553 if (jack_client_create_thread (_priv_jack, thread, jack_client_real_time_priority (_priv_jack),
1554 jack_is_realtime (_priv_jack), _start_process_thread, td)) {
1562 AudioEngine::_start_process_thread (void* arg)
1564 ThreadData* td = reinterpret_cast<ThreadData*> (arg);
1565 boost::function<void()> f = td->f;
1574 AudioEngine::port_is_physical (const std::string& portname) const
1576 GET_PRIVATE_JACK_POINTER_RET(_jack, false);
1578 jack_port_t *port = jack_port_by_name (_priv_jack, portname.c_str());
1584 return jack_port_flags (port) & JackPortIsPhysical;
1588 AudioEngine::request_jack_monitors_input (const std::string& portname, bool yn) const
1590 GET_PRIVATE_JACK_POINTER(_jack);
1592 jack_port_t *port = jack_port_by_name (_priv_jack, portname.c_str());
1598 jack_port_request_monitor (port, yn);
1602 AudioEngine::update_latencies ()
1604 if (jack_recompute_total_latencies) {
1605 GET_PRIVATE_JACK_POINTER (_jack);
1606 jack_recompute_total_latencies (_priv_jack);
1611 AudioEngine::destroy ()