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;
88 port_remove_in_progress = false;
91 g_atomic_int_set (&m_meter_exit, 0);
93 if (connect_to_jack (client_name, session_uuid)) {
94 throw NoBackendAvailable ();
97 Port::set_engine (this);
100 AudioEngine::~AudioEngine ()
103 Glib::Mutex::Lock tm (_process_lock);
104 session_removed.signal ();
107 jack_client_close (_jack);
111 stop_metering_thread ();
116 AudioEngine::jack() const
122 _thread_init_callback (void * /*arg*/)
124 /* make sure that anybody who needs to know about this thread
128 pthread_set_name (X_("audioengine"));
130 PBD::notify_gui_about_thread_creation ("gui", pthread_self(), X_("Audioengine"), 4096);
131 PBD::notify_gui_about_thread_creation ("midiui", pthread_self(), X_("Audioengine"), 128);
133 SessionEvent::create_per_thread_pool (X_("Audioengine"), 512);
135 MIDI::Port::set_process_thread (pthread_self());
139 ardour_jack_error (const char* msg)
141 error << "JACK: " << msg << endmsg;
145 AudioEngine::set_jack_callbacks ()
147 GET_PRIVATE_JACK_POINTER (_jack);
149 if (jack_on_info_shutdown) {
150 jack_on_info_shutdown (_priv_jack, halted_info, this);
152 jack_on_shutdown (_priv_jack, halted, this);
155 jack_set_thread_init_callback (_priv_jack, _thread_init_callback, this);
156 jack_set_process_thread (_priv_jack, _process_thread, this);
157 jack_set_sample_rate_callback (_priv_jack, _sample_rate_callback, this);
158 jack_set_buffer_size_callback (_priv_jack, _bufsize_callback, this);
159 jack_set_graph_order_callback (_priv_jack, _graph_order_callback, this);
160 jack_set_port_registration_callback (_priv_jack, _registration_callback, this);
161 jack_set_port_connect_callback (_priv_jack, _connect_callback, this);
162 jack_set_xrun_callback (_priv_jack, _xrun_callback, this);
163 jack_set_sync_callback (_priv_jack, _jack_sync_callback, this);
164 jack_set_freewheel_callback (_priv_jack, _freewheel_callback, this);
166 if (_session && _session->config.get_jack_time_master()) {
167 jack_set_timebase_callback (_priv_jack, 0, _jack_timebase_callback, this);
170 #ifdef HAVE_JACK_SESSION
171 if( jack_set_session_callback)
172 jack_set_session_callback (_priv_jack, _session_callback, this);
175 if (jack_set_latency_callback) {
176 jack_set_latency_callback (_priv_jack, _latency_callback, this);
179 jack_set_error_function (ardour_jack_error);
183 AudioEngine::start ()
185 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
189 if (!jack_port_type_get_buffer_size) {
190 warning << _("This version of JACK is old - you should upgrade to a newer version that supports jack_port_type_get_buffer_size()") << endmsg;
194 BootMessage (_("Connect session to engine"));
195 _session->set_frame_rate (jack_get_sample_rate (_priv_jack));
198 /* a proxy for whether jack_activate() will definitely call the buffer size
199 * callback. with older versions of JACK, this function symbol will be null.
200 * this is reliable, but not clean.
203 if (!jack_port_type_get_buffer_size) {
204 jack_bufsize_callback (jack_get_buffer_size (_priv_jack));
207 _processed_frames = 0;
208 last_monitor_check = 0;
210 set_jack_callbacks ();
212 if (jack_activate (_priv_jack) == 0) {
215 Running(); /* EMIT SIGNAL */
217 // error << _("cannot activate JACK client") << endmsg;
221 return _running ? 0 : -1;
225 AudioEngine::stop (bool forever)
227 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
231 disconnect_from_jack ();
233 jack_deactivate (_priv_jack);
234 Stopped(); /* EMIT SIGNAL */
235 MIDI::Port::JackHalted (); /* EMIT SIGNAL */
240 stop_metering_thread ();
243 return _running ? -1 : 0;
248 AudioEngine::get_sync_offset (pframes_t& offset) const
251 #ifdef HAVE_JACK_VIDEO_SUPPORT
253 GET_PRIVATE_JACK_POINTER_RET (_jack, false);
258 (void) jack_transport_query (_priv_jack, &pos);
260 if (pos.valid & JackVideoFrameOffset) {
261 offset = pos.video_offset;
274 AudioEngine::_jack_timebase_callback (jack_transport_state_t state, pframes_t nframes,
275 jack_position_t* pos, int new_position, void *arg)
277 static_cast<AudioEngine*> (arg)->jack_timebase_callback (state, nframes, pos, new_position);
281 AudioEngine::jack_timebase_callback (jack_transport_state_t state, pframes_t nframes,
282 jack_position_t* pos, int new_position)
284 if (_jack && _session && _session->synced_to_jack()) {
285 _session->jack_timebase_callback (state, nframes, pos, new_position);
290 AudioEngine::_jack_sync_callback (jack_transport_state_t state, jack_position_t* pos, void* arg)
292 return static_cast<AudioEngine*> (arg)->jack_sync_callback (state, pos);
296 AudioEngine::jack_sync_callback (jack_transport_state_t state, jack_position_t* pos)
298 if (_jack && _session) {
299 return _session->jack_sync_callback (state, pos);
306 AudioEngine::_xrun_callback (void *arg)
308 AudioEngine* ae = static_cast<AudioEngine*> (arg);
309 if (ae->connected()) {
310 ae->Xrun (); /* EMIT SIGNAL */
315 #ifdef HAVE_JACK_SESSION
317 AudioEngine::_session_callback (jack_session_event_t *event, void *arg)
319 printf( "helo.... " );
320 AudioEngine* ae = static_cast<AudioEngine*> (arg);
321 if (ae->connected()) {
322 ae->JackSessionEvent ( event ); /* EMIT SIGNAL */
327 AudioEngine::_graph_order_callback (void *arg)
329 AudioEngine* ae = static_cast<AudioEngine*> (arg);
331 if (ae->connected() && !ae->port_remove_in_progress) {
332 ae->GraphReordered (); /* EMIT SIGNAL */
339 AudioEngine::_process_thread (void *arg)
341 return static_cast<AudioEngine *> (arg)->process_thread ();
345 AudioEngine::_freewheel_callback (int onoff, void *arg)
347 static_cast<AudioEngine*>(arg)->_freewheeling = onoff;
351 AudioEngine::_registration_callback (jack_port_id_t /*id*/, int /*reg*/, void* arg)
353 AudioEngine* ae = static_cast<AudioEngine*> (arg);
355 if (!ae->port_remove_in_progress) {
356 ae->PortRegisteredOrUnregistered (); /* EMIT SIGNAL */
361 AudioEngine::_latency_callback (jack_latency_callback_mode_t mode, void* arg)
363 return static_cast<AudioEngine *> (arg)->jack_latency_callback (mode);
367 AudioEngine::_connect_callback (jack_port_id_t id_a, jack_port_id_t id_b, int conn, void* arg)
369 AudioEngine* ae = static_cast<AudioEngine*> (arg);
371 if (ae->port_remove_in_progress) {
375 GET_PRIVATE_JACK_POINTER (ae->_jack);
377 jack_port_t* jack_port_a = jack_port_by_id (_priv_jack, id_a);
378 jack_port_t* jack_port_b = jack_port_by_id (_priv_jack, id_b);
380 boost::shared_ptr<Port> port_a;
381 boost::shared_ptr<Port> port_b;
383 boost::shared_ptr<Ports> pr = ae->ports.reader ();
384 Ports::iterator i = pr->begin ();
385 while (i != pr->end() && (port_a == 0 || port_b == 0)) {
386 if (jack_port_a == i->second->jack_port()) {
388 } else if (jack_port_b == i->second->jack_port()) {
394 ae->PortConnectedOrDisconnected (
395 port_a, jack_port_name (jack_port_a),
396 port_b, jack_port_name (jack_port_b),
397 conn == 0 ? false : true
402 AudioEngine::split_cycle (pframes_t offset)
404 /* caller must hold process lock */
406 Port::increment_global_port_buffer_offset (offset);
408 /* tell all Ports that we're going to start a new (split) cycle */
410 boost::shared_ptr<Ports> p = ports.reader();
412 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
413 i->second->cycle_split ();
418 AudioEngine::process_thread ()
420 /* JACK doesn't do this for us when we use the wait API
423 _thread_init_callback (0);
425 _main_thread = new ProcessThread;
428 GET_PRIVATE_JACK_POINTER_RET(_jack,0);
430 pframes_t nframes = jack_cycle_wait (_priv_jack);
432 if (process_callback (nframes)) {
436 jack_cycle_signal (_priv_jack, 0);
442 /** Method called by our ::process_thread when there is work to be done.
443 * @param nframes Number of frames to process.
446 AudioEngine::process_callback (pframes_t nframes)
448 GET_PRIVATE_JACK_POINTER_RET(_jack,0);
449 Glib::Mutex::Lock tm (_process_lock, Glib::TRY_LOCK);
454 /// The number of frames that will have been processed when we've finished
455 pframes_t next_processed_frames;
457 /* handle wrap around of total frames counter */
459 if (max_framepos - _processed_frames < nframes) {
460 next_processed_frames = nframes - (max_framepos - _processed_frames);
462 next_processed_frames = _processed_frames + nframes;
465 if (!tm.locked() || _session == 0) {
466 /* return having done nothing */
467 _processed_frames = next_processed_frames;
471 if (session_remove_pending) {
472 /* perform the actual session removal */
474 session_remove_pending = false;
475 session_removed.signal();
476 _processed_frames = next_processed_frames;
480 /* tell all relevant objects that we're starting a new cycle */
482 InternalSend::CycleStart (nframes);
483 Port::set_global_port_buffer_offset (0);
484 Port::set_cycle_framecnt (nframes);
486 /* tell all Ports that we're starting a new cycle */
488 boost::shared_ptr<Ports> p = ports.reader();
490 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
491 i->second->cycle_start (nframes);
494 /* test if we are freewheeling and there are freewheel signals connected.
495 ardour should act normally even when freewheeling unless /it/ is exporting */
498 if (_freewheeling && !Freewheel.empty()) {
499 /* emit the Freewheel signal and stop freewheeling in the event of trouble
501 boost::optional<int> r = Freewheel (nframes);
502 if (r.get_value_or (0)) {
503 jack_set_freewheel (_priv_jack, false);
508 _session->process (nframes);
517 _processed_frames = next_processed_frames;
521 if (last_monitor_check + monitor_check_interval < next_processed_frames) {
523 boost::shared_ptr<Ports> p = ports.reader();
525 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
529 if (i->second->last_monitor() != (x = i->second->jack_monitoring_input ())) {
530 i->second->set_last_monitor (x);
531 /* XXX I think this is dangerous, due to
532 a likely mutex in the signal handlers ...
534 i->second->MonitorInputChanged (x); /* EMIT SIGNAL */
537 last_monitor_check = next_processed_frames;
540 if (_session->silent()) {
542 boost::shared_ptr<Ports> p = ports.reader();
544 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
546 if (i->second->sends_output()) {
547 i->second->get_buffer(nframes).silence(nframes);
554 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
555 i->second->cycle_end (nframes);
558 _processed_frames = next_processed_frames;
566 AudioEngine::_sample_rate_callback (pframes_t nframes, void *arg)
568 return static_cast<AudioEngine *> (arg)->jack_sample_rate_callback (nframes);
572 AudioEngine::jack_sample_rate_callback (pframes_t nframes)
574 _frame_rate = nframes;
575 _usecs_per_cycle = (int) floor ((((double) frames_per_cycle() / nframes)) * 1000000.0);
577 /* check for monitor input change every 1/10th of second */
579 monitor_check_interval = nframes / 10;
580 last_monitor_check = 0;
583 _session->set_frame_rate (nframes);
586 SampleRateChanged (nframes); /* EMIT SIGNAL */
592 AudioEngine::jack_latency_callback (jack_latency_callback_mode_t mode)
595 _session->update_latency (mode == JackPlaybackLatency);
600 AudioEngine::_bufsize_callback (pframes_t nframes, void *arg)
602 return static_cast<AudioEngine *> (arg)->jack_bufsize_callback (nframes);
606 AudioEngine::jack_bufsize_callback (pframes_t nframes)
608 /* if the size has not changed, this should be a no-op */
610 if (nframes == _buffer_size) {
614 GET_PRIVATE_JACK_POINTER_RET (_jack, 1);
616 _buffer_size = nframes;
617 _usecs_per_cycle = (int) floor ((((double) nframes / frame_rate())) * 1000000.0);
618 last_monitor_check = 0;
620 if (jack_port_type_get_buffer_size) {
621 _raw_buffer_sizes[DataType::AUDIO] = jack_port_type_get_buffer_size (_priv_jack, JACK_DEFAULT_AUDIO_TYPE);
622 _raw_buffer_sizes[DataType::MIDI] = jack_port_type_get_buffer_size (_priv_jack, JACK_DEFAULT_MIDI_TYPE);
625 /* Old version of JACK.
627 These crude guesses, see below where we try to get the right answers.
629 Note that our guess for MIDI deliberatey tries to overestimate
630 by a little. It would be nicer if we could get the actual
631 size from a port, but we have to use this estimate in the
632 event that there are no MIDI ports currently. If there are
633 the value will be adjusted below.
636 _raw_buffer_sizes[DataType::AUDIO] = nframes * sizeof (Sample);
637 _raw_buffer_sizes[DataType::MIDI] = nframes * 4 - (nframes/2);
641 Glib::Mutex::Lock lm (_process_lock);
643 boost::shared_ptr<Ports> p = ports.reader();
645 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
651 _session->set_block_size (_buffer_size);
658 AudioEngine::stop_metering_thread ()
660 if (m_meter_thread) {
661 g_atomic_int_set (&m_meter_exit, 1);
662 m_meter_thread->join ();
668 AudioEngine::start_metering_thread ()
670 if (m_meter_thread == 0) {
671 g_atomic_int_set (&m_meter_exit, 0);
672 m_meter_thread = Glib::Thread::create (boost::bind (&AudioEngine::meter_thread, this),
673 500000, true, true, Glib::THREAD_PRIORITY_NORMAL);
678 AudioEngine::meter_thread ()
680 pthread_set_name (X_("meter"));
683 Glib::usleep (10000); /* 1/100th sec interval */
684 if (g_atomic_int_get(&m_meter_exit)) {
692 AudioEngine::set_session (Session *s)
694 Glib::Mutex::Lock pl (_process_lock);
696 SessionHandlePtr::set_session (s);
700 start_metering_thread ();
702 pframes_t blocksize = jack_get_buffer_size (_jack);
704 /* page in as much of the session process code as we
705 can before we really start running.
708 boost::shared_ptr<Ports> p = ports.reader();
710 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
711 i->second->cycle_start (blocksize);
714 _session->process (blocksize);
715 _session->process (blocksize);
716 _session->process (blocksize);
717 _session->process (blocksize);
718 _session->process (blocksize);
719 _session->process (blocksize);
720 _session->process (blocksize);
721 _session->process (blocksize);
723 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
724 i->second->cycle_end (blocksize);
730 AudioEngine::remove_session ()
732 Glib::Mutex::Lock lm (_process_lock);
736 stop_metering_thread ();
739 session_remove_pending = true;
740 session_removed.wait(_process_lock);
744 SessionHandlePtr::set_session (0);
751 AudioEngine::port_registration_failure (const std::string& portname)
753 GET_PRIVATE_JACK_POINTER (_jack);
754 string full_portname = jack_client_name;
755 full_portname += ':';
756 full_portname += portname;
759 jack_port_t* p = jack_port_by_name (_priv_jack, full_portname.c_str());
763 reason = string_compose (_("a port with the name \"%1\" already exists: check for duplicated track/bus names"), portname);
765 reason = string_compose (_("No more JACK ports are available. You will need to stop %1 and restart JACK with ports if you need this many tracks."), PROGRAM_NAME);
768 throw PortRegistrationFailure (string_compose (_("AudioEngine: cannot register port \"%1\": %2"), portname, reason).c_str());
771 boost::shared_ptr<Port>
772 AudioEngine::register_port (DataType dtype, const string& portname, bool input)
774 boost::shared_ptr<Port> newport;
777 if (dtype == DataType::AUDIO) {
778 newport.reset (new AudioPort (portname, (input ? Port::IsInput : Port::IsOutput)));
779 } else if (dtype == DataType::MIDI) {
780 newport.reset (new MidiPort (portname, (input ? Port::IsInput : Port::IsOutput)));
782 throw PortRegistrationFailure("unable to create port (unknown type)");
785 RCUWriter<Ports> writer (ports);
786 boost::shared_ptr<Ports> ps = writer.get_copy ();
787 ps->insert (make_pair (make_port_name_relative (portname), newport));
789 /* writer goes out of scope, forces update */
794 catch (PortRegistrationFailure& err) {
796 } catch (std::exception& e) {
797 throw PortRegistrationFailure(string_compose(
798 _("unable to create port: %1"), e.what()).c_str());
800 throw PortRegistrationFailure("unable to create port (unknown error)");
804 boost::shared_ptr<Port>
805 AudioEngine::register_input_port (DataType type, const string& portname)
807 return register_port (type, portname, true);
810 boost::shared_ptr<Port>
811 AudioEngine::register_output_port (DataType type, const string& portname)
813 return register_port (type, portname, false);
817 AudioEngine::unregister_port (boost::shared_ptr<Port> port)
819 /* caller must hold process lock */
822 /* probably happening when the engine has been halted by JACK,
823 in which case, there is nothing we can do here.
829 RCUWriter<Ports> writer (ports);
830 boost::shared_ptr<Ports> ps = writer.get_copy ();
831 Ports::iterator x = ps->find (make_port_name_relative (port->name()));
833 if (x != ps->end()) {
837 /* writer goes out of scope, forces update */
846 AudioEngine::connect (const string& source, const string& destination)
852 fatal << _("connect called before engine was started") << endmsg;
859 string s = make_port_name_non_relative (source);
860 string d = make_port_name_non_relative (destination);
863 boost::shared_ptr<Port> src = get_port_by_name (s);
864 boost::shared_ptr<Port> dst = get_port_by_name (d);
867 ret = src->connect (d);
869 ret = dst->connect (s);
871 /* neither port is known to us, and this API isn't intended for use as a general patch bay */
876 /* already exists - no error, no warning */
877 } else if (ret < 0) {
878 error << string_compose(_("AudioEngine: cannot connect %1 (%2) to %3 (%4)"),
879 source, s, destination, d)
887 AudioEngine::disconnect (const string& source, const string& destination)
893 fatal << _("disconnect called before engine was started") << endmsg;
900 string s = make_port_name_non_relative (source);
901 string d = make_port_name_non_relative (destination);
903 boost::shared_ptr<Port> src = get_port_by_name (s);
904 boost::shared_ptr<Port> dst = get_port_by_name (d);
907 ret = src->disconnect (d);
909 ret = dst->disconnect (s);
911 /* neither port is known to us, and this API isn't intended for use as a general patch bay */
918 AudioEngine::disconnect (boost::shared_ptr<Port> port)
920 GET_PRIVATE_JACK_POINTER_RET (_jack,-1);
924 fatal << _("disconnect called before engine was started") << endmsg;
931 return port->disconnect_all ();
935 AudioEngine::frame_rate () const
937 GET_PRIVATE_JACK_POINTER_RET (_jack, 0);
938 if (_frame_rate == 0) {
939 return (_frame_rate = jack_get_sample_rate (_priv_jack));
946 AudioEngine::raw_buffer_size (DataType t)
948 std::map<DataType,size_t>::const_iterator s = _raw_buffer_sizes.find(t);
949 return (s != _raw_buffer_sizes.end()) ? s->second : 0;
953 AudioEngine::frames_per_cycle () const
955 GET_PRIVATE_JACK_POINTER_RET (_jack,0);
956 if (_buffer_size == 0) {
957 return jack_get_buffer_size (_jack);
963 /** @param name Full or short name of port
964 * @return Corresponding Port or 0.
967 boost::shared_ptr<Port>
968 AudioEngine::get_port_by_name (const string& portname)
972 fatal << _("get_port_by_name() called before engine was started") << endmsg;
975 boost::shared_ptr<Port> ();
979 if (!port_is_mine (portname)) {
980 /* not an ardour port */
981 return boost::shared_ptr<Port> ();
984 boost::shared_ptr<Ports> pr = ports.reader();
985 std::string rel = make_port_name_relative (portname);
986 Ports::iterator x = pr->find (rel);
988 if (x != pr->end()) {
989 /* its possible that the port was renamed by some 3rd party and
990 we don't know about it. check for this (the check is quick
991 and cheap), and if so, rename the port (which will alter
992 the port map as a side effect).
994 const std::string check = make_port_name_relative (jack_port_name (x->second->jack_port()));
996 x->second->set_name (check);
1001 return boost::shared_ptr<Port> ();
1005 AudioEngine::port_renamed (const std::string& old_relative_name, const std::string& new_relative_name)
1007 RCUWriter<Ports> writer (ports);
1008 boost::shared_ptr<Ports> p = writer.get_copy();
1009 Ports::iterator x = p->find (old_relative_name);
1011 if (x != p->end()) {
1012 boost::shared_ptr<Port> port = x->second;
1014 p->insert (make_pair (new_relative_name, port));
1019 AudioEngine::get_ports (const string& port_name_pattern, const string& type_name_pattern, uint32_t flags)
1021 GET_PRIVATE_JACK_POINTER_RET (_jack,0);
1024 fatal << _("get_ports called before engine was started") << endmsg;
1030 return jack_get_ports (_priv_jack, port_name_pattern.c_str(), type_name_pattern.c_str(), flags);
1034 AudioEngine::halted_info (jack_status_t code, const char* reason, void *arg)
1036 /* called from jack shutdown handler */
1038 AudioEngine* ae = static_cast<AudioEngine *> (arg);
1039 bool was_running = ae->_running;
1041 ae->stop_metering_thread ();
1043 ae->_running = false;
1044 ae->_buffer_size = 0;
1045 ae->_frame_rate = 0;
1049 #ifdef HAVE_JACK_ON_INFO_SHUTDOWN
1051 case JackBackendError:
1052 ae->Halted(reason); /* EMIT SIGNAL */
1055 ae->Halted(""); /* EMIT SIGNAL */
1058 ae->Halted(""); /* EMIT SIGNAL */
1064 AudioEngine::halted (void *arg)
1066 cerr << "HALTED by JACK\n";
1068 /* called from jack shutdown handler */
1070 AudioEngine* ae = static_cast<AudioEngine *> (arg);
1071 bool was_running = ae->_running;
1073 ae->stop_metering_thread ();
1075 ae->_running = false;
1076 ae->_buffer_size = 0;
1077 ae->_frame_rate = 0;
1081 ae->Halted(""); /* EMIT SIGNAL */
1082 MIDI::Port::JackHalted (); /* EMIT SIGNAL */
1087 AudioEngine::died ()
1089 /* called from a signal handler for SIGPIPE */
1091 stop_metering_thread ();
1100 AudioEngine::can_request_hardware_monitoring ()
1102 GET_PRIVATE_JACK_POINTER_RET (_jack,false);
1103 const char ** ports;
1105 if ((ports = jack_get_ports (_priv_jack, NULL, JACK_DEFAULT_AUDIO_TYPE, JackPortCanMonitor)) == 0) {
1115 AudioEngine::n_physical (unsigned long flags) const
1119 GET_PRIVATE_JACK_POINTER_RET (_jack, c);
1121 const char ** ports = jack_get_ports (_priv_jack, NULL, NULL, JackPortIsPhysical | flags);
1126 for (uint32_t i = 0; ports[i]; ++i) {
1127 if (!strstr (ports[i], "Midi-Through")) {
1128 DataType t (jack_port_type (jack_port_by_name (_jack, ports[i])));
1129 c.set (t, c.get (t) + 1);
1139 AudioEngine::n_physical_inputs () const
1141 return n_physical (JackPortIsInput);
1145 AudioEngine::n_physical_outputs () const
1147 return n_physical (JackPortIsOutput);
1151 AudioEngine::get_physical (DataType type, unsigned long flags, vector<string>& phy)
1153 GET_PRIVATE_JACK_POINTER (_jack);
1154 const char ** ports;
1156 if ((ports = jack_get_ports (_priv_jack, NULL, type.to_jack_type(), JackPortIsPhysical | flags)) == 0) {
1161 for (uint32_t i = 0; ports[i]; ++i) {
1162 if (strstr (ports[i], "Midi-Through")) {
1165 phy.push_back (ports[i]);
1171 /** Get physical ports for which JackPortIsOutput is set; ie those that correspond to
1172 * a physical input connector.
1175 AudioEngine::get_physical_inputs (DataType type, vector<string>& ins)
1177 get_physical (type, JackPortIsOutput, ins);
1180 /** Get physical ports for which JackPortIsInput is set; ie those that correspond to
1181 * a physical output connector.
1184 AudioEngine::get_physical_outputs (DataType type, vector<string>& outs)
1186 get_physical (type, JackPortIsInput, outs);
1190 AudioEngine::transport_stop ()
1192 GET_PRIVATE_JACK_POINTER (_jack);
1193 jack_transport_stop (_priv_jack);
1197 AudioEngine::transport_start ()
1199 GET_PRIVATE_JACK_POINTER (_jack);
1200 jack_transport_start (_priv_jack);
1204 AudioEngine::transport_locate (framepos_t where)
1206 GET_PRIVATE_JACK_POINTER (_jack);
1207 jack_transport_locate (_priv_jack, where);
1210 AudioEngine::TransportState
1211 AudioEngine::transport_state ()
1213 GET_PRIVATE_JACK_POINTER_RET (_jack, ((TransportState) JackTransportStopped));
1214 jack_position_t pos;
1215 return (TransportState) jack_transport_query (_priv_jack, &pos);
1219 AudioEngine::reset_timebase ()
1221 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
1223 if (_session->config.get_jack_time_master()) {
1224 return jack_set_timebase_callback (_priv_jack, 0, _jack_timebase_callback, this);
1226 return jack_release_timebase (_jack);
1233 AudioEngine::freewheel (bool onoff)
1235 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
1237 if (onoff != _freewheeling) {
1238 return jack_set_freewheel (_priv_jack, onoff);
1241 /* already doing what has been asked for */
1247 AudioEngine::remove_all_ports ()
1249 /* make sure that JACK callbacks that will be invoked as we cleanup
1250 * ports know that they have nothing to do.
1253 port_remove_in_progress = true;
1255 /* process lock MUST be held by caller
1259 RCUWriter<Ports> writer (ports);
1260 boost::shared_ptr<Ports> ps = writer.get_copy ();
1264 /* clear dead wood list in RCU */
1268 port_remove_in_progress = false;
1272 AudioEngine::connect_to_jack (string client_name, string session_uuid)
1274 EnvironmentalProtectionAgency* global_epa = EnvironmentalProtectionAgency::get_global_epa ();
1275 boost::scoped_ptr<EnvironmentalProtectionAgency> current_epa;
1276 jack_options_t options = JackNullOption;
1277 jack_status_t status;
1278 const char *server_name = NULL;
1280 /* revert all environment settings back to whatever they were when ardour started
1284 current_epa.reset (new EnvironmentalProtectionAgency(true)); /* will restore settings when we leave scope */
1285 global_epa->restore ();
1288 jack_client_name = client_name; /* might be reset below */
1289 #ifdef HAVE_JACK_SESSION
1290 if (! session_uuid.empty())
1291 _jack = jack_client_open (jack_client_name.c_str(), JackSessionID, &status, session_uuid.c_str());
1294 _jack = jack_client_open (jack_client_name.c_str(), options, &status, server_name);
1296 if (_jack == NULL) {
1297 // error message is not useful here
1301 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
1303 if (status & JackNameNotUnique) {
1304 jack_client_name = jack_get_client_name (_priv_jack);
1311 AudioEngine::disconnect_from_jack ()
1313 GET_PRIVATE_JACK_POINTER_RET (_jack, 0);
1316 stop_metering_thread ();
1320 Glib::Mutex::Lock lm (_process_lock);
1321 jack_client_close (_priv_jack);
1327 _raw_buffer_sizes.clear();
1331 Stopped(); /* EMIT SIGNAL */
1332 MIDI::Port::JackHalted (); /* EMIT SIGNAL */
1339 AudioEngine::reconnect_to_jack ()
1342 disconnect_from_jack ();
1343 /* XXX give jackd a chance */
1344 Glib::usleep (250000);
1347 if (connect_to_jack (jack_client_name, "")) {
1348 error << _("failed to connect to JACK") << endmsg;
1354 boost::shared_ptr<Ports> p = ports.reader ();
1356 for (i = p->begin(); i != p->end(); ++i) {
1357 if (i->second->reestablish ()) {
1362 if (i != p->end()) {
1364 remove_all_ports ();
1368 GET_PRIVATE_JACK_POINTER_RET (_jack,-1);
1370 MIDI::Manager::instance()->reestablish (_priv_jack);
1373 _session->reset_jack_connection (_priv_jack);
1374 jack_bufsize_callback (jack_get_buffer_size (_priv_jack));
1375 _session->set_frame_rate (jack_get_sample_rate (_priv_jack));
1378 last_monitor_check = 0;
1380 set_jack_callbacks ();
1382 if (jack_activate (_priv_jack) == 0) {
1389 /* re-establish connections */
1391 for (i = p->begin(); i != p->end(); ++i) {
1392 i->second->reconnect ();
1395 MIDI::Manager::instance()->reconnect ();
1397 Running (); /* EMIT SIGNAL*/
1399 start_metering_thread ();
1405 AudioEngine::request_buffer_size (pframes_t nframes)
1407 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
1409 if (nframes == jack_get_buffer_size (_priv_jack)) {
1413 return jack_set_buffer_size (_priv_jack, nframes);
1417 AudioEngine::make_port_name_relative (string portname) const
1419 string::size_type len;
1420 string::size_type n;
1422 len = portname.length();
1424 for (n = 0; n < len; ++n) {
1425 if (portname[n] == ':') {
1430 if ((n != len) && (portname.substr (0, n) == jack_client_name)) {
1431 return portname.substr (n+1);
1438 AudioEngine::make_port_name_non_relative (string portname) const
1442 if (portname.find_first_of (':') != string::npos) {
1446 str = jack_client_name;
1454 AudioEngine::port_is_mine (const string& portname) const
1456 if (portname.find_first_of (':') != string::npos) {
1457 if (portname.substr (0, jack_client_name.length ()) != jack_client_name) {
1465 AudioEngine::is_realtime () const
1467 GET_PRIVATE_JACK_POINTER_RET (_jack,false);
1468 return jack_is_realtime (_priv_jack);
1472 AudioEngine::create_process_thread (boost::function<void()> f, pthread_t* thread, size_t stacksize)
1474 GET_PRIVATE_JACK_POINTER_RET (_jack, 0);
1475 ThreadData* td = new ThreadData (this, f, stacksize);
1477 if (jack_client_create_thread (_priv_jack, thread, jack_client_real_time_priority (_priv_jack),
1478 jack_is_realtime (_priv_jack), _start_process_thread, td)) {
1486 AudioEngine::_start_process_thread (void* arg)
1488 ThreadData* td = reinterpret_cast<ThreadData*> (arg);
1489 boost::function<void()> f = td->f;
1498 AudioEngine::port_is_physical (const std::string& portname) const
1500 GET_PRIVATE_JACK_POINTER_RET(_jack, false);
1502 jack_port_t *port = jack_port_by_name (_priv_jack, portname.c_str());
1508 return jack_port_flags (port) & JackPortIsPhysical;
1512 AudioEngine::request_jack_monitors_input (const std::string& portname, bool yn) const
1514 GET_PRIVATE_JACK_POINTER(_jack);
1516 jack_port_t *port = jack_port_by_name (_priv_jack, portname.c_str());
1522 jack_port_request_monitor (port, yn);
1526 AudioEngine::update_latencies ()
1528 if (jack_recompute_total_latencies) {
1529 GET_PRIVATE_JACK_POINTER (_jack);
1530 jack_recompute_total_latencies (_priv_jack);
1535 AudioEngine::destroy ()