2 Copyright (C) 2013 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.
20 #include <jack/jack.h>
22 #include "ardour/audioengine.h"
23 #include "ardour/types.h"
24 #include "ardour/jack_audiobackend.h"
26 using namespace ARDOUR;
29 #define GET_PRIVATE_JACK_POINTER(j) jack_client_t* _priv_jack = (jack_client_t*) (j); if (!_priv_jack) { return; }
30 #define GET_PRIVATE_JACK_POINTER_RET(j,r) jack_client_t* _priv_jack = (jack_client_t*) (j); if (!_priv_jack) { return r; }
32 JACKAudioBackend::JACKAudioBackend (AudioEngine& e)
35 , _target_sample_rate (48000)
36 , _target_buffer_size (1024)
37 , _target_sample_format (FloatingPoint)
38 , _target_interleaved (false)
39 , _target_input_channels (-1)
40 , _target_output_channels (-1)
41 , _target_systemic_input_latency (0)
42 , _target_systemic_output_latency (0)
47 JACKAudioBackend::set_device_name (const string& dev)
54 JACKAudioBackend::start ()
56 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
60 if (!jack_port_type_get_buffer_size) {
61 warning << _("This version of JACK is old - you should upgrade to a newer version that supports jack_port_type_get_buffer_size()") << endmsg;
65 BootMessage (_("Connect session to engine"));
66 _session->set_frame_rate (jack_get_sample_rate (_priv_jack));
69 /* a proxy for whether jack_activate() will definitely call the buffer size
70 * callback. with older versions of JACK, this function symbol will be null.
71 * this is reliable, but not clean.
74 if (!jack_port_type_get_buffer_size) {
75 jack_bufsize_callback (jack_get_buffer_size (_priv_jack));
78 _processed_frames = 0;
79 last_monitor_check = 0;
81 set_jack_callbacks ();
83 if (jack_activate (_priv_jack) == 0) {
86 Running(); /* EMIT SIGNAL */
88 // error << _("cannot activate JACK client") << endmsg;
92 return _running ? 0 : -1;
96 JACKAudioBackend::stop ()
98 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
101 Glib::Threads::Mutex::Lock lm (_process_lock);
102 jack_client_close (_priv_jack);
108 _raw_buffer_sizes.clear();
114 JACKAudioBackend::pause ()
116 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
119 jack_deactivate (_priv_jack);
126 JACKAudioBackend::freewheel (bool onoff)
128 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
130 if (onoff == _freewheeling) {
131 /* already doing what has been asked for */
136 return jack_set_freewheel (_priv_jack, onoff);
140 JACKAudioBackend::set_parameters (const Parameters& params)
146 JACKAudioBackend::get_parameters (Parameters& params) const
154 AudioEngine::frames_per_cycle () const
156 GET_PRIVATE_JACK_POINTER_RET (_jack,0);
157 if (_buffer_size == 0) {
158 return jack_get_buffer_size (_jack);
165 AudioEngine::frame_rate () const
167 GET_PRIVATE_JACK_POINTER_RET (_jack, 0);
168 if (_frame_rate == 0) {
169 return (_frame_rate = jack_get_sample_rate (_priv_jack));
176 AudioEngine::raw_buffer_size (DataType t)
178 std::map<DataType,size_t>::const_iterator s = _raw_buffer_sizes.find(t);
179 return (s != _raw_buffer_sizes.end()) ? s->second : 0;
184 /*--- private support methods ---*/
187 JACKAudioBackend::connect_to_jack (string client_name, string session_uuid)
189 EnvironmentalProtectionAgency* global_epa = EnvironmentalProtectionAgency::get_global_epa ();
190 boost::scoped_ptr<EnvironmentalProtectionAgency> current_epa;
191 jack_status_t status;
193 /* revert all environment settings back to whatever they were when ardour started
197 current_epa.reset (new EnvironmentalProtectionAgency(true)); /* will restore settings when we leave scope */
198 global_epa->restore ();
201 jack_client_name = client_name; /* might be reset below */
202 #ifdef HAVE_JACK_SESSION
203 if (!session_uuid.empty())
204 _jack = jack_client_open (jack_client_name.c_str(), JackSessionID, &status, session_uuid.c_str());
207 _jack = jack_client_open (jack_client_name.c_str(), JackNullOption, &status, 0);
210 // error message is not useful here
214 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
216 if (status & JackNameNotUnique) {
217 jack_client_name = jack_get_client_name (_priv_jack);
224 JACKAudioBackend::disconnect_from_jack ()
228 JACKAudioBackend::reconnect_to_jack ()
231 disconnect_from_jack ();
232 /* XXX give jackd a chance */
233 Glib::usleep (250000);
236 if (connect_to_jack (jack_client_name, "")) {
237 error << _("failed to connect to JACK") << endmsg;
243 boost::shared_ptr<Ports> p = ports.reader ();
245 for (i = p->begin(); i != p->end(); ++i) {
246 if (i->second->reestablish ()) {
257 GET_PRIVATE_JACK_POINTER_RET (_jack,-1);
259 MIDI::Manager::instance()->reestablish (_priv_jack);
262 _session->reset_jack_connection (_priv_jack);
263 jack_bufsize_callback (jack_get_buffer_size (_priv_jack));
264 _session->set_frame_rate (jack_get_sample_rate (_priv_jack));
267 last_monitor_check = 0;
269 set_jack_callbacks ();
271 if (jack_activate (_priv_jack) == 0) {
278 /* re-establish connections */
280 for (i = p->begin(); i != p->end(); ++i) {
281 i->second->reconnect ();
284 MIDI::Manager::instance()->reconnect ();
286 Running (); /* EMIT SIGNAL*/
288 start_metering_thread ();
294 JACKAudioBackend::request_buffer_size (pframes_t nframes)
296 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
298 if (nframes == jack_get_buffer_size (_priv_jack)) {
302 return jack_set_buffer_size (_priv_jack, nframes);
305 /* --- TRANSPORT STATE MANAGEMENT --- */
308 JACKAudioBackend::transport_stop ()
310 GET_PRIVATE_JACK_POINTER (_jack);
311 jack_transport_stop (_priv_jack);
315 JACKAudioBackend::transport_start ()
317 GET_PRIVATE_JACK_POINTER (_jack);
318 jack_transport_start (_priv_jack);
322 JACKAudioBackend::transport_locate (framepos_t where)
324 GET_PRIVATE_JACK_POINTER (_jack);
325 jack_transport_locate (_priv_jack, where);
329 JACKAudioBackend::transport_frame () const
331 GET_PRIVATE_JACK_POINTER_RET (_jack, 0);
332 return jack_get_current_transport_frame (_priv_jack);
335 JACKAudioBackend::TransportState
336 JACKAudioBackend::transport_state ()
338 GET_PRIVATE_JACK_POINTER_RET (_jack, ((TransportState) JackTransportStopped));
340 return (TransportState) jack_transport_query (_priv_jack, &pos);
344 JACKAudioBackend::set_time_master (bool yn)
346 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
348 return jack_set_timebase_callback (_priv_jack, 0, _jack_timebase_callback, this);
350 return jack_release_timebase (_jack);
356 framecnt_t frame_rate () const;
357 pframes_t frames_per_cycle () const;
359 size_t raw_buffer_size(DataType t);
361 int usecs_per_cycle () const { return _usecs_per_cycle; }
364 JACKAudioBackend::get_sync_offset (pframes_t& offset) const
367 #ifdef HAVE_JACK_VIDEO_SUPPORT
369 GET_PRIVATE_JACK_POINTER_RET (_jack, false);
374 (void) jack_transport_query (_priv_jack, &pos);
376 if (pos.valid & JackVideoFrameOffset) {
377 offset = pos.video_offset;
390 JACKAudioBackend::frames_since_cycle_start ()
392 jack_client_t* _priv_jack = _jack;
393 if (!_running || !_priv_jack) {
396 return jack_frames_since_cycle_start (_priv_jack);
400 JACKAudioBackend::frame_time ()
402 jack_client_t* _priv_jack = _jack;
403 if (!_running || !_priv_jack) {
406 return jack_frame_time (_priv_jack);
410 JACKAudioBackend::frame_time_at_cycle_start ()
412 jack_client_t* _priv_jack = _jack;
413 if (!_running || !_priv_jack) {
416 return jack_last_frame_time (_priv_jack);
422 ardour_jack_error (const char* msg)
424 error << "JACK: " << msg << endmsg;
428 JACKAudioBackend::set_jack_callbacks ()
430 GET_PRIVATE_JACK_POINTER (_jack);
432 if (jack_on_info_shutdown) {
433 jack_on_info_shutdown (_priv_jack, halted_info, this);
435 jack_on_shutdown (_priv_jack, halted, this);
438 jack_set_thread_init_callback (_priv_jack, _thread_init_callback, this);
439 jack_set_process_thread (_priv_jack, _process_thread, this);
440 jack_set_sample_rate_callback (_priv_jack, _sample_rate_callback, this);
441 jack_set_buffer_size_callback (_priv_jack, _bufsize_callback, this);
442 jack_set_graph_order_callback (_priv_jack, _graph_order_callback, this);
443 jack_set_port_registration_callback (_priv_jack, _registration_callback, this);
444 jack_set_port_connect_callback (_priv_jack, _connect_callback, this);
445 jack_set_xrun_callback (_priv_jack, _xrun_callback, this);
446 jack_set_sync_callback (_priv_jack, _jack_sync_callback, this);
447 jack_set_freewheel_callback (_priv_jack, _freewheel_callback, this);
449 if (_session && _session->config.get_jack_time_master()) {
450 jack_set_timebase_callback (_priv_jack, 0, _jack_timebase_callback, this);
453 #ifdef HAVE_JACK_SESSION
454 if( jack_set_session_callback)
455 jack_set_session_callback (_priv_jack, _session_callback, this);
458 if (jack_set_latency_callback) {
459 jack_set_latency_callback (_priv_jack, _latency_callback, this);
462 jack_set_error_function (ardour_jack_error);
466 JACKAudioBackend::_jack_timebase_callback (jack_transport_state_t state, pframes_t nframes,
467 jack_position_t* pos, int new_position, void *arg)
469 static_cast<AudioEngine*> (arg)->jack_timebase_callback (state, nframes, pos, new_position);
473 JACKAudioBackend::jack_timebase_callback (jack_transport_state_t state, pframes_t nframes,
474 jack_position_t* pos, int new_position)
476 if (_jack && _session && _session->synced_to_jack()) {
477 _session->jack_timebase_callback (state, nframes, pos, new_position);
482 JACKAudioBackend::_jack_sync_callback (jack_transport_state_t state, jack_position_t* pos, void* arg)
484 return static_cast<AudioEngine*> (arg)->jack_sync_callback (state, pos);
488 JACKAudioBackend::jack_sync_callback (jack_transport_state_t state, jack_position_t* pos)
490 if (_jack && _session) {
491 return _session->jack_sync_callback (state, pos);
498 JACKAudioBackend::_xrun_callback (void *arg)
500 AudioEngine* ae = static_cast<AudioEngine*> (arg);
501 if (ae->connected()) {
502 ae->Xrun (); /* EMIT SIGNAL */
507 #ifdef HAVE_JACK_SESSION
509 JACKAudioBackend::_session_callback (jack_session_event_t *event, void *arg)
511 AudioEngine* ae = static_cast<AudioEngine*> (arg);
512 if (ae->connected()) {
513 ae->JackSessionEvent ( event ); /* EMIT SIGNAL */
519 JACKAudioBackend::_graph_order_callback (void *arg)
521 AudioEngine* ae = static_cast<AudioEngine*> (arg);
523 if (ae->connected() && !ae->port_remove_in_progress) {
524 ae->GraphReordered (); /* EMIT SIGNAL */
531 JACKAudioBackend::_freewheel_callback (int onoff, void *arg)
533 static_cast<AudioEngine*>(arg)->freewheel_callback (onoff);
537 JACKAudioBackend::freewheel_callback (int onoff)
539 _freewheeling = onoff;
542 _pre_freewheel_mmc_enabled = MIDI::Manager::instance()->mmc()->send_enabled ();
543 MIDI::Manager::instance()->mmc()->enable_send (false);
545 MIDI::Manager::instance()->mmc()->enable_send (_pre_freewheel_mmc_enabled);
550 JACKAudioBackend::_registration_callback (jack_port_id_t /*id*/, int /*reg*/, void* arg)
552 AudioEngine* ae = static_cast<AudioEngine*> (arg);
554 if (!ae->port_remove_in_progress) {
555 ae->PortRegisteredOrUnregistered (); /* EMIT SIGNAL */
560 JACKAudioBackend::_latency_callback (jack_latency_callback_mode_t mode, void* arg)
562 return static_cast<AudioEngine *> (arg)->jack_latency_callback (mode);
566 JACKAudioBackend::_connect_callback (jack_port_id_t id_a, jack_port_id_t id_b, int conn, void* arg)
568 AudioEngine* ae = static_cast<AudioEngine*> (arg);
569 ae->connect_callback (id_a, id_b, conn);
573 JACKAudioBackend::connect_callback (jack_port_id_t id_a, jack_port_id_t id_b, int conn)
575 if (port_remove_in_progress) {
579 GET_PRIVATE_JACK_POINTER (_jack);
581 jack_port_t* jack_port_a = jack_port_by_id (_priv_jack, id_a);
582 jack_port_t* jack_port_b = jack_port_by_id (_priv_jack, id_b);
584 boost::shared_ptr<Port> port_a;
585 boost::shared_ptr<Port> port_b;
587 boost::shared_ptr<Ports> pr = ports.reader ();
590 x = pr->find (make_port_name_relative (jack_port_name (jack_port_a)));
591 if (x != pr->end()) {
595 x = pr->find (make_port_name_relative (jack_port_name (jack_port_b)));
596 if (x != pr->end()) {
600 PortConnectedOrDisconnected (
601 port_a, jack_port_name (jack_port_a),
602 port_b, jack_port_name (jack_port_b),
603 conn == 0 ? false : true
608 JACKAudioBackend::create_process_thread (boost::function<void()> f, pthread_t* thread, size_t stacksize)
610 GET_PRIVATE_JACK_POINTER_RET (_jack, 0);
611 ThreadData* td = new ThreadData (this, f, stacksize);
613 if (jack_client_create_thread (_priv_jack, thread, jack_client_real_time_priority (_priv_jack),
614 jack_is_realtime (_priv_jack), _start_process_thread, td)) {
622 JACKAudioBackend::_start_process_thread (void* arg)
624 ThreadData* td = reinterpret_cast<ThreadData*> (arg);
625 boost::function<void()> f = td->f;
634 JACKAudioBackend::_process_thread (void *arg)
636 return static_cast<AudioEngine *> (arg)->process_thread ();
640 JACKAudioBackend::process_thread ()
642 /* JACK doesn't do this for us when we use the wait API
645 _thread_init_callback (0);
647 _main_thread = new ProcessThread;
650 GET_PRIVATE_JACK_POINTER_RET(_jack,0);
652 pframes_t nframes = jack_cycle_wait (_priv_jack);
654 if (engine.process_callback (nframes)) {
658 jack_cycle_signal (_priv_jack, 0);
665 JACKAudioBackend::_sample_rate_callback (pframes_t nframes, void *arg)
667 return static_cast<AudioEngine *> (arg)->jack_sample_rate_callback (nframes);
671 JACKAudioBackend::jack_sample_rate_callback (pframes_t nframes)
673 _frame_rate = nframes;
674 _usecs_per_cycle = (int) floor ((((double) frames_per_cycle() / nframes)) * 1000000.0);
676 /* check for monitor input change every 1/10th of second */
678 monitor_check_interval = nframes / 10;
679 last_monitor_check = 0;
682 _session->set_frame_rate (nframes);
685 SampleRateChanged (nframes); /* EMIT SIGNAL */
691 JACKAudioBackend::jack_latency_callback (jack_latency_callback_mode_t mode)
694 _session->update_latency (mode == JackPlaybackLatency);
699 JACKAudioBackend::_bufsize_callback (pframes_t nframes, void *arg)
701 return static_cast<AudioEngine *> (arg)->jack_bufsize_callback (nframes);
705 JACKAudioBackend::jack_bufsize_callback (pframes_t nframes)
707 /* if the size has not changed, this should be a no-op */
709 if (nframes == _buffer_size) {
713 GET_PRIVATE_JACK_POINTER_RET (_jack, 1);
715 _buffer_size = nframes;
716 _usecs_per_cycle = (int) floor ((((double) nframes / frame_rate())) * 1000000.0);
717 last_monitor_check = 0;
719 if (jack_port_type_get_buffer_size) {
720 _raw_buffer_sizes[DataType::AUDIO] = jack_port_type_get_buffer_size (_priv_jack, JACK_DEFAULT_AUDIO_TYPE);
721 _raw_buffer_sizes[DataType::MIDI] = jack_port_type_get_buffer_size (_priv_jack, JACK_DEFAULT_MIDI_TYPE);
724 /* Old version of JACK.
726 These crude guesses, see below where we try to get the right answers.
728 Note that our guess for MIDI deliberatey tries to overestimate
729 by a little. It would be nicer if we could get the actual
730 size from a port, but we have to use this estimate in the
731 event that there are no MIDI ports currently. If there are
732 the value will be adjusted below.
735 _raw_buffer_sizes[DataType::AUDIO] = nframes * sizeof (Sample);
736 _raw_buffer_sizes[DataType::MIDI] = nframes * 4 - (nframes/2);
740 Glib::Threads::Mutex::Lock lm (_process_lock);
742 boost::shared_ptr<Ports> p = ports.reader();
744 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
750 _session->set_block_size (_buffer_size);
757 JACKAudioBackend::halted_info (jack_status_t code, const char* reason, void *arg)
759 /* called from jack shutdown handler */
761 AudioEngine* ae = static_cast<AudioEngine *> (arg);
762 bool was_running = ae->_running;
764 ae->stop_metering_thread ();
766 ae->_running = false;
767 ae->_buffer_size = 0;
772 MIDI::JackMIDIPort::JackHalted (); /* EMIT SIGNAL */
773 #ifdef HAVE_JACK_ON_INFO_SHUTDOWN
775 case JackBackendError:
776 ae->Halted(reason); /* EMIT SIGNAL */
779 ae->Halted(""); /* EMIT SIGNAL */
782 ae->Halted(""); /* EMIT SIGNAL */
788 JACKAudioBackend::halted (void *arg)
790 cerr << "HALTED by JACK\n";
792 /* called from jack shutdown handler */
794 AudioEngine* ae = static_cast<AudioEngine *> (arg);
795 bool was_running = ae->_running;
797 ae->stop_metering_thread ();
799 ae->_running = false;
800 ae->_buffer_size = 0;
805 MIDI::JackMIDIPort::JackHalted (); /* EMIT SIGNAL */
806 ae->Halted(""); /* EMIT SIGNAL */