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.
22 #include <boost/scoped_ptr.hpp>
23 #include <glibmm/timer.h>
25 #include "pbd/error.h"
27 #include "midi++/manager.h"
29 #include "ardour/audioengine.h"
30 #include "ardour/types.h"
31 #include "ardour/jack_audiobackend.h"
32 #include "ardour/jack_connection.h"
33 #include "ardour/jack_portengine.h"
37 using namespace ARDOUR;
42 #define GET_PRIVATE_JACK_POINTER(localvar) jack_client_t* localvar = _jack_connection->jack(); if (!(localvar)) { return; }
43 #define GET_PRIVATE_JACK_POINTER_RET(localvar,r) jack_client_t* localvar = _jack_connection->jack(); if (!(localvar)) { return r; }
45 JACKAudioBackend::JACKAudioBackend (AudioEngine& e, boost::shared_ptr<JackConnection> jc)
47 , _jack_connection (jc)
49 , _freewheeling (false)
50 , _target_sample_rate (48000)
51 , _target_buffer_size (1024)
52 , _target_sample_format (FormatFloat)
53 , _target_interleaved (false)
54 , _target_input_channels (-1)
55 , _target_output_channels (-1)
56 , _target_systemic_input_latency (0)
57 , _target_systemic_output_latency (0)
61 JACKAudioBackend::~JACKAudioBackend()
66 JACKAudioBackend::name() const
72 JACKAudioBackend::private_handle() const
74 return _jack_connection->jack();
78 JACKAudioBackend::connected() const
80 return (private_handle() != 0);
84 JACKAudioBackend::is_realtime () const
86 GET_PRIVATE_JACK_POINTER_RET (_priv_jack,false);
87 return jack_is_realtime (_priv_jack);
91 JACKAudioBackend::enumerate_devices () const
93 vector<string> devices;
98 JACKAudioBackend::available_sample_rates (const string& /*device*/) const
103 f.push_back (sample_rate());
107 /* if JACK is not already running, just list a bunch of reasonable
108 values and let the future sort it all out.
111 f.push_back (8000.0);
112 f.push_back (16000.0);
113 f.push_back (24000.0);
114 f.push_back (32000.0);
115 f.push_back (44100.0);
116 f.push_back (48000.0);
117 f.push_back (88200.0);
118 f.push_back (96000.0);
119 f.push_back (192000.0);
120 f.push_back (384000.0);
126 JACKAudioBackend::available_buffer_sizes (const string& /*device*/) const
131 s.push_back (buffer_size());
151 JACKAudioBackend::available_input_channel_count (const string& /*device*/) const
157 JACKAudioBackend::available_output_channel_count (const string& /*device*/) const
162 /* -- parameter setting -- */
165 JACKAudioBackend::set_device_name (const string& dev)
168 /* need to stop and restart JACK for this to work, at present */
172 _target_device = dev;
177 JACKAudioBackend::set_sample_rate (float sr)
179 GET_PRIVATE_JACK_POINTER_RET (_priv_jack, -1);
182 _target_sample_rate = sr;
186 if (sr == jack_get_sample_rate (_priv_jack)) {
194 JACKAudioBackend::set_buffer_size (uint32_t nframes)
196 GET_PRIVATE_JACK_POINTER_RET (_priv_jack, -1);
199 _target_buffer_size = nframes;
203 if (nframes == jack_get_buffer_size (_priv_jack)) {
207 return jack_set_buffer_size (_priv_jack, nframes);
211 JACKAudioBackend::set_sample_format (SampleFormat sf)
213 /* as far as JACK clients are concerned, the hardware is always
214 * floating point format.
216 if (sf == FormatFloat) {
223 JACKAudioBackend::set_interleaved (bool yn)
225 /* as far as JACK clients are concerned, the hardware is always
235 JACKAudioBackend::set_input_channels (uint32_t cnt)
241 _target_input_channels = cnt;
247 JACKAudioBackend::set_output_channels (uint32_t cnt)
253 _target_output_channels = cnt;
259 JACKAudioBackend::set_systemic_input_latency (uint32_t l)
265 _target_systemic_input_latency = l;
271 JACKAudioBackend::set_systemic_output_latency (uint32_t l)
277 _target_systemic_output_latency = l;
282 /* --- Parameter retrieval --- */
285 JACKAudioBackend::device_name () const
291 JACKAudioBackend::sample_rate () const
294 return _current_sample_rate;
296 return _target_sample_rate;
300 JACKAudioBackend::buffer_size () const
303 return _current_buffer_size;
305 return _target_buffer_size;
309 JACKAudioBackend::sample_format () const
315 JACKAudioBackend::interleaved () const
321 JACKAudioBackend::input_channels () const
324 return n_physical (JackPortIsInput).n_audio();
326 return _target_input_channels;
330 JACKAudioBackend::output_channels () const
333 return n_physical (JackPortIsOutput).n_audio();
335 return _target_output_channels;
339 JACKAudioBackend::systemic_input_latency () const
341 return _current_systemic_output_latency;
345 JACKAudioBackend::systemic_output_latency () const
347 return _current_systemic_output_latency;
351 JACKAudioBackend::raw_buffer_size(DataType t)
353 std::map<DataType,size_t>::const_iterator s = _raw_buffer_sizes.find(t);
354 return (s != _raw_buffer_sizes.end()) ? s->second : 0;
358 JACKAudioBackend::preset_jack_startup_command ()
360 /* write parameter settings to ~/.jackdrc file so that next invocation
361 * of JACK (presumably from a call to jack_client_open() from this
362 * process) will do the right thing.
366 /* ---- BASIC STATE CONTROL API: start/stop/pause/freewheel --- */
369 JACKAudioBackend::start ()
373 if (!_jack_connection->server_running()) {
374 preset_jack_startup_command ();
376 std::cerr << "Open JACK connection\n";
377 _jack_connection->open ();
380 engine.reestablish_ports ();
382 if (!jack_port_type_get_buffer_size) {
383 warning << _("This version of JACK is old - you should upgrade to a newer version that supports jack_port_type_get_buffer_size()") << endmsg;
386 GET_PRIVATE_JACK_POINTER_RET (_priv_jack, -1);
388 engine.sample_rate_change (jack_get_sample_rate (_priv_jack));
390 /* testing the nullity of this function name is a proxy for
391 * whether jack_activate() will definitely call the buffer size
392 * callback. with older versions of JACK, this function symbol
393 * will be null. this is sort of reliable, but not clean since
394 * weak symbol support is highly platform and compiler
397 if (!jack_port_type_get_buffer_size) {
398 jack_bufsize_callback (jack_get_buffer_size (_priv_jack));
401 set_jack_callbacks ();
403 if (jack_activate (_priv_jack) == 0) {
406 // error << _("cannot activate JACK client") << endmsg;
409 engine.reconnect_ports ();
415 JACKAudioBackend::stop ()
417 GET_PRIVATE_JACK_POINTER_RET (_priv_jack, -1);
419 _jack_connection->close ();
421 _current_buffer_size = 0;
422 _current_sample_rate = 0;
424 _raw_buffer_sizes.clear();
430 JACKAudioBackend::pause ()
432 GET_PRIVATE_JACK_POINTER_RET (_priv_jack, -1);
435 jack_deactivate (_priv_jack);
442 JACKAudioBackend::freewheel (bool onoff)
444 GET_PRIVATE_JACK_POINTER_RET (_priv_jack, -1);
446 if (onoff == _freewheeling) {
447 /* already doing what has been asked for */
452 if (jack_set_freewheel (_priv_jack, onoff) == 0) {
453 _freewheeling = true;
460 /* --- TRANSPORT STATE MANAGEMENT --- */
463 JACKAudioBackend::transport_stop ()
465 GET_PRIVATE_JACK_POINTER (_priv_jack);
466 jack_transport_stop (_priv_jack);
470 JACKAudioBackend::transport_start ()
472 GET_PRIVATE_JACK_POINTER (_priv_jack);
473 jack_transport_start (_priv_jack);
477 JACKAudioBackend::transport_locate (framepos_t where)
479 GET_PRIVATE_JACK_POINTER (_priv_jack);
480 jack_transport_locate (_priv_jack, where);
484 JACKAudioBackend::transport_frame () const
486 GET_PRIVATE_JACK_POINTER_RET (_priv_jack, 0);
487 return jack_get_current_transport_frame (_priv_jack);
491 JACKAudioBackend::transport_state () const
493 GET_PRIVATE_JACK_POINTER_RET (_priv_jack, ((TransportState) JackTransportStopped));
495 return (TransportState) jack_transport_query (_priv_jack, &pos);
499 JACKAudioBackend::set_time_master (bool yn)
501 GET_PRIVATE_JACK_POINTER_RET (_priv_jack, -1);
503 return jack_set_timebase_callback (_priv_jack, 0, _jack_timebase_callback, this);
505 return jack_release_timebase (_priv_jack);
512 JACKAudioBackend::get_sync_offset (pframes_t& offset) const
515 #ifdef HAVE_JACK_VIDEO_SUPPORT
517 GET_PRIVATE_JACK_POINTER_RET (_priv_jack, false);
522 (void) jack_transport_query (_priv_jack, &pos);
524 if (pos.valid & JackVideoFrameOffset) {
525 offset = pos.video_offset;
538 JACKAudioBackend::sample_time ()
540 GET_PRIVATE_JACK_POINTER_RET (_priv_jack, 0);
541 return jack_frame_time (_priv_jack);
545 JACKAudioBackend::sample_time_at_cycle_start ()
547 GET_PRIVATE_JACK_POINTER_RET (_priv_jack, 0);
548 return jack_last_frame_time (_priv_jack);
552 JACKAudioBackend::samples_since_cycle_start ()
554 GET_PRIVATE_JACK_POINTER_RET (_priv_jack, 0);
555 return jack_frames_since_cycle_start (_priv_jack);
561 ardour_jack_error (const char* msg)
563 error << "JACK: " << msg << endmsg;
567 JACKAudioBackend::set_jack_callbacks ()
569 GET_PRIVATE_JACK_POINTER (_priv_jack);
571 jack_set_thread_init_callback (_priv_jack, AudioEngine::thread_init_callback, 0);
573 jack_set_process_thread (_priv_jack, _process_thread, this);
574 jack_set_sample_rate_callback (_priv_jack, _sample_rate_callback, this);
575 jack_set_buffer_size_callback (_priv_jack, _bufsize_callback, this);
576 jack_set_xrun_callback (_priv_jack, _xrun_callback, this);
577 jack_set_sync_callback (_priv_jack, _jack_sync_callback, this);
578 jack_set_freewheel_callback (_priv_jack, _freewheel_callback, this);
580 #ifdef HAVE_JACK_SESSION
581 if( jack_set_session_callback)
582 jack_set_session_callback (_priv_jack, _session_callback, this);
585 if (jack_set_latency_callback) {
586 jack_set_latency_callback (_priv_jack, _latency_callback, this);
589 jack_set_error_function (ardour_jack_error);
593 JACKAudioBackend::_jack_timebase_callback (jack_transport_state_t state, pframes_t nframes,
594 jack_position_t* pos, int new_position, void *arg)
596 static_cast<JACKAudioBackend*> (arg)->jack_timebase_callback (state, nframes, pos, new_position);
600 JACKAudioBackend::jack_timebase_callback (jack_transport_state_t state, pframes_t /*nframes*/,
601 jack_position_t* pos, int /*new_position*/)
603 TransportState tstate;
607 case JackTransportStopped:
608 tstate = TransportStopped;
610 case JackTransportRolling:
611 tstate = TransportRolling;
613 case JackTransportLooping:
614 tstate = TransportLooping;
616 case JackTransportStarting:
617 tstate = TransportStarting;
622 position = pos->frame;
625 // engine.timebase_callback (tstate, nframes, position, new_position);
629 JACKAudioBackend::_jack_sync_callback (jack_transport_state_t state, jack_position_t* pos, void* arg)
631 return static_cast<JACKAudioBackend*> (arg)->jack_sync_callback (state, pos);
635 JACKAudioBackend::jack_sync_callback (jack_transport_state_t state, jack_position_t* pos)
637 TransportState tstate;
640 case JackTransportStopped:
641 tstate = TransportStopped;
643 case JackTransportRolling:
644 tstate = TransportRolling;
646 case JackTransportLooping:
647 tstate = TransportLooping;
649 case JackTransportStarting:
650 tstate = TransportStarting;
654 return engine.sync_callback (tstate, pos->frame);
660 JACKAudioBackend::_xrun_callback (void *arg)
662 JACKAudioBackend* ae = static_cast<JACKAudioBackend*> (arg);
663 if (ae->connected()) {
664 ae->engine.Xrun (); /* EMIT SIGNAL */
669 #ifdef HAVE_JACK_SESSION
671 JACKAudioBackend::_session_callback (jack_session_event_t *event, void *arg)
673 JACKAudioBackend* ae = static_cast<JACKAudioBackend*> (arg);
674 if (ae->connected()) {
675 ae->engine.JackSessionEvent (event); /* EMIT SIGNAL */
681 JACKAudioBackend::_freewheel_callback (int onoff, void *arg)
683 static_cast<JACKAudioBackend*>(arg)->freewheel_callback (onoff);
687 JACKAudioBackend::freewheel_callback (int onoff)
689 _freewheeling = onoff;
690 engine.freewheel_callback (onoff);
694 JACKAudioBackend::_latency_callback (jack_latency_callback_mode_t mode, void* arg)
696 return static_cast<JACKAudioBackend*> (arg)->jack_latency_callback (mode);
700 JACKAudioBackend::create_process_thread (boost::function<void()> f, pthread_t* thread, size_t stacksize)
702 GET_PRIVATE_JACK_POINTER_RET (_priv_jack, 0);
703 ThreadData* td = new ThreadData (this, f, stacksize);
705 if (jack_client_create_thread (_priv_jack, thread, jack_client_real_time_priority (_priv_jack),
706 jack_is_realtime (_priv_jack), _start_process_thread, td)) {
714 JACKAudioBackend::_start_process_thread (void* arg)
716 ThreadData* td = reinterpret_cast<ThreadData*> (arg);
717 boost::function<void()> f = td->f;
726 JACKAudioBackend::_process_thread (void *arg)
728 return static_cast<JACKAudioBackend*> (arg)->process_thread ();
732 JACKAudioBackend::process_thread ()
734 /* JACK doesn't do this for us when we use the wait API
737 AudioEngine::thread_init_callback (this);
740 GET_PRIVATE_JACK_POINTER_RET(_priv_jack,0);
742 pframes_t nframes = jack_cycle_wait (_priv_jack);
744 if (engine.process_callback (nframes)) {
748 jack_cycle_signal (_priv_jack, 0);
755 JACKAudioBackend::_sample_rate_callback (pframes_t nframes, void *arg)
757 return static_cast<JACKAudioBackend*> (arg)->jack_sample_rate_callback (nframes);
761 JACKAudioBackend::jack_sample_rate_callback (pframes_t nframes)
763 _current_sample_rate = nframes;
764 return engine.sample_rate_change (nframes);
768 JACKAudioBackend::jack_latency_callback (jack_latency_callback_mode_t mode)
770 engine.latency_callback (mode == JackPlaybackLatency);
774 JACKAudioBackend::_bufsize_callback (pframes_t nframes, void *arg)
776 return static_cast<JACKAudioBackend*> (arg)->jack_bufsize_callback (nframes);
780 JACKAudioBackend::jack_bufsize_callback (pframes_t nframes)
782 /* if the size has not changed, this should be a no-op */
784 if (nframes == _current_buffer_size) {
788 GET_PRIVATE_JACK_POINTER_RET (_priv_jack, 1);
790 _current_buffer_size = nframes;
791 _current_usecs_per_cycle = (int) floor ((((double) nframes / sample_rate())) * 1000000.0);
793 if (jack_port_type_get_buffer_size) {
794 _raw_buffer_sizes[DataType::AUDIO] = jack_port_type_get_buffer_size (_priv_jack, JACK_DEFAULT_AUDIO_TYPE);
795 _raw_buffer_sizes[DataType::MIDI] = jack_port_type_get_buffer_size (_priv_jack, JACK_DEFAULT_MIDI_TYPE);
798 /* Old version of JACK.
800 These crude guesses, see below where we try to get the right answers.
802 Note that our guess for MIDI deliberatey tries to overestimate
803 by a little. It would be nicer if we could get the actual
804 size from a port, but we have to use this estimate in the
805 event that there are no MIDI ports currently. If there are
806 the value will be adjusted below.
809 _raw_buffer_sizes[DataType::AUDIO] = nframes * sizeof (Sample);
810 _raw_buffer_sizes[DataType::MIDI] = nframes * 4 - (nframes/2);
813 engine.buffer_size_change (nframes);
819 JACKAudioBackend::disconnected (const char* why)
821 /* called from jack shutdown handler */
823 bool was_running = _running;
826 _current_buffer_size = 0;
827 _current_sample_rate = 0;
830 engine.halted_callback (why); /* EMIT SIGNAL */
834 JACKAudioBackend::cpu_load() const
836 GET_PRIVATE_JACK_POINTER_RET(_priv_jack,0);
837 return jack_cpu_load (_priv_jack);
841 JACKAudioBackend::update_latencies ()
843 GET_PRIVATE_JACK_POINTER (_priv_jack);
844 jack_recompute_total_latencies (_priv_jack);
848 JACKAudioBackend::n_physical (unsigned long flags) const
852 GET_PRIVATE_JACK_POINTER_RET (_priv_jack, c);
854 const char ** ports = jack_get_ports (_priv_jack, NULL, NULL, JackPortIsPhysical | flags);
857 for (uint32_t i = 0; ports[i]; ++i) {
858 if (!strstr (ports[i], "Midi-Through")) {
859 DataType t (jack_port_type (jack_port_by_name (_priv_jack, ports[i])));
860 c.set (t, c.get (t) + 1);