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)
62 JACKAudioBackend::name() const
68 JACKAudioBackend::private_handle() const
70 return _jack_connection->jack();
74 JACKAudioBackend::connected() const
76 return (private_handle() != 0);
80 JACKAudioBackend::is_realtime () const
82 GET_PRIVATE_JACK_POINTER_RET (_priv_jack,false);
83 return jack_is_realtime (_priv_jack);
87 JACKAudioBackend::enumerate_devices () const
89 vector<string> devices;
94 JACKAudioBackend::available_sample_rates (const string& /*device*/) const
99 f.push_back (sample_rate());
103 /* if JACK is not already running, just list a bunch of reasonable
104 values and let the future sort it all out.
107 f.push_back (8000.0);
108 f.push_back (16000.0);
109 f.push_back (24000.0);
110 f.push_back (32000.0);
111 f.push_back (44100.0);
112 f.push_back (48000.0);
113 f.push_back (88200.0);
114 f.push_back (96000.0);
115 f.push_back (192000.0);
116 f.push_back (384000.0);
122 JACKAudioBackend::available_buffer_sizes (const string& /*device*/) const
127 s.push_back (buffer_size());
147 JACKAudioBackend::available_input_channel_count (const string& /*device*/) const
153 JACKAudioBackend::available_output_channel_count (const string& /*device*/) const
158 /* -- parameter setting -- */
161 JACKAudioBackend::set_device_name (const string& dev)
164 /* need to stop and restart JACK for this to work, at present */
168 _target_device = dev;
173 JACKAudioBackend::set_sample_rate (float sr)
175 GET_PRIVATE_JACK_POINTER_RET (_priv_jack, -1);
178 _target_sample_rate = sr;
182 if (sr == jack_get_sample_rate (_priv_jack)) {
190 JACKAudioBackend::set_buffer_size (uint32_t nframes)
192 GET_PRIVATE_JACK_POINTER_RET (_priv_jack, -1);
195 _target_buffer_size = nframes;
199 if (nframes == jack_get_buffer_size (_priv_jack)) {
203 return jack_set_buffer_size (_priv_jack, nframes);
207 JACKAudioBackend::set_sample_format (SampleFormat sf)
209 /* as far as JACK clients are concerned, the hardware is always
210 * floating point format.
212 if (sf == FormatFloat) {
219 JACKAudioBackend::set_interleaved (bool yn)
221 /* as far as JACK clients are concerned, the hardware is always
231 JACKAudioBackend::set_input_channels (uint32_t cnt)
237 _target_input_channels = cnt;
243 JACKAudioBackend::set_output_channels (uint32_t cnt)
249 _target_output_channels = cnt;
255 JACKAudioBackend::set_systemic_input_latency (uint32_t l)
261 _target_systemic_input_latency = l;
267 JACKAudioBackend::set_systemic_output_latency (uint32_t l)
273 _target_systemic_output_latency = l;
278 /* --- Parameter retrieval --- */
281 JACKAudioBackend::device_name () const
287 JACKAudioBackend::sample_rate () const
290 return _current_sample_rate;
292 return _target_sample_rate;
296 JACKAudioBackend::buffer_size () const
299 return _current_buffer_size;
301 return _target_buffer_size;
305 JACKAudioBackend::sample_format () const
311 JACKAudioBackend::interleaved () const
317 JACKAudioBackend::input_channels () const
320 return n_physical (JackPortIsInput).n_audio();
322 return _target_input_channels;
326 JACKAudioBackend::output_channels () const
329 return n_physical (JackPortIsOutput).n_audio();
331 return _target_output_channels;
335 JACKAudioBackend::systemic_input_latency () const
337 return _current_systemic_output_latency;
341 JACKAudioBackend::systemic_output_latency () const
343 return _current_systemic_output_latency;
347 JACKAudioBackend::raw_buffer_size(DataType t)
349 std::map<DataType,size_t>::const_iterator s = _raw_buffer_sizes.find(t);
350 return (s != _raw_buffer_sizes.end()) ? s->second : 0;
353 /* ---- BASIC STATE CONTROL API: start/stop/pause/freewheel --- */
356 JACKAudioBackend::start ()
359 _jack_connection->open ();
362 engine.reestablish_ports ();
364 if (!jack_port_type_get_buffer_size) {
365 warning << _("This version of JACK is old - you should upgrade to a newer version that supports jack_port_type_get_buffer_size()") << endmsg;
368 GET_PRIVATE_JACK_POINTER_RET (_priv_jack, -1);
370 engine.sample_rate_change (jack_get_sample_rate (_priv_jack));
372 /* testing the nullity of this function name is a proxy for
373 * whether jack_activate() will definitely call the buffer size
374 * callback. with older versions of JACK, this function symbol
375 * will be null. this is sort of reliable, but not clean since
376 * weak symbol support is highly platform and compiler
379 if (!jack_port_type_get_buffer_size) {
380 jack_bufsize_callback (jack_get_buffer_size (_priv_jack));
383 set_jack_callbacks ();
385 if (jack_activate (_priv_jack) == 0) {
388 // error << _("cannot activate JACK client") << endmsg;
391 engine.reconnect_ports ();
397 JACKAudioBackend::stop ()
399 GET_PRIVATE_JACK_POINTER_RET (_priv_jack, -1);
401 _jack_connection->close ();
403 _current_buffer_size = 0;
404 _current_sample_rate = 0;
406 _raw_buffer_sizes.clear();
412 JACKAudioBackend::pause ()
414 GET_PRIVATE_JACK_POINTER_RET (_priv_jack, -1);
417 jack_deactivate (_priv_jack);
424 JACKAudioBackend::freewheel (bool onoff)
426 GET_PRIVATE_JACK_POINTER_RET (_priv_jack, -1);
428 if (onoff == _freewheeling) {
429 /* already doing what has been asked for */
434 if (jack_set_freewheel (_priv_jack, onoff) == 0) {
435 _freewheeling = true;
442 /* --- TRANSPORT STATE MANAGEMENT --- */
445 JACKAudioBackend::transport_stop ()
447 GET_PRIVATE_JACK_POINTER (_priv_jack);
448 jack_transport_stop (_priv_jack);
452 JACKAudioBackend::transport_start ()
454 GET_PRIVATE_JACK_POINTER (_priv_jack);
455 jack_transport_start (_priv_jack);
459 JACKAudioBackend::transport_locate (framepos_t where)
461 GET_PRIVATE_JACK_POINTER (_priv_jack);
462 jack_transport_locate (_priv_jack, where);
466 JACKAudioBackend::transport_frame () const
468 GET_PRIVATE_JACK_POINTER_RET (_priv_jack, 0);
469 return jack_get_current_transport_frame (_priv_jack);
473 JACKAudioBackend::transport_state () const
475 GET_PRIVATE_JACK_POINTER_RET (_priv_jack, ((TransportState) JackTransportStopped));
477 return (TransportState) jack_transport_query (_priv_jack, &pos);
481 JACKAudioBackend::set_time_master (bool yn)
483 GET_PRIVATE_JACK_POINTER_RET (_priv_jack, -1);
485 return jack_set_timebase_callback (_priv_jack, 0, _jack_timebase_callback, this);
487 return jack_release_timebase (_priv_jack);
494 JACKAudioBackend::get_sync_offset (pframes_t& offset) const
497 #ifdef HAVE_JACK_VIDEO_SUPPORT
499 GET_PRIVATE_JACK_POINTER_RET (_priv_jack, false);
504 (void) jack_transport_query (_priv_jack, &pos);
506 if (pos.valid & JackVideoFrameOffset) {
507 offset = pos.video_offset;
520 JACKAudioBackend::sample_time ()
522 GET_PRIVATE_JACK_POINTER_RET (_priv_jack, 0);
523 return jack_frame_time (_priv_jack);
527 JACKAudioBackend::sample_time_at_cycle_start ()
529 GET_PRIVATE_JACK_POINTER_RET (_priv_jack, 0);
530 return jack_last_frame_time (_priv_jack);
534 JACKAudioBackend::samples_since_cycle_start ()
536 GET_PRIVATE_JACK_POINTER_RET (_priv_jack, 0);
537 return jack_frames_since_cycle_start (_priv_jack);
543 ardour_jack_error (const char* msg)
545 error << "JACK: " << msg << endmsg;
549 JACKAudioBackend::set_jack_callbacks ()
551 GET_PRIVATE_JACK_POINTER (_priv_jack);
553 jack_set_thread_init_callback (_priv_jack, AudioEngine::thread_init_callback, 0);
555 jack_set_process_thread (_priv_jack, _process_thread, this);
556 jack_set_sample_rate_callback (_priv_jack, _sample_rate_callback, this);
557 jack_set_buffer_size_callback (_priv_jack, _bufsize_callback, this);
558 jack_set_xrun_callback (_priv_jack, _xrun_callback, this);
559 jack_set_sync_callback (_priv_jack, _jack_sync_callback, this);
560 jack_set_freewheel_callback (_priv_jack, _freewheel_callback, this);
562 #ifdef HAVE_JACK_SESSION
563 if( jack_set_session_callback)
564 jack_set_session_callback (_priv_jack, _session_callback, this);
567 if (jack_set_latency_callback) {
568 jack_set_latency_callback (_priv_jack, _latency_callback, this);
571 jack_set_error_function (ardour_jack_error);
575 JACKAudioBackend::_jack_timebase_callback (jack_transport_state_t state, pframes_t nframes,
576 jack_position_t* pos, int new_position, void *arg)
578 static_cast<JACKAudioBackend*> (arg)->jack_timebase_callback (state, nframes, pos, new_position);
582 JACKAudioBackend::jack_timebase_callback (jack_transport_state_t state, pframes_t /*nframes*/,
583 jack_position_t* pos, int /*new_position*/)
585 TransportState tstate;
589 case JackTransportStopped:
590 tstate = TransportStopped;
592 case JackTransportRolling:
593 tstate = TransportRolling;
595 case JackTransportLooping:
596 tstate = TransportLooping;
598 case JackTransportStarting:
599 tstate = TransportStarting;
604 position = pos->frame;
607 // engine.timebase_callback (tstate, nframes, position, new_position);
611 JACKAudioBackend::_jack_sync_callback (jack_transport_state_t state, jack_position_t* pos, void* arg)
613 return static_cast<JACKAudioBackend*> (arg)->jack_sync_callback (state, pos);
617 JACKAudioBackend::jack_sync_callback (jack_transport_state_t state, jack_position_t* pos)
619 TransportState tstate;
622 case JackTransportStopped:
623 tstate = TransportStopped;
625 case JackTransportRolling:
626 tstate = TransportRolling;
628 case JackTransportLooping:
629 tstate = TransportLooping;
631 case JackTransportStarting:
632 tstate = TransportStarting;
636 return engine.sync_callback (tstate, pos->frame);
642 JACKAudioBackend::_xrun_callback (void *arg)
644 JACKAudioBackend* ae = static_cast<JACKAudioBackend*> (arg);
645 if (ae->connected()) {
646 ae->engine.Xrun (); /* EMIT SIGNAL */
651 #ifdef HAVE_JACK_SESSION
653 JACKAudioBackend::_session_callback (jack_session_event_t *event, void *arg)
655 JACKAudioBackend* ae = static_cast<JACKAudioBackend*> (arg);
656 if (ae->connected()) {
657 ae->engine.JackSessionEvent (event); /* EMIT SIGNAL */
663 JACKAudioBackend::_freewheel_callback (int onoff, void *arg)
665 static_cast<JACKAudioBackend*>(arg)->freewheel_callback (onoff);
669 JACKAudioBackend::freewheel_callback (int onoff)
671 _freewheeling = onoff;
672 engine.freewheel_callback (onoff);
676 JACKAudioBackend::_latency_callback (jack_latency_callback_mode_t mode, void* arg)
678 return static_cast<JACKAudioBackend*> (arg)->jack_latency_callback (mode);
682 JACKAudioBackend::create_process_thread (boost::function<void()> f, pthread_t* thread, size_t stacksize)
684 GET_PRIVATE_JACK_POINTER_RET (_priv_jack, 0);
685 ThreadData* td = new ThreadData (this, f, stacksize);
687 if (jack_client_create_thread (_priv_jack, thread, jack_client_real_time_priority (_priv_jack),
688 jack_is_realtime (_priv_jack), _start_process_thread, td)) {
696 JACKAudioBackend::_start_process_thread (void* arg)
698 ThreadData* td = reinterpret_cast<ThreadData*> (arg);
699 boost::function<void()> f = td->f;
708 JACKAudioBackend::_process_thread (void *arg)
710 return static_cast<JACKAudioBackend*> (arg)->process_thread ();
714 JACKAudioBackend::process_thread ()
716 /* JACK doesn't do this for us when we use the wait API
719 AudioEngine::thread_init_callback (this);
722 GET_PRIVATE_JACK_POINTER_RET(_priv_jack,0);
724 pframes_t nframes = jack_cycle_wait (_priv_jack);
726 if (engine.process_callback (nframes)) {
730 jack_cycle_signal (_priv_jack, 0);
737 JACKAudioBackend::_sample_rate_callback (pframes_t nframes, void *arg)
739 return static_cast<JACKAudioBackend*> (arg)->jack_sample_rate_callback (nframes);
743 JACKAudioBackend::jack_sample_rate_callback (pframes_t nframes)
745 _current_sample_rate = nframes;
746 return engine.sample_rate_change (nframes);
750 JACKAudioBackend::jack_latency_callback (jack_latency_callback_mode_t mode)
752 engine.latency_callback (mode == JackPlaybackLatency);
756 JACKAudioBackend::_bufsize_callback (pframes_t nframes, void *arg)
758 return static_cast<JACKAudioBackend*> (arg)->jack_bufsize_callback (nframes);
762 JACKAudioBackend::jack_bufsize_callback (pframes_t nframes)
764 /* if the size has not changed, this should be a no-op */
766 if (nframes == _current_buffer_size) {
770 GET_PRIVATE_JACK_POINTER_RET (_priv_jack, 1);
772 _current_buffer_size = nframes;
773 _current_usecs_per_cycle = (int) floor ((((double) nframes / sample_rate())) * 1000000.0);
775 if (jack_port_type_get_buffer_size) {
776 _raw_buffer_sizes[DataType::AUDIO] = jack_port_type_get_buffer_size (_priv_jack, JACK_DEFAULT_AUDIO_TYPE);
777 _raw_buffer_sizes[DataType::MIDI] = jack_port_type_get_buffer_size (_priv_jack, JACK_DEFAULT_MIDI_TYPE);
780 /* Old version of JACK.
782 These crude guesses, see below where we try to get the right answers.
784 Note that our guess for MIDI deliberatey tries to overestimate
785 by a little. It would be nicer if we could get the actual
786 size from a port, but we have to use this estimate in the
787 event that there are no MIDI ports currently. If there are
788 the value will be adjusted below.
791 _raw_buffer_sizes[DataType::AUDIO] = nframes * sizeof (Sample);
792 _raw_buffer_sizes[DataType::MIDI] = nframes * 4 - (nframes/2);
795 engine.buffer_size_change (nframes);
801 JACKAudioBackend::disconnected (const char* why)
803 /* called from jack shutdown handler */
805 bool was_running = _running;
808 _current_buffer_size = 0;
809 _current_sample_rate = 0;
812 engine.halted_callback (why); /* EMIT SIGNAL */
816 JACKAudioBackend::cpu_load() const
818 GET_PRIVATE_JACK_POINTER_RET(_priv_jack,0);
819 return jack_cpu_load (_priv_jack);
823 JACKAudioBackend::update_latencies ()
825 GET_PRIVATE_JACK_POINTER (_priv_jack);
826 jack_recompute_total_latencies (_priv_jack);