2 Copyright (C) 2002 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
27 #include <glibmm/timer.h>
28 #include <jack/weakjack.h>
29 #include <jack/jack.h>
30 #include <jack/thread.h>
32 #include "pbd/pthread_utils.h"
33 #include "pbd/stacktrace.h"
34 #include "pbd/unknown_type.h"
37 #include "midi++/port.h"
38 #include "midi++/mmc.h"
39 #include "midi++/manager.h"
41 #include "ardour/amp.h"
42 #include "ardour/audio_port.h"
43 #include "ardour/audioengine.h"
44 #include "ardour/buffer.h"
45 #include "ardour/buffer_set.h"
46 #include "ardour/cycle_timer.h"
47 #include "ardour/delivery.h"
48 #include "ardour/event_type_map.h"
49 #include "ardour/internal_return.h"
50 #include "ardour/io.h"
51 #include "ardour/meter.h"
52 #include "ardour/midi_port.h"
53 #include "ardour/process_thread.h"
54 #include "ardour/port.h"
55 #include "ardour/port_set.h"
56 #include "ardour/session.h"
57 #include "ardour/timestamps.h"
58 #include "ardour/utils.h"
63 using namespace ARDOUR;
66 gint AudioEngine::m_meter_exit;
67 AudioEngine* AudioEngine::_instance = 0;
69 #define GET_PRIVATE_JACK_POINTER(j) jack_client_t* _priv_jack = (jack_client_t*) (j); if (!_priv_jack) { return; }
70 #define GET_PRIVATE_JACK_POINTER_RET(j,r) jack_client_t* _priv_jack = (jack_client_t*) (j); if (!_priv_jack) { return r; }
72 AudioEngine::AudioEngine (string client_name, string session_uuid)
75 _instance = this; /* singleton */
77 session_remove_pending = false;
80 last_monitor_check = 0;
81 monitor_check_interval = INT32_MAX;
82 _processed_frames = 0;
87 _freewheeling = false;
89 port_remove_in_progress = false;
92 g_atomic_int_set (&m_meter_exit, 0);
94 if (connect_to_jack (client_name, session_uuid)) {
95 throw NoBackendAvailable ();
98 Port::set_engine (this);
100 // Initialize parameter metadata (e.g. ranges)
101 Evoral::Parameter p(NullAutomation);
102 p = EventTypeMap::instance().new_parameter(NullAutomation);
103 p = EventTypeMap::instance().new_parameter(GainAutomation);
104 p = EventTypeMap::instance().new_parameter(PanAzimuthAutomation);
105 p = EventTypeMap::instance().new_parameter(PanElevationAutomation);
106 p = EventTypeMap::instance().new_parameter(PanWidthAutomation);
107 p = EventTypeMap::instance().new_parameter(PluginAutomation);
108 p = EventTypeMap::instance().new_parameter(SoloAutomation);
109 p = EventTypeMap::instance().new_parameter(MuteAutomation);
110 p = EventTypeMap::instance().new_parameter(MidiCCAutomation);
111 p = EventTypeMap::instance().new_parameter(MidiPgmChangeAutomation);
112 p = EventTypeMap::instance().new_parameter(MidiPitchBenderAutomation);
113 p = EventTypeMap::instance().new_parameter(MidiChannelPressureAutomation);
114 p = EventTypeMap::instance().new_parameter(FadeInAutomation);
115 p = EventTypeMap::instance().new_parameter(FadeOutAutomation);
116 p = EventTypeMap::instance().new_parameter(EnvelopeAutomation);
117 p = EventTypeMap::instance().new_parameter(MidiCCAutomation);
120 AudioEngine::~AudioEngine ()
123 Glib::Mutex::Lock tm (_process_lock);
124 session_removed.signal ();
127 jack_client_close (_jack);
131 stop_metering_thread ();
136 AudioEngine::jack() const
142 _thread_init_callback (void * /*arg*/)
144 /* make sure that anybody who needs to know about this thread
148 pthread_set_name (X_("audioengine"));
150 PBD::notify_gui_about_thread_creation ("gui", pthread_self(), X_("Audioengine"), 4096);
151 PBD::notify_gui_about_thread_creation ("midiui", pthread_self(), X_("Audioengine"), 128);
153 SessionEvent::create_per_thread_pool (X_("Audioengine"), 512);
155 MIDI::Port::set_process_thread (pthread_self());
159 ardour_jack_error (const char* msg)
161 error << "JACK: " << msg << endmsg;
165 AudioEngine::set_jack_callbacks ()
167 GET_PRIVATE_JACK_POINTER (_jack);
169 if (jack_on_info_shutdown) {
170 jack_on_info_shutdown (_priv_jack, halted_info, this);
172 jack_on_shutdown (_priv_jack, halted, this);
175 jack_set_thread_init_callback (_priv_jack, _thread_init_callback, this);
176 jack_set_process_thread (_priv_jack, _process_thread, this);
177 jack_set_sample_rate_callback (_priv_jack, _sample_rate_callback, this);
178 jack_set_buffer_size_callback (_priv_jack, _bufsize_callback, this);
179 jack_set_graph_order_callback (_priv_jack, _graph_order_callback, this);
180 jack_set_port_registration_callback (_priv_jack, _registration_callback, this);
181 jack_set_port_connect_callback (_priv_jack, _connect_callback, this);
182 jack_set_xrun_callback (_priv_jack, _xrun_callback, this);
183 jack_set_sync_callback (_priv_jack, _jack_sync_callback, this);
184 jack_set_freewheel_callback (_priv_jack, _freewheel_callback, this);
186 if (_session && _session->config.get_jack_time_master()) {
187 jack_set_timebase_callback (_priv_jack, 0, _jack_timebase_callback, this);
190 #ifdef HAVE_JACK_SESSION
191 if( jack_set_session_callback)
192 jack_set_session_callback (_priv_jack, _session_callback, this);
195 if (jack_set_latency_callback) {
196 jack_set_latency_callback (_priv_jack, _latency_callback, this);
199 jack_set_error_function (ardour_jack_error);
203 AudioEngine::start ()
205 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
211 if (jack_port_type_get_buffer_size) {
212 blocksize = jack_port_type_get_buffer_size (_priv_jack, JACK_DEFAULT_AUDIO_TYPE);
214 warning << _("This version of JACK is old - you should upgrade to a newer version that supports jack_port_type_get_buffer_size()") << endmsg;
215 blocksize = jack_get_buffer_size (_priv_jack);
219 BootMessage (_("Connect session to engine"));
220 _session->set_block_size (blocksize);
221 _session->set_frame_rate (jack_get_sample_rate (_priv_jack));
224 _processed_frames = 0;
225 last_monitor_check = 0;
227 set_jack_callbacks ();
229 /* a proxy for whether jack_activate() will definitely call the buffer size
230 * callback. with older versions of JACK, this function symbol will be null.
231 * this is reliable, but not clean.
234 if (!jack_port_type_get_buffer_size) {
235 jack_bufsize_callback (blocksize);
238 if (jack_activate (_priv_jack) == 0) {
241 Running(); /* EMIT SIGNAL */
243 // error << _("cannot activate JACK client") << endmsg;
247 return _running ? 0 : -1;
251 AudioEngine::stop (bool forever)
253 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
257 disconnect_from_jack ();
259 jack_deactivate (_priv_jack);
260 Stopped(); /* EMIT SIGNAL */
261 MIDI::Port::JackHalted (); /* EMIT SIGNAL */
266 stop_metering_thread ();
269 return _running ? -1 : 0;
274 AudioEngine::get_sync_offset (pframes_t& offset) const
277 #ifdef HAVE_JACK_VIDEO_SUPPORT
279 GET_PRIVATE_JACK_POINTER_RET (_jack, false);
284 (void) jack_transport_query (_priv_jack, &pos);
286 if (pos.valid & JackVideoFrameOffset) {
287 offset = pos.video_offset;
300 AudioEngine::_jack_timebase_callback (jack_transport_state_t state, pframes_t nframes,
301 jack_position_t* pos, int new_position, void *arg)
303 static_cast<AudioEngine*> (arg)->jack_timebase_callback (state, nframes, pos, new_position);
307 AudioEngine::jack_timebase_callback (jack_transport_state_t state, pframes_t nframes,
308 jack_position_t* pos, int new_position)
310 if (_jack && _session && _session->synced_to_jack()) {
311 _session->jack_timebase_callback (state, nframes, pos, new_position);
316 AudioEngine::_jack_sync_callback (jack_transport_state_t state, jack_position_t* pos, void* arg)
318 return static_cast<AudioEngine*> (arg)->jack_sync_callback (state, pos);
322 AudioEngine::jack_sync_callback (jack_transport_state_t state, jack_position_t* pos)
324 if (_jack && _session) {
325 return _session->jack_sync_callback (state, pos);
332 AudioEngine::_xrun_callback (void *arg)
334 AudioEngine* ae = static_cast<AudioEngine*> (arg);
335 if (ae->connected()) {
336 ae->Xrun (); /* EMIT SIGNAL */
341 #ifdef HAVE_JACK_SESSION
343 AudioEngine::_session_callback (jack_session_event_t *event, void *arg)
345 printf( "helo.... " );
346 AudioEngine* ae = static_cast<AudioEngine*> (arg);
347 if (ae->connected()) {
348 ae->JackSessionEvent ( event ); /* EMIT SIGNAL */
353 AudioEngine::_graph_order_callback (void *arg)
355 AudioEngine* ae = static_cast<AudioEngine*> (arg);
356 if (ae->port_remove_in_progress) {
357 cerr << "skip reorder callback - PRiP\n";
359 if (ae->connected() && !ae->port_remove_in_progress) {
360 ae->GraphReordered (); /* EMIT SIGNAL */
365 /** Wrapped which is called by JACK as its process callback. It is just
366 * here to get us back into C++ land by calling AudioEngine::process_callback()
367 * @param nframes Number of frames passed by JACK.
368 * @param arg User argument passed by JACK, which will be the AudioEngine*.
371 AudioEngine::_process_callback (pframes_t nframes, void *arg)
373 return static_cast<AudioEngine *> (arg)->process_callback (nframes);
377 AudioEngine::_process_thread (void *arg)
379 return static_cast<AudioEngine *> (arg)->process_thread ();
383 AudioEngine::_freewheel_callback (int onoff, void *arg)
385 static_cast<AudioEngine*>(arg)->_freewheeling = onoff;
389 AudioEngine::_registration_callback (jack_port_id_t /*id*/, int /*reg*/, void* arg)
391 AudioEngine* ae = static_cast<AudioEngine*> (arg);
393 if (ae->port_remove_in_progress) {
394 cerr << "skip registration callback - PRiP\n";
396 if (!ae->port_remove_in_progress) {
397 ae->PortRegisteredOrUnregistered (); /* EMIT SIGNAL */
402 AudioEngine::_latency_callback (jack_latency_callback_mode_t mode, void* arg)
404 return static_cast<AudioEngine *> (arg)->jack_latency_callback (mode);
408 AudioEngine::_connect_callback (jack_port_id_t id_a, jack_port_id_t id_b, int conn, void* arg)
410 AudioEngine* ae = static_cast<AudioEngine*> (arg);
412 if (ae->port_remove_in_progress) {
413 cerr << "skip connect callback - PRiP\n";
417 GET_PRIVATE_JACK_POINTER (ae->_jack);
419 jack_port_t* jack_port_a = jack_port_by_id (_priv_jack, id_a);
420 jack_port_t* jack_port_b = jack_port_by_id (_priv_jack, id_b);
425 boost::shared_ptr<Ports> pr = ae->ports.reader ();
426 Ports::iterator i = pr->begin ();
427 while (i != pr->end() && (port_a == 0 || port_b == 0)) {
428 if (jack_port_a == (*i)->jack_port()) {
430 } else if (jack_port_b == (*i)->jack_port()) {
436 ae->PortConnectedOrDisconnected (port_a, port_b, conn == 0 ? false : true); /* EMIT SIGNAL */
440 AudioEngine::split_cycle (pframes_t offset)
442 /* caller must hold process lock */
444 Port::increment_global_port_buffer_offset (offset);
446 /* tell all Ports that we're going to start a new (split) cycle */
448 boost::shared_ptr<Ports> p = ports.reader();
450 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
451 (*i)->cycle_split ();
456 AudioEngine::process_thread ()
458 /* JACK doesn't do this for us when we use the wait API
461 _thread_init_callback (0);
463 _main_thread = new ProcessThread;
466 GET_PRIVATE_JACK_POINTER_RET(_jack,0);
468 pframes_t nframes = jack_cycle_wait (_priv_jack);
470 if (process_callback (nframes)) {
471 cerr << "--- process\n";
475 jack_cycle_signal (_priv_jack, 0);
481 /** Method called by JACK (via _process_callback) which says that there
482 * is work to be done.
483 * @param nframes Number of frames to process.
486 AudioEngine::process_callback (pframes_t nframes)
488 GET_PRIVATE_JACK_POINTER_RET(_jack,0);
489 // CycleTimer ct ("AudioEngine::process");
490 Glib::Mutex::Lock tm (_process_lock, Glib::TRY_LOCK);
492 /// The number of frames that will have been processed when we've finished
493 pframes_t next_processed_frames;
495 /* handle wrap around of total frames counter */
497 if (max_framepos - _processed_frames < nframes) {
498 next_processed_frames = nframes - (max_framepos - _processed_frames);
500 next_processed_frames = _processed_frames + nframes;
503 if (!tm.locked() || _session == 0) {
504 /* return having done nothing */
505 _processed_frames = next_processed_frames;
509 if (session_remove_pending) {
510 /* perform the actual session removal */
512 session_remove_pending = false;
513 session_removed.signal();
514 _processed_frames = next_processed_frames;
518 /* tell all relevant objects that we're starting a new cycle */
520 Delivery::CycleStart (nframes);
521 Port::set_global_port_buffer_offset (0);
522 Port::set_cycle_framecnt (nframes);
523 InternalReturn::CycleStart (nframes);
525 /* tell all Ports that we're starting a new cycle */
527 boost::shared_ptr<Ports> p = ports.reader();
529 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
530 (*i)->cycle_start (nframes);
533 /* test if we are freewheeling and there are freewheel signals connected.
534 ardour should act normally even when freewheeling unless /it/ is exporting */
537 if (_freewheeling && !Freewheel.empty()) {
538 /* emit the Freewheel signal and stop freewheeling in the event of trouble
540 boost::optional<int> r = Freewheel (nframes);
541 if (r.get_value_or (0)) {
542 jack_set_freewheel (_priv_jack, false);
547 _session->process (nframes);
557 _processed_frames = next_processed_frames;
561 if (last_monitor_check + monitor_check_interval < next_processed_frames) {
563 boost::shared_ptr<Ports> p = ports.reader();
565 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
570 if (port->last_monitor() != (x = port->monitoring_input ())) {
571 port->set_last_monitor (x);
572 /* XXX I think this is dangerous, due to
573 a likely mutex in the signal handlers ...
575 port->MonitorInputChanged (x); /* EMIT SIGNAL */
578 last_monitor_check = next_processed_frames;
581 if (_session->silent()) {
583 boost::shared_ptr<Ports> p = ports.reader();
585 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
589 if (port->sends_output()) {
590 port->get_buffer(nframes).silence(nframes);
597 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
598 (*i)->cycle_end (nframes);
601 _processed_frames = next_processed_frames;
606 AudioEngine::_sample_rate_callback (pframes_t nframes, void *arg)
608 return static_cast<AudioEngine *> (arg)->jack_sample_rate_callback (nframes);
612 AudioEngine::jack_sample_rate_callback (pframes_t nframes)
614 _frame_rate = nframes;
615 _usecs_per_cycle = (int) floor ((((double) frames_per_cycle() / nframes)) * 1000000.0);
617 /* check for monitor input change every 1/10th of second */
619 monitor_check_interval = nframes / 10;
620 last_monitor_check = 0;
623 _session->set_frame_rate (nframes);
626 SampleRateChanged (nframes); /* EMIT SIGNAL */
632 AudioEngine::jack_latency_callback (jack_latency_callback_mode_t mode)
635 _session->update_latency (mode == JackPlaybackLatency);
640 AudioEngine::_bufsize_callback (pframes_t nframes, void *arg)
642 return static_cast<AudioEngine *> (arg)->jack_bufsize_callback (nframes);
646 AudioEngine::jack_bufsize_callback (pframes_t nframes)
648 /* if the size has not changed, this should be a no-op */
650 if (nframes == _buffer_size) {
654 GET_PRIVATE_JACK_POINTER_RET (_jack, 1);
656 _buffer_size = nframes;
657 _usecs_per_cycle = (int) floor ((((double) nframes / frame_rate())) * 1000000.0);
658 last_monitor_check = 0;
660 if (jack_port_type_get_buffer_size) {
661 _raw_buffer_sizes[DataType::AUDIO] = jack_port_type_get_buffer_size (_priv_jack, JACK_DEFAULT_AUDIO_TYPE);
662 _raw_buffer_sizes[DataType::MIDI] = jack_port_type_get_buffer_size (_priv_jack, JACK_DEFAULT_MIDI_TYPE);
665 /* Old version of JACK.
667 These crude guesses, see below where we try to get the right answers.
669 Note that our guess for MIDI deliberatey tries to overestimate
670 by a little. It would be nicer if we could get the actual
671 size from a port, but we have to use this estimate in the
672 event that there are no MIDI ports currently. If there are
673 the value will be adjusted below.
676 _raw_buffer_sizes[DataType::AUDIO] = nframes * sizeof (Sample);
677 _raw_buffer_sizes[DataType::MIDI] = nframes * 4 - (nframes/2);
681 Glib::Mutex::Lock lm (_process_lock);
683 boost::shared_ptr<Ports> p = ports.reader();
685 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
691 _session->set_block_size (_buffer_size);
698 AudioEngine::stop_metering_thread ()
700 if (m_meter_thread) {
701 g_atomic_int_set (&m_meter_exit, 1);
702 m_meter_thread->join ();
708 AudioEngine::start_metering_thread ()
710 if (m_meter_thread == 0) {
711 g_atomic_int_set (&m_meter_exit, 0);
712 m_meter_thread = Glib::Thread::create (boost::bind (&AudioEngine::meter_thread, this),
713 500000, true, true, Glib::THREAD_PRIORITY_NORMAL);
718 AudioEngine::meter_thread ()
720 pthread_set_name (X_("meter"));
723 Glib::usleep (10000); /* 1/100th sec interval */
724 if (g_atomic_int_get(&m_meter_exit)) {
732 AudioEngine::set_session (Session *s)
734 Glib::Mutex::Lock pl (_process_lock);
736 SessionHandlePtr::set_session (s);
740 start_metering_thread ();
742 pframes_t blocksize = jack_get_buffer_size (_jack);
744 /* page in as much of the session process code as we
745 can before we really start running.
748 boost::shared_ptr<Ports> p = ports.reader();
750 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
751 (*i)->cycle_start (blocksize);
754 _session->process (blocksize);
755 _session->process (blocksize);
756 _session->process (blocksize);
757 _session->process (blocksize);
758 _session->process (blocksize);
759 _session->process (blocksize);
760 _session->process (blocksize);
761 _session->process (blocksize);
763 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
764 (*i)->cycle_end (blocksize);
770 AudioEngine::remove_session ()
772 Glib::Mutex::Lock lm (_process_lock);
776 stop_metering_thread ();
779 session_remove_pending = true;
780 session_removed.wait(_process_lock);
784 SessionHandlePtr::set_session (0);
791 AudioEngine::port_registration_failure (const std::string& portname)
793 GET_PRIVATE_JACK_POINTER (_jack);
794 string full_portname = jack_client_name;
795 full_portname += ':';
796 full_portname += portname;
799 jack_port_t* p = jack_port_by_name (_priv_jack, full_portname.c_str());
803 reason = string_compose (_("a port with the name \"%1\" already exists: check for duplicated track/bus names"), portname);
805 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);
808 throw PortRegistrationFailure (string_compose (_("AudioEngine: cannot register port \"%1\": %2"), portname, reason).c_str());
812 AudioEngine::register_port (DataType dtype, const string& portname, bool input)
817 if (dtype == DataType::AUDIO) {
818 newport = new AudioPort (portname, (input ? Port::IsInput : Port::IsOutput));
819 } else if (dtype == DataType::MIDI) {
820 newport = new MidiPort (portname, (input ? Port::IsInput : Port::IsOutput));
822 throw PortRegistrationFailure("unable to create port (unknown type)");
825 size_t& old_buffer_size = _raw_buffer_sizes[newport->type()];
826 size_t port_buffer_size = newport->raw_buffer_size(0);
827 if (port_buffer_size > old_buffer_size) {
828 old_buffer_size = port_buffer_size;
831 RCUWriter<Ports> writer (ports);
832 boost::shared_ptr<Ports> ps = writer.get_copy ();
833 ps->insert (ps->begin(), newport);
835 /* writer goes out of scope, forces update */
840 catch (PortRegistrationFailure& err) {
842 } catch (std::exception& e) {
843 throw PortRegistrationFailure(string_compose(
844 _("unable to create port: %1"), e.what()).c_str());
846 throw PortRegistrationFailure("unable to create port (unknown error)");
851 AudioEngine::register_input_port (DataType type, const string& portname)
853 return register_port (type, portname, true);
857 AudioEngine::register_output_port (DataType type, const string& portname)
859 return register_port (type, portname, false);
863 AudioEngine::unregister_port (Port& port)
865 /* caller must hold process lock */
868 /* probably happening when the engine has been halted by JACK,
869 in which case, there is nothing we can do here.
875 RCUWriter<Ports> writer (ports);
876 boost::shared_ptr<Ports> ps = writer.get_copy ();
878 for (Ports::iterator i = ps->begin(); i != ps->end(); ++i) {
886 /* writer goes out of scope, forces update */
893 AudioEngine::connect (const string& source, const string& destination)
899 fatal << _("connect called before engine was started") << endmsg;
906 string s = make_port_name_non_relative (source);
907 string d = make_port_name_non_relative (destination);
910 Port* src = get_port_by_name (s);
911 Port* dst = get_port_by_name (d);
914 ret = src->connect (d);
916 ret = dst->connect (s);
918 /* neither port is known to us, and this API isn't intended for use as a general patch bay */
923 /* already exists - no error, no warning */
924 } else if (ret < 0) {
925 error << string_compose(_("AudioEngine: cannot connect %1 (%2) to %3 (%4)"),
926 source, s, destination, d)
934 AudioEngine::disconnect (const string& source, const string& destination)
940 fatal << _("disconnect called before engine was started") << endmsg;
947 string s = make_port_name_non_relative (source);
948 string d = make_port_name_non_relative (destination);
950 Port* src = get_port_by_name (s);
951 Port* dst = get_port_by_name (d);
954 ret = src->disconnect (d);
956 ret = dst->disconnect (s);
958 /* neither port is known to us, and this API isn't intended for use as a general patch bay */
965 AudioEngine::disconnect (Port& port)
967 GET_PRIVATE_JACK_POINTER_RET (_jack,-1);
971 fatal << _("disconnect called before engine was started") << endmsg;
978 return port.disconnect_all ();
982 AudioEngine::frame_rate () const
984 GET_PRIVATE_JACK_POINTER_RET (_jack, 0);
985 if (_frame_rate == 0) {
986 return (_frame_rate = jack_get_sample_rate (_priv_jack));
993 AudioEngine::raw_buffer_size (DataType t)
995 std::map<DataType,size_t>::const_iterator s = _raw_buffer_sizes.find(t);
996 return (s != _raw_buffer_sizes.end()) ? s->second : 0;
1000 AudioEngine::frames_per_cycle () const
1002 GET_PRIVATE_JACK_POINTER_RET (_jack,0);
1003 if (_buffer_size == 0) {
1004 return jack_get_buffer_size (_jack);
1006 return _buffer_size;
1010 /** @param name Full or short name of port
1011 * @return Corresponding Port* or 0. This object remains the property of the AudioEngine
1012 * so must not be deleted.
1015 AudioEngine::get_port_by_name (const string& portname)
1019 fatal << _("get_port_by_name() called before engine was started") << endmsg;
1026 if (!port_is_mine (portname)) {
1027 /* not an ardour port */
1031 std::string const rel = make_port_name_relative (portname);
1033 boost::shared_ptr<Ports> pr = ports.reader();
1035 for (Ports::iterator i = pr->begin(); i != pr->end(); ++i) {
1036 if (rel == (*i)->name()) {
1045 AudioEngine::get_ports (const string& port_name_pattern, const string& type_name_pattern, uint32_t flags)
1047 GET_PRIVATE_JACK_POINTER_RET (_jack,0);
1050 fatal << _("get_ports called before engine was started") << endmsg;
1056 return jack_get_ports (_priv_jack, port_name_pattern.c_str(), type_name_pattern.c_str(), flags);
1060 AudioEngine::halted_info (jack_status_t code, const char* reason, void *arg)
1062 /* called from jack shutdown handler */
1064 AudioEngine* ae = static_cast<AudioEngine *> (arg);
1065 bool was_running = ae->_running;
1067 ae->stop_metering_thread ();
1069 ae->_running = false;
1070 ae->_buffer_size = 0;
1071 ae->_frame_rate = 0;
1075 #ifdef HAVE_JACK_ON_INFO_SHUTDOWN
1077 case JackBackendError:
1078 ae->Halted(reason); /* EMIT SIGNAL */
1081 ae->Halted(""); /* EMIT SIGNAL */
1084 ae->Halted(""); /* EMIT SIGNAL */
1090 AudioEngine::halted (void *arg)
1092 cerr << "HALTED by JACK\n";
1094 /* called from jack shutdown handler */
1096 AudioEngine* ae = static_cast<AudioEngine *> (arg);
1097 bool was_running = ae->_running;
1099 ae->stop_metering_thread ();
1101 ae->_running = false;
1102 ae->_buffer_size = 0;
1103 ae->_frame_rate = 0;
1107 ae->Halted(""); /* EMIT SIGNAL */
1108 MIDI::Port::JackHalted (); /* EMIT SIGNAL */
1113 AudioEngine::died ()
1115 /* called from a signal handler for SIGPIPE */
1117 stop_metering_thread ();
1126 AudioEngine::can_request_hardware_monitoring ()
1128 GET_PRIVATE_JACK_POINTER_RET (_jack,false);
1129 const char ** ports;
1131 if ((ports = jack_get_ports (_priv_jack, NULL, JACK_DEFAULT_AUDIO_TYPE, JackPortCanMonitor)) == 0) {
1141 AudioEngine::n_physical (unsigned long flags) const
1145 GET_PRIVATE_JACK_POINTER_RET (_jack, c);
1147 const char ** ports = jack_get_ports (_priv_jack, NULL, NULL, JackPortIsPhysical | flags);
1152 for (uint32_t i = 0; ports[i]; ++i) {
1153 if (!strstr (ports[i], "Midi-Through")) {
1154 DataType t (jack_port_type (jack_port_by_name (_jack, ports[i])));
1155 c.set (t, c.get (t) + 1);
1165 AudioEngine::n_physical_inputs () const
1167 return n_physical (JackPortIsInput);
1171 AudioEngine::n_physical_outputs () const
1173 return n_physical (JackPortIsOutput);
1177 AudioEngine::get_physical (DataType type, unsigned long flags, vector<string>& phy)
1179 GET_PRIVATE_JACK_POINTER (_jack);
1180 const char ** ports;
1182 if ((ports = jack_get_ports (_priv_jack, NULL, type.to_jack_type(), JackPortIsPhysical | flags)) == 0) {
1187 for (uint32_t i = 0; ports[i]; ++i) {
1188 if (strstr (ports[i], "Midi-Through")) {
1191 phy.push_back (ports[i]);
1197 /** Get physical ports for which JackPortIsOutput is set; ie those that correspond to
1198 * a physical input connector.
1201 AudioEngine::get_physical_inputs (DataType type, vector<string>& ins)
1203 get_physical (type, JackPortIsOutput, ins);
1206 /** Get physical ports for which JackPortIsInput is set; ie those that correspond to
1207 * a physical output connector.
1210 AudioEngine::get_physical_outputs (DataType type, vector<string>& outs)
1212 get_physical (type, JackPortIsInput, outs);
1216 AudioEngine::transport_stop ()
1218 GET_PRIVATE_JACK_POINTER (_jack);
1219 jack_transport_stop (_priv_jack);
1223 AudioEngine::transport_start ()
1225 GET_PRIVATE_JACK_POINTER (_jack);
1226 jack_transport_start (_priv_jack);
1230 AudioEngine::transport_locate (framepos_t where)
1232 GET_PRIVATE_JACK_POINTER (_jack);
1233 // cerr << "tell JACK to locate to " << where << endl;
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
1285 vector<Port*> to_be_deleted;
1288 RCUWriter<Ports> writer (ports);
1289 boost::shared_ptr<Ports> ps = writer.get_copy ();
1290 for (Ports::iterator i = ps->begin(); i != ps->end(); ++i) {
1291 to_be_deleted.push_back (*i);
1296 /* clear dead wood list in RCU */
1300 /* now do the actual deletion, given that "ports" is now empty, thus
1301 preventing anyone else from getting a handle on a Port
1304 for (vector<Port*>::iterator p = to_be_deleted.begin(); p != to_be_deleted.end(); ++p) {
1308 port_remove_in_progress = false;
1312 AudioEngine::connect_to_jack (string client_name, string session_uuid)
1314 EnvironmentalProtectionAgency* global_epa = EnvironmentalProtectionAgency::get_global_epa ();
1315 boost::scoped_ptr<EnvironmentalProtectionAgency> current_epa;
1316 jack_options_t options = JackNullOption;
1317 jack_status_t status;
1318 const char *server_name = NULL;
1320 /* revert all environment settings back to whatever they were when ardour started
1324 current_epa.reset (new EnvironmentalProtectionAgency(true)); /* will restore settings when we leave scope */
1325 global_epa->restore ();
1328 jack_client_name = client_name; /* might be reset below */
1329 #ifdef HAVE_JACK_SESSION
1330 if (! session_uuid.empty())
1331 _jack = jack_client_open (jack_client_name.c_str(), JackSessionID, &status, session_uuid.c_str());
1334 _jack = jack_client_open (jack_client_name.c_str(), options, &status, server_name);
1336 if (_jack == NULL) {
1337 // error message is not useful here
1341 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
1343 if (status & JackNameNotUnique) {
1344 jack_client_name = jack_get_client_name (_priv_jack);
1351 AudioEngine::disconnect_from_jack ()
1353 GET_PRIVATE_JACK_POINTER_RET (_jack, 0);
1356 stop_metering_thread ();
1360 Glib::Mutex::Lock lm (_process_lock);
1361 jack_client_close (_priv_jack);
1367 _raw_buffer_sizes.clear();
1371 Stopped(); /* EMIT SIGNAL */
1372 MIDI::Port::JackHalted (); /* EMIT SIGNAL */
1379 AudioEngine::reconnect_to_jack ()
1382 disconnect_from_jack ();
1383 /* XXX give jackd a chance */
1384 Glib::usleep (250000);
1387 if (connect_to_jack (jack_client_name, "")) {
1388 error << _("failed to connect to JACK") << endmsg;
1394 boost::shared_ptr<Ports> p = ports.reader ();
1396 for (i = p->begin(); i != p->end(); ++i) {
1397 if ((*i)->reestablish ()) {
1402 if (i != p->end()) {
1404 remove_all_ports ();
1408 GET_PRIVATE_JACK_POINTER_RET (_jack,-1);
1410 MIDI::Manager::instance()->reestablish (_priv_jack);
1413 _session->reset_jack_connection (_priv_jack);
1414 jack_bufsize_callback (jack_get_buffer_size (_priv_jack));
1415 _session->set_frame_rate (jack_get_sample_rate (_priv_jack));
1418 last_monitor_check = 0;
1420 set_jack_callbacks ();
1422 if (jack_activate (_priv_jack) == 0) {
1429 /* re-establish connections */
1431 for (i = p->begin(); i != p->end(); ++i) {
1435 MIDI::Manager::instance()->reconnect ();
1437 Running (); /* EMIT SIGNAL*/
1439 start_metering_thread ();
1445 AudioEngine::request_buffer_size (pframes_t nframes)
1447 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
1449 if (nframes == jack_get_buffer_size (_priv_jack)) {
1453 return jack_set_buffer_size (_priv_jack, nframes);
1457 AudioEngine::update_total_latencies ()
1459 GET_PRIVATE_JACK_POINTER (_jack);
1460 jack_recompute_total_latencies (_priv_jack);
1464 AudioEngine::make_port_name_relative (string portname) const
1466 string::size_type len;
1467 string::size_type n;
1469 len = portname.length();
1471 for (n = 0; n < len; ++n) {
1472 if (portname[n] == ':') {
1477 if ((n != len) && (portname.substr (0, n) == jack_client_name)) {
1478 return portname.substr (n+1);
1485 AudioEngine::make_port_name_non_relative (string portname) const
1489 if (portname.find_first_of (':') != string::npos) {
1493 str = jack_client_name;
1501 AudioEngine::port_is_mine (const string& portname) const
1503 if (portname.find_first_of (':') != string::npos) {
1504 if (portname.substr (0, jack_client_name.length ()) != jack_client_name) {
1512 AudioEngine::is_realtime () const
1514 GET_PRIVATE_JACK_POINTER_RET (_jack,false);
1515 return jack_is_realtime (_priv_jack);
1519 AudioEngine::create_process_thread (boost::function<void()> f, pthread_t* thread, size_t stacksize)
1521 GET_PRIVATE_JACK_POINTER_RET (_jack, 0);
1522 ThreadData* td = new ThreadData (this, f, stacksize);
1524 if (jack_client_create_thread (_priv_jack, thread, jack_client_real_time_priority (_priv_jack),
1525 jack_is_realtime (_priv_jack), _start_process_thread, td)) {
1533 AudioEngine::_start_process_thread (void* arg)
1535 ThreadData* td = reinterpret_cast<ThreadData*> (arg);
1536 boost::function<void()> f = td->f;
1545 AudioEngine::port_is_physical (const std::string& portname) const
1547 GET_PRIVATE_JACK_POINTER_RET(_jack, false);
1549 jack_port_t *port = jack_port_by_name (_priv_jack, portname.c_str());
1555 return jack_port_flags (port) & JackPortIsPhysical;
1559 AudioEngine::ensure_monitor_input (const std::string& portname, bool yn) const
1561 GET_PRIVATE_JACK_POINTER(_jack);
1563 jack_port_t *port = jack_port_by_name (_priv_jack, portname.c_str());
1569 jack_port_request_monitor (port, yn);