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.
24 #include <boost/scoped_ptr.hpp>
25 #include <glibmm/timer.h>
26 #include <glibmm/spawn.h>
28 #include "pbd/error.h"
30 #include "ardour/audioengine.h"
31 #include "ardour/session.h"
32 #include "ardour/types.h"
34 #include "jack_audiobackend.h"
35 #include "jack_connection.h"
36 #include "jack_utils.h"
37 #include "jack_session.h"
41 using namespace ARDOUR;
47 #define GET_PRIVATE_JACK_POINTER(localvar) jack_client_t* localvar = _jack_connection->jack(); if (!(localvar)) { return; }
48 #define GET_PRIVATE_JACK_POINTER_RET(localvar,r) jack_client_t* localvar = _jack_connection->jack(); if (!(localvar)) { return r; }
50 JACKAudioBackend::JACKAudioBackend (AudioEngine& e, AudioBackendInfo& info, boost::shared_ptr<JackConnection> jc)
51 : AudioBackend (e, info)
52 , _jack_connection (jc)
54 , _freewheeling (false)
55 , _target_sample_rate (48000)
56 , _target_buffer_size (1024)
57 , _target_interleaved (false)
58 , _target_input_channels (0)
59 , _target_output_channels (0)
60 , _target_systemic_input_latency (0)
61 , _target_systemic_output_latency (0)
62 , _current_sample_rate (0)
63 , _current_buffer_size (0)
66 _jack_connection->Connected.connect_same_thread (jack_connection_connection, boost::bind (&JACKAudioBackend::when_connected_to_jack, this));
67 _jack_connection->Disconnected.connect_same_thread (disconnect_connection, boost::bind (&JACKAudioBackend::disconnected, this, _1));
70 JACKAudioBackend::~JACKAudioBackend()
75 JACKAudioBackend::name() const
81 JACKAudioBackend::private_handle() const
83 return _jack_connection->jack();
87 JACKAudioBackend::available() const
89 return (private_handle() != 0);
93 JACKAudioBackend::is_realtime () const
95 GET_PRIVATE_JACK_POINTER_RET (_priv_jack,false);
96 return jack_is_realtime (_priv_jack);
100 JACKAudioBackend::requires_driver_selection() const
106 JACKAudioBackend::enumerate_drivers () const
108 vector<string> currently_available;
109 get_jack_audio_driver_names (currently_available);
110 return currently_available;
114 JACKAudioBackend::set_driver (const std::string& name)
116 _target_driver = name;
120 vector<AudioBackend::DeviceStatus>
121 JACKAudioBackend::enumerate_devices () const
123 vector<string> currently_available = get_jack_device_names_for_audio_driver (_target_driver);
124 vector<DeviceStatus> statuses;
126 if (all_devices.find (_target_driver) == all_devices.end()) {
127 all_devices.insert (make_pair (_target_driver, std::set<string>()));
130 /* store every device we've found, by driver name.
132 * This is so we do not confuse ALSA, FFADO, netjack etc. devices
136 DeviceList& all (all_devices[_target_driver]);
138 for (vector<string>::const_iterator d = currently_available.begin(); d != currently_available.end(); ++d) {
142 for (DeviceList::const_iterator d = all.begin(); d != all.end(); ++d) {
143 if (find (currently_available.begin(), currently_available.end(), *d) == currently_available.end()) {
144 statuses.push_back (DeviceStatus (*d, false));
146 statuses.push_back (DeviceStatus (*d, false));
154 JACKAudioBackend::available_sample_rates (const string& device) const
158 if (device == _target_device && available()) {
159 f.push_back (sample_rate());
163 /* if JACK is not already running, just list a bunch of reasonable
164 values and let the future sort it all out.
167 f.push_back (8000.0);
168 f.push_back (16000.0);
169 f.push_back (24000.0);
170 f.push_back (32000.0);
171 f.push_back (44100.0);
172 f.push_back (48000.0);
173 f.push_back (88200.0);
174 f.push_back (96000.0);
175 f.push_back (192000.0);
176 f.push_back (384000.0);
182 JACKAudioBackend::available_buffer_sizes (const string& device) const
186 if (device == _target_device && available()) {
187 s.push_back (buffer_size());
207 JACKAudioBackend::available_input_channel_count (const string& /*device*/) const
213 JACKAudioBackend::available_output_channel_count (const string& /*device*/) const
218 /* -- parameter setting -- */
221 JACKAudioBackend::set_device_name (const string& dev)
224 /* need to stop and restart JACK for this to work, at present */
228 _target_device = dev;
233 JACKAudioBackend::set_sample_rate (float sr)
236 _target_sample_rate = sr;
240 GET_PRIVATE_JACK_POINTER_RET (_priv_jack, -1);
242 if (sr == jack_get_sample_rate (_priv_jack)) {
250 JACKAudioBackend::set_buffer_size (uint32_t nframes)
253 _target_buffer_size = nframes;
257 GET_PRIVATE_JACK_POINTER_RET (_priv_jack, -1);
259 if (nframes == jack_get_buffer_size (_priv_jack)) {
263 return jack_set_buffer_size (_priv_jack, nframes);
267 JACKAudioBackend::set_interleaved (bool yn)
269 /* as far as JACK clients are concerned, the hardware is always
279 JACKAudioBackend::set_input_channels (uint32_t cnt)
283 /* can't set a real value for this while JACK runs */
288 _target_input_channels = cnt;
294 JACKAudioBackend::set_output_channels (uint32_t cnt)
298 /* can't set a real value for this while JACK runs */
303 _target_output_channels = cnt;
309 JACKAudioBackend::set_systemic_input_latency (uint32_t l)
312 /* can't do this while JACK runs */
316 _target_systemic_input_latency = l;
322 JACKAudioBackend::set_systemic_output_latency (uint32_t l)
325 /* can't do this while JACK runs */
329 _target_systemic_output_latency = l;
334 /* --- Parameter retrieval --- */
337 JACKAudioBackend::device_name () const
339 if (!_jack_connection->in_control()) {
340 return "???"; // JACK has no way (as of fall 2013) to return
344 return _target_device;
348 JACKAudioBackend::driver_name() const
350 if (!_jack_connection->in_control()) {
351 return "???"; // JACK has no way (as of fall 2013) to return
355 return _target_driver;
359 JACKAudioBackend::sample_rate () const
361 if (!_jack_connection->in_control()) {
363 return _current_sample_rate;
365 return _jack_connection->probed_sample_rate ();
368 return _target_sample_rate;
372 JACKAudioBackend::buffer_size () const
374 if (!_jack_connection->in_control()) {
376 return _current_buffer_size;
378 return _jack_connection->probed_buffer_size ();
381 return _target_buffer_size;
385 JACKAudioBackend::interleaved () const
391 JACKAudioBackend::midi_option () const
393 return _target_midi_option;
397 JACKAudioBackend::input_channels () const
399 if (!_jack_connection->in_control()) {
401 return n_physical (JackPortIsInput).n_audio();
407 return n_physical (JackPortIsInput).n_audio();
409 return _target_input_channels;
415 JACKAudioBackend::output_channels () const
417 if (!_jack_connection->in_control()) {
419 return n_physical (JackPortIsOutput).n_audio();
425 return n_physical (JackPortIsOutput).n_audio();
427 return _target_output_channels;
433 JACKAudioBackend::systemic_input_latency () const
435 return _target_systemic_output_latency;
439 JACKAudioBackend::systemic_output_latency () const
441 return _target_systemic_output_latency;
445 JACKAudioBackend::raw_buffer_size(DataType t)
447 std::map<DataType,size_t>::const_iterator s = _raw_buffer_sizes.find(t);
448 return (s != _raw_buffer_sizes.end()) ? s->second : 0;
452 JACKAudioBackend::setup_jack_startup_command (bool for_latency_measurement)
454 /* first we map the parameters that have been set onto a
455 * JackCommandLineOptions object.
458 JackCommandLineOptions options;
460 get_jack_default_server_path (options.server_path);
461 options.driver = _target_driver;
462 options.samplerate = _target_sample_rate;
463 options.period_size = _target_buffer_size;
464 options.num_periods = 2;
465 options.input_device = _target_device;
466 options.output_device = _target_device;
467 if (for_latency_measurement) {
468 options.input_latency = 0;
469 options.output_latency = 0;
471 options.input_latency = _target_systemic_input_latency;
472 options.output_latency = _target_systemic_output_latency;
474 options.input_channels = _target_input_channels;
475 options.output_channels = _target_output_channels;
476 if (_target_sample_format == FormatInt16) {
477 options.force16_bit = _target_sample_format;
479 options.realtime = true;
480 options.ports_max = 2048;
482 ARDOUR::set_midi_option (options, _target_midi_option);
484 /* this must always be true for any server instance we start ourselves
487 options.temporary = true;
491 if (!get_jack_command_line_string (options, cmdline)) {
492 /* error, somehow - we will still try to start JACK
493 * automatically but it will be without our preferred options
495 std::cerr << "get_jack_command_line_string () failed: using default settings." << std::endl;
499 std::cerr << "JACK command line will be: " << cmdline << std::endl;
501 write_jack_config_file (get_jack_server_user_config_file_path(), cmdline);
504 /* ---- BASIC STATE CONTROL API: start/stop/pause/freewheel --- */
507 JACKAudioBackend::_start (bool for_latency_measurement)
511 if (_jack_connection->in_control()) {
512 /* we will be starting JACK, so set up the
513 command that JACK will use when it (auto-)starts
515 setup_jack_startup_command (for_latency_measurement);
518 if (_jack_connection->open ()) {
523 GET_PRIVATE_JACK_POINTER_RET (_priv_jack, -1);
525 /* get the buffer size and sample rates established */
527 jack_sample_rate_callback (jack_get_sample_rate (_priv_jack));
528 jack_bufsize_callback (jack_get_buffer_size (_priv_jack));
530 /* Now that we have buffer size and sample rate established, the engine
531 can go ahead and do its stuff
534 if (engine.reestablish_ports ()) {
535 error << _("Could not re-establish ports after connecting to JACK") << endmsg;
539 if (!jack_port_type_get_buffer_size) {
540 warning << _("This version of JACK is old - you should upgrade to a newer version that supports jack_port_type_get_buffer_size()") << endmsg;
543 set_jack_callbacks ();
545 if (jack_activate (_priv_jack) == 0) {
548 // error << _("cannot activate JACK client") << endmsg;
551 engine.reconnect_ports ();
557 JACKAudioBackend::stop ()
559 _running = false; // no 'engine halted message'.
560 GET_PRIVATE_JACK_POINTER_RET (_priv_jack, -1);
562 _jack_connection->close ();
564 _current_buffer_size = 0;
565 _current_sample_rate = 0;
567 _raw_buffer_sizes.clear();
573 JACKAudioBackend::freewheel (bool onoff)
575 GET_PRIVATE_JACK_POINTER_RET (_priv_jack, -1);
577 if (onoff == _freewheeling) {
578 /* already doing what has been asked for */
583 if (jack_set_freewheel (_priv_jack, onoff) == 0) {
584 _freewheeling = onoff;
591 /* --- TRANSPORT STATE MANAGEMENT --- */
594 JACKAudioBackend::transport_stop ()
596 GET_PRIVATE_JACK_POINTER (_priv_jack);
597 jack_transport_stop (_priv_jack);
601 JACKAudioBackend::transport_start ()
603 GET_PRIVATE_JACK_POINTER (_priv_jack);
604 jack_transport_start (_priv_jack);
608 JACKAudioBackend::transport_locate (framepos_t where)
610 GET_PRIVATE_JACK_POINTER (_priv_jack);
611 jack_transport_locate (_priv_jack, where);
615 JACKAudioBackend::transport_frame () const
617 GET_PRIVATE_JACK_POINTER_RET (_priv_jack, 0);
618 return jack_get_current_transport_frame (_priv_jack);
622 JACKAudioBackend::transport_state () const
624 GET_PRIVATE_JACK_POINTER_RET (_priv_jack, ((TransportState) JackTransportStopped));
626 return (TransportState) jack_transport_query (_priv_jack, &pos);
630 JACKAudioBackend::set_time_master (bool yn)
632 GET_PRIVATE_JACK_POINTER_RET (_priv_jack, -1);
634 return jack_set_timebase_callback (_priv_jack, 0, _jack_timebase_callback, this);
636 return jack_release_timebase (_priv_jack);
643 JACKAudioBackend::get_sync_offset (pframes_t& offset) const
646 #ifdef HAVE_JACK_VIDEO_SUPPORT
648 GET_PRIVATE_JACK_POINTER_RET (_priv_jack, false);
653 (void) jack_transport_query (_priv_jack, &pos);
655 if (pos.valid & JackVideoFrameOffset) {
656 offset = pos.video_offset;
669 JACKAudioBackend::sample_time ()
671 GET_PRIVATE_JACK_POINTER_RET (_priv_jack, 0);
672 return jack_frame_time (_priv_jack);
676 JACKAudioBackend::sample_time_at_cycle_start ()
678 GET_PRIVATE_JACK_POINTER_RET (_priv_jack, 0);
679 return jack_last_frame_time (_priv_jack);
683 JACKAudioBackend::samples_since_cycle_start ()
685 GET_PRIVATE_JACK_POINTER_RET (_priv_jack, 0);
686 return jack_frames_since_cycle_start (_priv_jack);
692 ardour_jack_error (const char* msg)
694 error << "JACK: " << msg << endmsg;
698 JACKAudioBackend::set_jack_callbacks ()
700 GET_PRIVATE_JACK_POINTER (_priv_jack);
702 jack_set_thread_init_callback (_priv_jack, AudioEngine::thread_init_callback, 0);
704 jack_set_process_thread (_priv_jack, _process_thread, this);
705 jack_set_sample_rate_callback (_priv_jack, _sample_rate_callback, this);
706 jack_set_buffer_size_callback (_priv_jack, _bufsize_callback, this);
707 jack_set_xrun_callback (_priv_jack, _xrun_callback, this);
708 jack_set_sync_callback (_priv_jack, _jack_sync_callback, this);
709 jack_set_freewheel_callback (_priv_jack, _freewheel_callback, this);
711 #ifdef HAVE_JACK_SESSION
712 if( jack_set_session_callback)
713 jack_set_session_callback (_priv_jack, _session_callback, this);
716 if (jack_set_latency_callback) {
717 jack_set_latency_callback (_priv_jack, _latency_callback, this);
720 jack_set_error_function (ardour_jack_error);
724 JACKAudioBackend::_jack_timebase_callback (jack_transport_state_t state, pframes_t nframes,
725 jack_position_t* pos, int new_position, void *arg)
727 static_cast<JACKAudioBackend*> (arg)->jack_timebase_callback (state, nframes, pos, new_position);
731 JACKAudioBackend::jack_timebase_callback (jack_transport_state_t state, pframes_t nframes,
732 jack_position_t* pos, int new_position)
734 ARDOUR::Session* session = engine.session();
737 JACKSession jsession (session);
738 jsession.timebase_callback (state, nframes, pos, new_position);
743 JACKAudioBackend::_jack_sync_callback (jack_transport_state_t state, jack_position_t* pos, void* arg)
745 return static_cast<JACKAudioBackend*> (arg)->jack_sync_callback (state, pos);
749 JACKAudioBackend::jack_sync_callback (jack_transport_state_t state, jack_position_t* pos)
751 TransportState tstate;
752 bool tstate_valid = true;
755 case JackTransportRolling:
756 tstate = TransportRolling;
758 case JackTransportLooping:
759 tstate = TransportLooping;
761 case JackTransportStarting:
762 tstate = TransportStarting;
764 case JackTransportStopped:
765 tstate = TransportStopped;
768 // ignore "unofficial" states like JackTransportNetStarting (jackd2)
769 tstate_valid = false;
774 return engine.sync_callback (tstate, pos->frame);
781 JACKAudioBackend::_xrun_callback (void *arg)
783 JACKAudioBackend* jab = static_cast<JACKAudioBackend*> (arg);
784 if (jab->available()) {
785 jab->engine.Xrun (); /* EMIT SIGNAL */
791 JACKAudioBackend::_session_callback (jack_session_event_t *event, void *arg)
793 JACKAudioBackend* jab = static_cast<JACKAudioBackend*> (arg);
794 ARDOUR::Session* session = jab->engine.session();
797 JACKSession jsession (session);
798 jsession.session_event (event);
803 JACKAudioBackend::_freewheel_callback (int onoff, void *arg)
805 static_cast<JACKAudioBackend*>(arg)->freewheel_callback (onoff);
809 JACKAudioBackend::freewheel_callback (int onoff)
811 _freewheeling = onoff;
812 engine.freewheel_callback (onoff);
816 JACKAudioBackend::_latency_callback (jack_latency_callback_mode_t mode, void* arg)
818 return static_cast<JACKAudioBackend*> (arg)->jack_latency_callback (mode);
822 JACKAudioBackend::create_process_thread (boost::function<void()> f)
824 GET_PRIVATE_JACK_POINTER_RET (_priv_jack, -1);
826 jack_native_thread_t thread_id;
827 ThreadData* td = new ThreadData (this, f, thread_stack_size());
829 if (jack_client_create_thread (_priv_jack, &thread_id, jack_client_real_time_priority (_priv_jack),
830 jack_is_realtime (_priv_jack), _start_process_thread, td)) {
834 _jack_threads.push_back(thread_id);
839 JACKAudioBackend::join_process_threads ()
843 for (std::vector<jack_native_thread_t>::const_iterator i = _jack_threads.begin ();
844 i != _jack_threads.end(); i++) {
846 #if defined(USING_JACK2_EXPANSION_OF_JACK_API) || defined __jack_systemdeps_h__
847 // jack_client is not used by JACK2's implementation
848 // also jack_client_close() leaves threads active
849 if (jack_client_stop_thread (NULL, *i) != 0)
852 if (pthread_join (*i, &status) != 0)
855 error << "AudioEngine: cannot stop process thread" << endmsg;
860 _jack_threads.clear();
866 JACKAudioBackend::in_process_thread ()
868 #if defined COMPILER_MINGW && (!defined PTW32_VERSION || defined __jack_systemdeps_h__)
869 if (_main_thread == GetCurrentThread()) {
873 if (pthread_equal (_main_thread, pthread_self()) != 0) {
878 for (std::vector<jack_native_thread_t>::const_iterator i = _jack_threads.begin ();
879 i != _jack_threads.end(); i++) {
881 #if defined COMPILER_MINGW && (!defined PTW32_VERSION || defined __jack_systemdeps_h__)
882 if (*i == GetCurrentThread()) {
886 if (pthread_equal (*i, pthread_self()) != 0) {
896 JACKAudioBackend::process_thread_count ()
898 return _jack_threads.size();
902 JACKAudioBackend::_start_process_thread (void* arg)
904 ThreadData* td = reinterpret_cast<ThreadData*> (arg);
905 boost::function<void()> f = td->f;
914 JACKAudioBackend::_process_thread (void *arg)
916 return static_cast<JACKAudioBackend*> (arg)->process_thread ();
920 JACKAudioBackend::process_thread ()
922 /* JACK doesn't do this for us when we use the wait API
925 #if defined COMPILER_MINGW && (!defined PTW32_VERSION || defined __jack_systemdeps_h__)
926 _main_thread = GetCurrentThread();
928 _main_thread = pthread_self ();
932 AudioEngine::thread_init_callback (this);
935 GET_PRIVATE_JACK_POINTER_RET(_priv_jack,0);
937 pframes_t nframes = jack_cycle_wait (_priv_jack);
939 if (engine.process_callback (nframes)) {
943 jack_cycle_signal (_priv_jack, 0);
950 JACKAudioBackend::_sample_rate_callback (pframes_t nframes, void *arg)
952 return static_cast<JACKAudioBackend*> (arg)->jack_sample_rate_callback (nframes);
956 JACKAudioBackend::jack_sample_rate_callback (pframes_t nframes)
958 _current_sample_rate = nframes;
959 return engine.sample_rate_change (nframes);
963 JACKAudioBackend::jack_latency_callback (jack_latency_callback_mode_t mode)
965 engine.latency_callback (mode == JackPlaybackLatency);
969 JACKAudioBackend::_bufsize_callback (pframes_t nframes, void *arg)
971 return static_cast<JACKAudioBackend*> (arg)->jack_bufsize_callback (nframes);
975 JACKAudioBackend::jack_bufsize_callback (pframes_t nframes)
977 /* if the size has not changed, this should be a no-op */
979 if (nframes == _current_buffer_size) {
983 GET_PRIVATE_JACK_POINTER_RET (_priv_jack, 1);
985 _current_buffer_size = nframes;
987 if (jack_port_type_get_buffer_size) {
988 _raw_buffer_sizes[DataType::AUDIO] = jack_port_type_get_buffer_size (_priv_jack, JACK_DEFAULT_AUDIO_TYPE);
989 _raw_buffer_sizes[DataType::MIDI] = jack_port_type_get_buffer_size (_priv_jack, JACK_DEFAULT_MIDI_TYPE);
992 /* Old version of JACK.
994 These crude guesses, see below where we try to get the right answers.
996 Note that our guess for MIDI deliberatey tries to overestimate
997 by a little. It would be nicer if we could get the actual
998 size from a port, but we have to use this estimate in the
999 event that there are no MIDI ports currently. If there are
1000 the value will be adjusted below.
1003 _raw_buffer_sizes[DataType::AUDIO] = nframes * sizeof (Sample);
1004 _raw_buffer_sizes[DataType::MIDI] = nframes * 4 - (nframes/2);
1007 engine.buffer_size_change (nframes);
1013 JACKAudioBackend::disconnected (const char* why)
1015 bool was_running = _running;
1018 _current_buffer_size = 0;
1019 _current_sample_rate = 0;
1022 engine.halted_callback (why); /* EMIT SIGNAL */
1027 JACKAudioBackend::dsp_load() const
1029 GET_PRIVATE_JACK_POINTER_RET(_priv_jack,0);
1030 return jack_cpu_load (_priv_jack);
1034 JACKAudioBackend::update_latencies ()
1036 GET_PRIVATE_JACK_POINTER (_priv_jack);
1037 jack_recompute_total_latencies (_priv_jack);
1041 JACKAudioBackend::n_physical (unsigned long flags) const
1045 GET_PRIVATE_JACK_POINTER_RET (_priv_jack, c);
1047 const char ** ports = jack_get_ports (_priv_jack, NULL, NULL, JackPortIsPhysical | flags);
1050 for (uint32_t i = 0; ports[i]; ++i) {
1051 if (!strstr (ports[i], "Midi-Through")) {
1052 DataType t = port_data_type (jack_port_by_name (_priv_jack, ports[i]));
1053 if (t != DataType::NIL) {
1054 c.set (t, c.get (t) + 1);
1066 JACKAudioBackend::can_change_sample_rate_when_running () const
1072 JACKAudioBackend::can_change_buffer_size_when_running () const
1078 JACKAudioBackend::control_app_name () const
1080 /* Since JACK/ALSA really don't provide particularly integrated support
1081 for the idea of a control app to be used to control a device,
1082 allow the user to take some control themselves if necessary.
1085 const char* env_value = g_getenv ("ARDOUR_DEVICE_CONTROL_APP");
1089 if (_target_driver.empty() || _target_device.empty()) {
1093 if (_target_driver == "ALSA") {
1095 if (_target_device == "Hammerfall DSP") {
1096 appname = "hdspconf";
1097 } else if (_target_device == "M Audio Delta 1010") {
1098 appname = "mudita24";
1099 } else if (_target_device == "M2496") {
1100 appname = "mudita24";
1104 appname = env_value;
1111 JACKAudioBackend::launch_control_app ()
1113 string appname = control_app_name();
1115 if (appname.empty()) {
1116 error << string_compose (_("There is no control application for the device \"%1\""), _target_device) << endmsg;
1120 std::list<string> args;
1121 args.push_back (appname);
1122 Glib::spawn_async ("", args, Glib::SPAWN_SEARCH_PATH);
1126 JACKAudioBackend::enumerate_midi_options () const
1128 return ARDOUR::enumerate_midi_options ();
1132 JACKAudioBackend::set_midi_option (const string& opt)
1134 _target_midi_option = opt;
1139 JACKAudioBackend::speed_and_position (double& speed, framepos_t& position)
1141 jack_position_t pos;
1142 jack_transport_state_t state;
1145 /* this won't be called if the port engine in use is not JACK, so we do
1146 not have to worry about the type of PortEngine::private_handle()
1152 GET_PRIVATE_JACK_POINTER_RET (_priv_jack, true);
1154 state = jack_transport_query (_priv_jack, &pos);
1157 case JackTransportStopped:
1161 case JackTransportRolling:
1165 case JackTransportLooping:
1169 case JackTransportStarting:
1171 // don't adjust speed here, just leave it as it was
1174 starting = true; // jack2: JackTransportNetStarting
1175 std::cerr << "WARNING: Unknown JACK transport state: " << state << std::endl;
1178 position = pos.frame;
1183 JACKAudioBackend::reset_device ()
1185 /* XXX need to figure out what this means for JACK