1 #include "ardour/jack_audiobackend.h"
3 #define GET_PRIVATE_JACK_POINTER(j) jack_client_t* _priv_jack = (jack_client_t*) (j); if (!_priv_jack) { return; }
4 #define GET_PRIVATE_JACK_POINTER_RET(j,r) jack_client_t* _priv_jack = (jack_client_t*) (j); if (!_priv_jack) { return r; }
7 JACKAudioBackend::start ()
9 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
13 if (!jack_port_type_get_buffer_size) {
14 warning << _("This version of JACK is old - you should upgrade to a newer version that supports jack_port_type_get_buffer_size()") << endmsg;
18 BootMessage (_("Connect session to engine"));
19 _session->set_frame_rate (jack_get_sample_rate (_priv_jack));
22 /* a proxy for whether jack_activate() will definitely call the buffer size
23 * callback. with older versions of JACK, this function symbol will be null.
24 * this is reliable, but not clean.
27 if (!jack_port_type_get_buffer_size) {
28 jack_bufsize_callback (jack_get_buffer_size (_priv_jack));
31 _processed_frames = 0;
32 last_monitor_check = 0;
34 set_jack_callbacks ();
36 if (jack_activate (_priv_jack) == 0) {
39 Running(); /* EMIT SIGNAL */
41 // error << _("cannot activate JACK client") << endmsg;
45 return _running ? 0 : -1;
49 JACKAudioBackend::stop ()
51 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
54 Glib::Threads::Mutex::Lock lm (_process_lock);
55 jack_client_close (_priv_jack);
61 _raw_buffer_sizes.clear();
67 JACKAudioBackend::pause ()
69 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
72 jack_deactivate (_priv_jack);
79 JACKAudioBackend::freewheel (bool onoff)
81 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
83 if (onoff == _freewheeling) {
84 /* already doing what has been asked for */
89 return jack_set_freewheel (_priv_jack, onoff);
93 JACKAudioBackend::set_parameters (const Parameters& params)
99 JACKAudioBackend::get_parameters (Parameters& params) const
107 AudioEngine::frames_per_cycle () const
109 GET_PRIVATE_JACK_POINTER_RET (_jack,0);
110 if (_buffer_size == 0) {
111 return jack_get_buffer_size (_jack);
118 AudioEngine::frame_rate () const
120 GET_PRIVATE_JACK_POINTER_RET (_jack, 0);
121 if (_frame_rate == 0) {
122 return (_frame_rate = jack_get_sample_rate (_priv_jack));
129 AudioEngine::raw_buffer_size (DataType t)
131 std::map<DataType,size_t>::const_iterator s = _raw_buffer_sizes.find(t);
132 return (s != _raw_buffer_sizes.end()) ? s->second : 0;
137 /*--- private support methods ---*/
140 JACKAudioBackend::connect_to_jack (string client_name, string session_uuid)
142 EnvironmentalProtectionAgency* global_epa = EnvironmentalProtectionAgency::get_global_epa ();
143 boost::scoped_ptr<EnvironmentalProtectionAgency> current_epa;
144 jack_status_t status;
146 /* revert all environment settings back to whatever they were when ardour started
150 current_epa.reset (new EnvironmentalProtectionAgency(true)); /* will restore settings when we leave scope */
151 global_epa->restore ();
154 jack_client_name = client_name; /* might be reset below */
155 #ifdef HAVE_JACK_SESSION
156 if (!session_uuid.empty())
157 _jack = jack_client_open (jack_client_name.c_str(), JackSessionID, &status, session_uuid.c_str());
160 _jack = jack_client_open (jack_client_name.c_str(), JackNullOption, &status, 0);
163 // error message is not useful here
167 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
169 if (status & JackNameNotUnique) {
170 jack_client_name = jack_get_client_name (_priv_jack);
177 JACKAudioBackend::disconnect_from_jack ()
181 JACKAudioBackend::reconnect_to_jack ()
184 disconnect_from_jack ();
185 /* XXX give jackd a chance */
186 Glib::usleep (250000);
189 if (connect_to_jack (jack_client_name, "")) {
190 error << _("failed to connect to JACK") << endmsg;
196 boost::shared_ptr<Ports> p = ports.reader ();
198 for (i = p->begin(); i != p->end(); ++i) {
199 if (i->second->reestablish ()) {
210 GET_PRIVATE_JACK_POINTER_RET (_jack,-1);
212 MIDI::Manager::instance()->reestablish (_priv_jack);
215 _session->reset_jack_connection (_priv_jack);
216 jack_bufsize_callback (jack_get_buffer_size (_priv_jack));
217 _session->set_frame_rate (jack_get_sample_rate (_priv_jack));
220 last_monitor_check = 0;
222 set_jack_callbacks ();
224 if (jack_activate (_priv_jack) == 0) {
231 /* re-establish connections */
233 for (i = p->begin(); i != p->end(); ++i) {
234 i->second->reconnect ();
237 MIDI::Manager::instance()->reconnect ();
239 Running (); /* EMIT SIGNAL*/
241 start_metering_thread ();
247 JACKAudioBackend::request_buffer_size (pframes_t nframes)
249 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
251 if (nframes == jack_get_buffer_size (_priv_jack)) {
255 return jack_set_buffer_size (_priv_jack, nframes);
258 /* --- TRANSPORT STATE MANAGEMENT --- */
261 JACKAudioBackend::transport_stop ()
263 GET_PRIVATE_JACK_POINTER (_jack);
264 jack_transport_stop (_priv_jack);
268 JACKAudioBackend::transport_start ()
270 GET_PRIVATE_JACK_POINTER (_jack);
271 jack_transport_start (_priv_jack);
275 JACKAudioBackend::transport_locate (framepos_t where)
277 GET_PRIVATE_JACK_POINTER (_jack);
278 jack_transport_locate (_priv_jack, where);
282 JACKAudioBackend::transport_frame () const
284 GET_PRIVATE_JACK_POINTER_RET (_jack, 0);
285 return jack_get_current_transport_frame (_priv_jack);
288 JACKAudioBackend::TransportState
289 JACKAudioBackend::transport_state ()
291 GET_PRIVATE_JACK_POINTER_RET (_jack, ((TransportState) JackTransportStopped));
293 return (TransportState) jack_transport_query (_priv_jack, &pos);
297 JACKAudioBackend::set_time_master (bool yn)
299 GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
301 return jack_set_timebase_callback (_priv_jack, 0, _jack_timebase_callback, this);
303 return jack_release_timebase (_jack);
309 framecnt_t frame_rate () const;
310 pframes_t frames_per_cycle () const;
312 size_t raw_buffer_size(DataType t);
314 int usecs_per_cycle () const { return _usecs_per_cycle; }
317 JACKAudioBackend::get_sync_offset (pframes_t& offset) const
320 #ifdef HAVE_JACK_VIDEO_SUPPORT
322 GET_PRIVATE_JACK_POINTER_RET (_jack, false);
327 (void) jack_transport_query (_priv_jack, &pos);
329 if (pos.valid & JackVideoFrameOffset) {
330 offset = pos.video_offset;
343 JACKAudioBackend::frames_since_cycle_start ()
345 jack_client_t* _priv_jack = _jack;
346 if (!_running || !_priv_jack) {
349 return jack_frames_since_cycle_start (_priv_jack);
353 JACKAudioBackend::frame_time ()
355 jack_client_t* _priv_jack = _jack;
356 if (!_running || !_priv_jack) {
359 return jack_frame_time (_priv_jack);
363 JACKAudioBackend::frame_time_at_cycle_start ()
365 jack_client_t* _priv_jack = _jack;
366 if (!_running || !_priv_jack) {
369 return jack_last_frame_time (_priv_jack);
375 ardour_jack_error (const char* msg)
377 error << "JACK: " << msg << endmsg;
381 JACKAudioBackend::set_jack_callbacks ()
383 GET_PRIVATE_JACK_POINTER (_jack);
385 if (jack_on_info_shutdown) {
386 jack_on_info_shutdown (_priv_jack, halted_info, this);
388 jack_on_shutdown (_priv_jack, halted, this);
391 jack_set_thread_init_callback (_priv_jack, _thread_init_callback, this);
392 jack_set_process_thread (_priv_jack, _process_thread, this);
393 jack_set_sample_rate_callback (_priv_jack, _sample_rate_callback, this);
394 jack_set_buffer_size_callback (_priv_jack, _bufsize_callback, this);
395 jack_set_graph_order_callback (_priv_jack, _graph_order_callback, this);
396 jack_set_port_registration_callback (_priv_jack, _registration_callback, this);
397 jack_set_port_connect_callback (_priv_jack, _connect_callback, this);
398 jack_set_xrun_callback (_priv_jack, _xrun_callback, this);
399 jack_set_sync_callback (_priv_jack, _jack_sync_callback, this);
400 jack_set_freewheel_callback (_priv_jack, _freewheel_callback, this);
402 if (_session && _session->config.get_jack_time_master()) {
403 jack_set_timebase_callback (_priv_jack, 0, _jack_timebase_callback, this);
406 #ifdef HAVE_JACK_SESSION
407 if( jack_set_session_callback)
408 jack_set_session_callback (_priv_jack, _session_callback, this);
411 if (jack_set_latency_callback) {
412 jack_set_latency_callback (_priv_jack, _latency_callback, this);
415 jack_set_error_function (ardour_jack_error);
419 JACKAudioBackend::_jack_timebase_callback (jack_transport_state_t state, pframes_t nframes,
420 jack_position_t* pos, int new_position, void *arg)
422 static_cast<AudioEngine*> (arg)->jack_timebase_callback (state, nframes, pos, new_position);
426 JACKAudioBackend::jack_timebase_callback (jack_transport_state_t state, pframes_t nframes,
427 jack_position_t* pos, int new_position)
429 if (_jack && _session && _session->synced_to_jack()) {
430 _session->jack_timebase_callback (state, nframes, pos, new_position);
435 JACKAudioBackend::_jack_sync_callback (jack_transport_state_t state, jack_position_t* pos, void* arg)
437 return static_cast<AudioEngine*> (arg)->jack_sync_callback (state, pos);
441 JACKAudioBackend::jack_sync_callback (jack_transport_state_t state, jack_position_t* pos)
443 if (_jack && _session) {
444 return _session->jack_sync_callback (state, pos);
451 JACKAudioBackend::_xrun_callback (void *arg)
453 AudioEngine* ae = static_cast<AudioEngine*> (arg);
454 if (ae->connected()) {
455 ae->Xrun (); /* EMIT SIGNAL */
460 #ifdef HAVE_JACK_SESSION
462 JACKAudioBackend::_session_callback (jack_session_event_t *event, void *arg)
464 AudioEngine* ae = static_cast<AudioEngine*> (arg);
465 if (ae->connected()) {
466 ae->JackSessionEvent ( event ); /* EMIT SIGNAL */
472 JACKAudioBackend::_graph_order_callback (void *arg)
474 AudioEngine* ae = static_cast<AudioEngine*> (arg);
476 if (ae->connected() && !ae->port_remove_in_progress) {
477 ae->GraphReordered (); /* EMIT SIGNAL */
484 JACKAudioBackend::_freewheel_callback (int onoff, void *arg)
486 static_cast<AudioEngine*>(arg)->freewheel_callback (onoff);
490 JACKAudioBackend::freewheel_callback (int onoff)
492 _freewheeling = onoff;
495 _pre_freewheel_mmc_enabled = MIDI::Manager::instance()->mmc()->send_enabled ();
496 MIDI::Manager::instance()->mmc()->enable_send (false);
498 MIDI::Manager::instance()->mmc()->enable_send (_pre_freewheel_mmc_enabled);
503 JACKAudioBackend::_registration_callback (jack_port_id_t /*id*/, int /*reg*/, void* arg)
505 AudioEngine* ae = static_cast<AudioEngine*> (arg);
507 if (!ae->port_remove_in_progress) {
508 ae->PortRegisteredOrUnregistered (); /* EMIT SIGNAL */
513 JACKAudioBackend::_latency_callback (jack_latency_callback_mode_t mode, void* arg)
515 return static_cast<AudioEngine *> (arg)->jack_latency_callback (mode);
519 JACKAudioBackend::_connect_callback (jack_port_id_t id_a, jack_port_id_t id_b, int conn, void* arg)
521 AudioEngine* ae = static_cast<AudioEngine*> (arg);
522 ae->connect_callback (id_a, id_b, conn);
526 JACKAudioBackend::connect_callback (jack_port_id_t id_a, jack_port_id_t id_b, int conn)
528 if (port_remove_in_progress) {
532 GET_PRIVATE_JACK_POINTER (_jack);
534 jack_port_t* jack_port_a = jack_port_by_id (_priv_jack, id_a);
535 jack_port_t* jack_port_b = jack_port_by_id (_priv_jack, id_b);
537 boost::shared_ptr<Port> port_a;
538 boost::shared_ptr<Port> port_b;
540 boost::shared_ptr<Ports> pr = ports.reader ();
543 x = pr->find (make_port_name_relative (jack_port_name (jack_port_a)));
544 if (x != pr->end()) {
548 x = pr->find (make_port_name_relative (jack_port_name (jack_port_b)));
549 if (x != pr->end()) {
553 PortConnectedOrDisconnected (
554 port_a, jack_port_name (jack_port_a),
555 port_b, jack_port_name (jack_port_b),
556 conn == 0 ? false : true
561 JACKAudioBackend::create_process_thread (boost::function<void()> f, pthread_t* thread, size_t stacksize)
563 GET_PRIVATE_JACK_POINTER_RET (_jack, 0);
564 ThreadData* td = new ThreadData (this, f, stacksize);
566 if (jack_client_create_thread (_priv_jack, thread, jack_client_real_time_priority (_priv_jack),
567 jack_is_realtime (_priv_jack), _start_process_thread, td)) {
575 JACKAudioBackend::_start_process_thread (void* arg)
577 ThreadData* td = reinterpret_cast<ThreadData*> (arg);
578 boost::function<void()> f = td->f;
587 JACKAudioBackend::_process_thread (void *arg)
589 return static_cast<AudioEngine *> (arg)->process_thread ();
593 JACKAudioBackend::process_thread ()
595 /* JACK doesn't do this for us when we use the wait API
598 _thread_init_callback (0);
600 _main_thread = new ProcessThread;
603 GET_PRIVATE_JACK_POINTER_RET(_jack,0);
605 pframes_t nframes = jack_cycle_wait (_priv_jack);
607 if (engine.process_callback (nframes)) {
611 jack_cycle_signal (_priv_jack, 0);
618 JACKAudioBackend::_sample_rate_callback (pframes_t nframes, void *arg)
620 return static_cast<AudioEngine *> (arg)->jack_sample_rate_callback (nframes);
624 JACKAudioBackend::jack_sample_rate_callback (pframes_t nframes)
626 _frame_rate = nframes;
627 _usecs_per_cycle = (int) floor ((((double) frames_per_cycle() / nframes)) * 1000000.0);
629 /* check for monitor input change every 1/10th of second */
631 monitor_check_interval = nframes / 10;
632 last_monitor_check = 0;
635 _session->set_frame_rate (nframes);
638 SampleRateChanged (nframes); /* EMIT SIGNAL */
644 JACKAudioBackend::jack_latency_callback (jack_latency_callback_mode_t mode)
647 _session->update_latency (mode == JackPlaybackLatency);
652 JACKAudioBackend::_bufsize_callback (pframes_t nframes, void *arg)
654 return static_cast<AudioEngine *> (arg)->jack_bufsize_callback (nframes);
658 JACKAudioBackend::jack_bufsize_callback (pframes_t nframes)
660 /* if the size has not changed, this should be a no-op */
662 if (nframes == _buffer_size) {
666 GET_PRIVATE_JACK_POINTER_RET (_jack, 1);
668 _buffer_size = nframes;
669 _usecs_per_cycle = (int) floor ((((double) nframes / frame_rate())) * 1000000.0);
670 last_monitor_check = 0;
672 if (jack_port_type_get_buffer_size) {
673 _raw_buffer_sizes[DataType::AUDIO] = jack_port_type_get_buffer_size (_priv_jack, JACK_DEFAULT_AUDIO_TYPE);
674 _raw_buffer_sizes[DataType::MIDI] = jack_port_type_get_buffer_size (_priv_jack, JACK_DEFAULT_MIDI_TYPE);
677 /* Old version of JACK.
679 These crude guesses, see below where we try to get the right answers.
681 Note that our guess for MIDI deliberatey tries to overestimate
682 by a little. It would be nicer if we could get the actual
683 size from a port, but we have to use this estimate in the
684 event that there are no MIDI ports currently. If there are
685 the value will be adjusted below.
688 _raw_buffer_sizes[DataType::AUDIO] = nframes * sizeof (Sample);
689 _raw_buffer_sizes[DataType::MIDI] = nframes * 4 - (nframes/2);
693 Glib::Threads::Mutex::Lock lm (_process_lock);
695 boost::shared_ptr<Ports> p = ports.reader();
697 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
703 _session->set_block_size (_buffer_size);
710 JACKAudioBackend::halted_info (jack_status_t code, const char* reason, void *arg)
712 /* called from jack shutdown handler */
714 AudioEngine* ae = static_cast<AudioEngine *> (arg);
715 bool was_running = ae->_running;
717 ae->stop_metering_thread ();
719 ae->_running = false;
720 ae->_buffer_size = 0;
725 MIDI::JackMIDIPort::JackHalted (); /* EMIT SIGNAL */
726 #ifdef HAVE_JACK_ON_INFO_SHUTDOWN
728 case JackBackendError:
729 ae->Halted(reason); /* EMIT SIGNAL */
732 ae->Halted(""); /* EMIT SIGNAL */
735 ae->Halted(""); /* EMIT SIGNAL */
741 JACKAudioBackend::halted (void *arg)
743 cerr << "HALTED by JACK\n";
745 /* called from jack shutdown handler */
747 AudioEngine* ae = static_cast<AudioEngine *> (arg);
748 bool was_running = ae->_running;
750 ae->stop_metering_thread ();
752 ae->_running = false;
753 ae->_buffer_size = 0;
758 MIDI::JackMIDIPort::JackHalted (); /* EMIT SIGNAL */
759 ae->Halted(""); /* EMIT SIGNAL */