Do a topological sort of the route list before passing it to
[ardour.git] / libs / ardour / audioengine.cc
1 /*
2     Copyright (C) 2002 Paul Davis
3
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.
8
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.
13
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.
17
18 */
19
20 #include <unistd.h>
21 #include <cerrno>
22 #include <vector>
23 #include <exception>
24 #include <stdexcept>
25 #include <sstream>
26
27 #include <glibmm/timer.h>
28
29 #include "pbd/pthread_utils.h"
30 #include "pbd/stacktrace.h"
31 #include "pbd/unknown_type.h"
32 #include "pbd/epa.h"
33
34 #include <jack/weakjack.h>
35
36 #include "midi++/port.h"
37 #include "midi++/mmc.h"
38 #include "midi++/manager.h"
39
40 #include "ardour/amp.h"
41 #include "ardour/audio_port.h"
42 #include "ardour/audioengine.h"
43 #include "ardour/buffer.h"
44 #include "ardour/buffer_set.h"
45 #include "ardour/cycle_timer.h"
46 #include "ardour/delivery.h"
47 #include "ardour/event_type_map.h"
48 #include "ardour/internal_return.h"
49 #include "ardour/io.h"
50 #include "ardour/meter.h"
51 #include "ardour/midi_port.h"
52 #include "ardour/process_thread.h"
53 #include "ardour/port.h"
54 #include "ardour/port_set.h"
55 #include "ardour/session.h"
56 #include "ardour/timestamps.h"
57 #include "ardour/utils.h"
58
59 #include "i18n.h"
60
61 using namespace std;
62 using namespace ARDOUR;
63 using namespace PBD;
64
65 gint AudioEngine::m_meter_exit;
66 AudioEngine* AudioEngine::_instance = 0;
67
68 #define GET_PRIVATE_JACK_POINTER(j)  jack_client_t* _priv_jack = (jack_client_t*) (j); if (!_priv_jack) { return; }
69 #define GET_PRIVATE_JACK_POINTER_RET(j,r) jack_client_t* _priv_jack = (jack_client_t*) (j); if (!_priv_jack) { return r; }
70
71 AudioEngine::AudioEngine (string client_name, string session_uuid)
72         : ports (new Ports)
73 {
74         _instance = this; /* singleton */
75
76         session_remove_pending = false;
77         _running = false;
78         _has_run = false;
79         last_monitor_check = 0;
80         monitor_check_interval = INT32_MAX;
81         _processed_frames = 0;
82         _usecs_per_cycle = 0;
83         _jack = 0;
84         _frame_rate = 0;
85         _buffer_size = 0;
86         _freewheeling = false;
87         _main_thread = 0;
88         port_remove_in_progress = false;
89
90         m_meter_thread = 0;
91         g_atomic_int_set (&m_meter_exit, 0);
92
93         if (connect_to_jack (client_name, session_uuid)) {
94                 throw NoBackendAvailable ();
95         }
96
97         Port::set_engine (this);
98 }
99
100 AudioEngine::~AudioEngine ()
101 {
102         {
103                 Glib::Mutex::Lock tm (_process_lock);
104                 session_removed.signal ();
105
106                 if (_running) {
107                         jack_client_close (_jack);
108                         _jack = 0;
109                 }
110
111                 stop_metering_thread ();
112         }
113 }
114
115 jack_client_t*
116 AudioEngine::jack() const
117 {
118         return _jack;
119 }
120
121 void
122 _thread_init_callback (void * /*arg*/)
123 {
124         /* make sure that anybody who needs to know about this thread
125            knows about it.
126         */
127
128         pthread_set_name (X_("audioengine"));
129
130         PBD::notify_gui_about_thread_creation ("gui", pthread_self(), X_("Audioengine"), 4096);
131         PBD::notify_gui_about_thread_creation ("midiui", pthread_self(), X_("Audioengine"), 128);
132
133         SessionEvent::create_per_thread_pool (X_("Audioengine"), 512);
134
135         MIDI::Port::set_process_thread (pthread_self());
136 }
137
138 static void
139 ardour_jack_error (const char* msg)
140 {
141         error << "JACK: " << msg << endmsg;
142 }
143
144 void
145 AudioEngine::set_jack_callbacks ()
146 {
147         GET_PRIVATE_JACK_POINTER (_jack);
148
149         if (jack_on_info_shutdown) {
150                 jack_on_info_shutdown (_priv_jack, halted_info, this);
151         } else {
152                 jack_on_shutdown (_priv_jack, halted, this);
153         }
154
155         jack_set_thread_init_callback (_priv_jack, _thread_init_callback, this);
156         jack_set_process_thread (_priv_jack, _process_thread, this);
157         jack_set_sample_rate_callback (_priv_jack, _sample_rate_callback, this);
158         jack_set_buffer_size_callback (_priv_jack, _bufsize_callback, this);
159         jack_set_graph_order_callback (_priv_jack, _graph_order_callback, this);
160         jack_set_port_registration_callback (_priv_jack, _registration_callback, this);
161         jack_set_port_connect_callback (_priv_jack, _connect_callback, this);
162         jack_set_xrun_callback (_priv_jack, _xrun_callback, this);
163         jack_set_sync_callback (_priv_jack, _jack_sync_callback, this);
164         jack_set_freewheel_callback (_priv_jack, _freewheel_callback, this);
165
166         if (_session && _session->config.get_jack_time_master()) {
167                 jack_set_timebase_callback (_priv_jack, 0, _jack_timebase_callback, this);
168         }
169
170 #ifdef HAVE_JACK_SESSION
171         if( jack_set_session_callback)
172                 jack_set_session_callback (_priv_jack, _session_callback, this);
173 #endif
174
175         if (jack_set_latency_callback) {
176                 jack_set_latency_callback (_priv_jack, _latency_callback, this);
177         }
178
179         jack_set_error_function (ardour_jack_error);
180 }
181
182 int
183 AudioEngine::start ()
184 {
185         GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
186
187         if (!_running) {
188
189                 if (!jack_port_type_get_buffer_size) {
190                         warning << _("This version of JACK is old - you should upgrade to a newer version that supports jack_port_type_get_buffer_size()") << endmsg;
191                 }
192
193                 if (_session) {
194                         BootMessage (_("Connect session to engine"));
195                         _session->set_frame_rate (jack_get_sample_rate (_priv_jack));
196                 }
197
198                 /* a proxy for whether jack_activate() will definitely call the buffer size
199                  * callback. with older versions of JACK, this function symbol will be null.
200                  * this is reliable, but not clean.
201                  */
202
203                 if (!jack_port_type_get_buffer_size) {
204                         jack_bufsize_callback (jack_get_buffer_size (_priv_jack));
205                 }
206                 
207                 _processed_frames = 0;
208                 last_monitor_check = 0;
209
210                 set_jack_callbacks ();
211
212                 if (jack_activate (_priv_jack) == 0) {
213                         _running = true;
214                         _has_run = true;
215                         Running(); /* EMIT SIGNAL */
216                 } else {
217                         // error << _("cannot activate JACK client") << endmsg;
218                 }
219         }
220                 
221         return _running ? 0 : -1;
222 }
223
224 int
225 AudioEngine::stop (bool forever)
226 {
227         GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
228
229         if (_priv_jack) {
230                 if (forever) {
231                         disconnect_from_jack ();
232                 } else {
233                         jack_deactivate (_priv_jack);
234                         Stopped(); /* EMIT SIGNAL */
235                         MIDI::Port::JackHalted (); /* EMIT SIGNAL */
236                 }
237         }
238
239         if (forever) {
240                 stop_metering_thread ();
241         }
242
243         return _running ? -1 : 0;
244 }
245
246
247 bool
248 AudioEngine::get_sync_offset (pframes_t& offset) const
249 {
250
251 #ifdef HAVE_JACK_VIDEO_SUPPORT
252
253         GET_PRIVATE_JACK_POINTER_RET (_jack, false);
254
255         jack_position_t pos;
256
257         if (_priv_jack) {
258                 (void) jack_transport_query (_priv_jack, &pos);
259
260                 if (pos.valid & JackVideoFrameOffset) {
261                         offset = pos.video_offset;
262                         return true;
263                 }
264         }
265 #else
266         /* keep gcc happy */
267         offset = 0;
268 #endif
269
270         return false;
271 }
272
273 void
274 AudioEngine::_jack_timebase_callback (jack_transport_state_t state, pframes_t nframes,
275                                       jack_position_t* pos, int new_position, void *arg)
276 {
277         static_cast<AudioEngine*> (arg)->jack_timebase_callback (state, nframes, pos, new_position);
278 }
279
280 void
281 AudioEngine::jack_timebase_callback (jack_transport_state_t state, pframes_t nframes,
282                                      jack_position_t* pos, int new_position)
283 {
284         if (_jack && _session && _session->synced_to_jack()) {
285                 _session->jack_timebase_callback (state, nframes, pos, new_position);
286         }
287 }
288
289 int
290 AudioEngine::_jack_sync_callback (jack_transport_state_t state, jack_position_t* pos, void* arg)
291 {
292         return static_cast<AudioEngine*> (arg)->jack_sync_callback (state, pos);
293 }
294
295 int
296 AudioEngine::jack_sync_callback (jack_transport_state_t state, jack_position_t* pos)
297 {
298         if (_jack && _session) {
299                 return _session->jack_sync_callback (state, pos);
300         }
301
302         return true;
303 }
304
305 int
306 AudioEngine::_xrun_callback (void *arg)
307 {
308         AudioEngine* ae = static_cast<AudioEngine*> (arg);
309         if (ae->connected()) {
310                 ae->Xrun (); /* EMIT SIGNAL */
311         }
312         return 0;
313 }
314
315 #ifdef HAVE_JACK_SESSION
316 void
317 AudioEngine::_session_callback (jack_session_event_t *event, void *arg)
318 {
319         printf( "helo.... " );
320         AudioEngine* ae = static_cast<AudioEngine*> (arg);
321         if (ae->connected()) {
322                 ae->JackSessionEvent ( event ); /* EMIT SIGNAL */
323         }
324 }
325 #endif
326 int
327 AudioEngine::_graph_order_callback (void *arg)
328 {
329         AudioEngine* ae = static_cast<AudioEngine*> (arg);
330
331         if (ae->connected() && !ae->port_remove_in_progress) {
332                 ae->GraphReordered (); /* EMIT SIGNAL */
333         }
334         
335         return 0;
336 }
337
338 /** Wrapped which is called by JACK as its process callback.  It is just
339  * here to get us back into C++ land by calling AudioEngine::process_callback()
340  * @param nframes Number of frames passed by JACK.
341  * @param arg User argument passed by JACK, which will be the AudioEngine*.
342  */
343 int
344 AudioEngine::_process_callback (pframes_t nframes, void *arg)
345 {
346         return static_cast<AudioEngine *> (arg)->process_callback (nframes);
347 }
348
349 void*
350 AudioEngine::_process_thread (void *arg)
351 {
352         return static_cast<AudioEngine *> (arg)->process_thread ();
353 }
354
355 void
356 AudioEngine::_freewheel_callback (int onoff, void *arg)
357 {
358         static_cast<AudioEngine*>(arg)->_freewheeling = onoff;
359 }
360
361 void
362 AudioEngine::_registration_callback (jack_port_id_t /*id*/, int /*reg*/, void* arg)
363 {
364         AudioEngine* ae = static_cast<AudioEngine*> (arg);
365
366         if (!ae->port_remove_in_progress) {
367                 ae->PortRegisteredOrUnregistered (); /* EMIT SIGNAL */
368         }
369 }
370
371 void
372 AudioEngine::_latency_callback (jack_latency_callback_mode_t mode, void* arg)
373 {
374         return static_cast<AudioEngine *> (arg)->jack_latency_callback (mode);
375 }
376
377 void
378 AudioEngine::_connect_callback (jack_port_id_t id_a, jack_port_id_t id_b, int conn, void* arg)
379 {
380         AudioEngine* ae = static_cast<AudioEngine*> (arg);
381
382         if (ae->port_remove_in_progress) {
383                 return;
384         }
385
386         GET_PRIVATE_JACK_POINTER (ae->_jack);
387
388         jack_port_t* jack_port_a = jack_port_by_id (_priv_jack, id_a);
389         jack_port_t* jack_port_b = jack_port_by_id (_priv_jack, id_b);
390
391         boost::shared_ptr<Port> port_a;
392         boost::shared_ptr<Port> port_b;
393
394         boost::shared_ptr<Ports> pr = ae->ports.reader ();
395         Ports::iterator i = pr->begin ();
396         while (i != pr->end() && (port_a == 0 || port_b == 0)) {
397                 if (jack_port_a == (*i)->jack_port()) {
398                         port_a = *i;
399                 } else if (jack_port_b == (*i)->jack_port()) {
400                         port_b = *i;
401                 }
402                 ++i;
403         }
404
405         ae->PortConnectedOrDisconnected (
406                 port_a, jack_port_name (jack_port_a),
407                 port_b, jack_port_name (jack_port_b),
408                 conn == 0 ? false : true
409                 ); /* EMIT SIGNAL */
410 }
411
412 void
413 AudioEngine::split_cycle (pframes_t offset)
414 {
415         /* caller must hold process lock */
416
417         Port::increment_global_port_buffer_offset (offset);
418
419         /* tell all Ports that we're going to start a new (split) cycle */
420
421         boost::shared_ptr<Ports> p = ports.reader();
422
423         for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
424                 (*i)->cycle_split ();
425         }
426 }
427
428 void*
429 AudioEngine::process_thread ()
430 {
431         /* JACK doesn't do this for us when we use the wait API
432          */
433
434         _thread_init_callback (0);
435
436         _main_thread = new ProcessThread;
437
438         while (1) {
439                 GET_PRIVATE_JACK_POINTER_RET(_jack,0);
440
441                 pframes_t nframes = jack_cycle_wait (_priv_jack);
442
443                 if (process_callback (nframes)) {
444                         return 0;
445                 }
446
447                 jack_cycle_signal (_priv_jack, 0);
448         }
449
450         return 0;
451 }
452
453 /** Method called by JACK (via _process_callback) which says that there
454  * is work to be done.
455  * @param nframes Number of frames to process.
456  */
457 int
458 AudioEngine::process_callback (pframes_t nframes)
459 {
460         GET_PRIVATE_JACK_POINTER_RET(_jack,0);
461         // CycleTimer ct ("AudioEngine::process");
462         Glib::Mutex::Lock tm (_process_lock, Glib::TRY_LOCK);
463
464         /// The number of frames that will have been processed when we've finished
465         pframes_t next_processed_frames;
466
467         /* handle wrap around of total frames counter */
468
469         if (max_framepos - _processed_frames < nframes) {
470                 next_processed_frames = nframes - (max_framepos - _processed_frames);
471         } else {
472                 next_processed_frames = _processed_frames + nframes;
473         }
474
475         if (!tm.locked() || _session == 0) {
476                 /* return having done nothing */
477                 _processed_frames = next_processed_frames;
478                 return 0;
479         }
480
481         if (session_remove_pending) {
482                 /* perform the actual session removal */
483                 _session = 0;
484                 session_remove_pending = false;
485                 session_removed.signal();
486                 _processed_frames = next_processed_frames;
487                 return 0;
488         }
489
490         /* tell all relevant objects that we're starting a new cycle */
491
492         Delivery::CycleStart (nframes);
493         Port::set_global_port_buffer_offset (0);
494         Port::set_cycle_framecnt (nframes);
495         InternalReturn::CycleStart (nframes);
496
497         /* tell all Ports that we're starting a new cycle */
498
499         boost::shared_ptr<Ports> p = ports.reader();
500
501         for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
502                 (*i)->cycle_start (nframes);
503         }
504
505         /* test if we are freewheeling and there are freewheel signals connected.
506            ardour should act normally even when freewheeling unless /it/ is exporting */
507
508
509         if (_freewheeling && !Freewheel.empty()) {
510                 /* emit the Freewheel signal and stop freewheeling in the event of trouble
511                  */
512                 boost::optional<int> r = Freewheel (nframes);
513                 if (r.get_value_or (0)) {
514                         jack_set_freewheel (_priv_jack, false);
515                 }
516
517         } else {
518                 if (_session) {
519                         _session->process (nframes);
520
521                 }
522         }
523
524         if (_freewheeling) {
525                 return 0;
526         }
527
528         if (!_running) {
529                 _processed_frames = next_processed_frames;
530                 return 0;
531         }
532
533         if (last_monitor_check + monitor_check_interval < next_processed_frames) {
534
535                 boost::shared_ptr<Ports> p = ports.reader();
536
537                 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
538
539                         bool x;
540
541                         if ((*i)->last_monitor() != (x = (*i)->monitoring_input ())) {
542                                 (*i)->set_last_monitor (x);
543                                 /* XXX I think this is dangerous, due to
544                                    a likely mutex in the signal handlers ...
545                                 */
546                                 (*i)->MonitorInputChanged (x); /* EMIT SIGNAL */
547                         }
548                 }
549                 last_monitor_check = next_processed_frames;
550         }
551
552         if (_session->silent()) {
553
554                 boost::shared_ptr<Ports> p = ports.reader();
555
556                 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
557
558                         if ((*i)->sends_output()) {
559                                 (*i)->get_buffer(nframes).silence(nframes);
560                         }
561                 }
562         }
563
564         // Finalize ports
565
566         for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
567                 (*i)->cycle_end (nframes);
568         }
569
570         _processed_frames = next_processed_frames;
571         return 0;
572 }
573
574 int
575 AudioEngine::_sample_rate_callback (pframes_t nframes, void *arg)
576 {
577         return static_cast<AudioEngine *> (arg)->jack_sample_rate_callback (nframes);
578 }
579
580 int
581 AudioEngine::jack_sample_rate_callback (pframes_t nframes)
582 {
583         _frame_rate = nframes;
584         _usecs_per_cycle = (int) floor ((((double) frames_per_cycle() / nframes)) * 1000000.0);
585
586         /* check for monitor input change every 1/10th of second */
587
588         monitor_check_interval = nframes / 10;
589         last_monitor_check = 0;
590
591         if (_session) {
592                 _session->set_frame_rate (nframes);
593         }
594
595         SampleRateChanged (nframes); /* EMIT SIGNAL */
596
597         return 0;
598 }
599
600 void
601 AudioEngine::jack_latency_callback (jack_latency_callback_mode_t mode)
602 {
603         if (_session) {
604                 _session->update_latency (mode == JackPlaybackLatency);
605         }
606 }
607
608 int
609 AudioEngine::_bufsize_callback (pframes_t nframes, void *arg)
610 {
611         return static_cast<AudioEngine *> (arg)->jack_bufsize_callback (nframes);
612 }
613
614 int
615 AudioEngine::jack_bufsize_callback (pframes_t nframes)
616 {
617         /* if the size has not changed, this should be a no-op */
618
619         if (nframes == _buffer_size) {
620                 return 0;
621         }
622
623         GET_PRIVATE_JACK_POINTER_RET (_jack, 1);
624
625         _buffer_size = nframes;
626         _usecs_per_cycle = (int) floor ((((double) nframes / frame_rate())) * 1000000.0);
627         last_monitor_check = 0;
628
629         if (jack_port_type_get_buffer_size) {
630                 _raw_buffer_sizes[DataType::AUDIO] = jack_port_type_get_buffer_size (_priv_jack, JACK_DEFAULT_AUDIO_TYPE);
631                 _raw_buffer_sizes[DataType::MIDI] = jack_port_type_get_buffer_size (_priv_jack, JACK_DEFAULT_MIDI_TYPE);
632         } else {
633
634                 /* Old version of JACK.
635
636                    These crude guesses, see below where we try to get the right answers.
637
638                    Note that our guess for MIDI deliberatey tries to overestimate
639                    by a little. It would be nicer if we could get the actual
640                    size from a port, but we have to use this estimate in the
641                    event that there are no MIDI ports currently. If there are
642                    the value will be adjusted below.
643                 */
644
645                 _raw_buffer_sizes[DataType::AUDIO] = nframes * sizeof (Sample);
646                 _raw_buffer_sizes[DataType::MIDI] = nframes * 4 - (nframes/2);
647         }
648
649         {
650                 Glib::Mutex::Lock lm (_process_lock);
651
652                 boost::shared_ptr<Ports> p = ports.reader();
653
654                 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
655                         (*i)->reset();
656                 }
657         }
658
659         if (_session) {
660                 _session->set_block_size (_buffer_size);
661         }
662
663         return 0;
664 }
665
666 void
667 AudioEngine::stop_metering_thread ()
668 {
669         if (m_meter_thread) {
670                 g_atomic_int_set (&m_meter_exit, 1);
671                 m_meter_thread->join ();
672                 m_meter_thread = 0;
673         }
674 }
675
676 void
677 AudioEngine::start_metering_thread ()
678 {
679         if (m_meter_thread == 0) {
680                 g_atomic_int_set (&m_meter_exit, 0);
681                 m_meter_thread = Glib::Thread::create (boost::bind (&AudioEngine::meter_thread, this),
682                                                        500000, true, true, Glib::THREAD_PRIORITY_NORMAL);
683         }
684 }
685
686 void
687 AudioEngine::meter_thread ()
688 {
689         pthread_set_name (X_("meter"));
690
691         while (true) {
692                 Glib::usleep (10000); /* 1/100th sec interval */
693                 if (g_atomic_int_get(&m_meter_exit)) {
694                         break;
695                 }
696                 Metering::Meter ();
697         }
698 }
699
700 void
701 AudioEngine::set_session (Session *s)
702 {
703         Glib::Mutex::Lock pl (_process_lock);
704
705         SessionHandlePtr::set_session (s);
706
707         if (_session) {
708
709                 start_metering_thread ();
710
711                 pframes_t blocksize = jack_get_buffer_size (_jack);
712
713                 /* page in as much of the session process code as we
714                    can before we really start running.
715                 */
716
717                 boost::shared_ptr<Ports> p = ports.reader();
718
719                 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
720                         (*i)->cycle_start (blocksize);
721                 }
722
723                 _session->process (blocksize);
724                 _session->process (blocksize);
725                 _session->process (blocksize);
726                 _session->process (blocksize);
727                 _session->process (blocksize);
728                 _session->process (blocksize);
729                 _session->process (blocksize);
730                 _session->process (blocksize);
731
732                 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
733                         (*i)->cycle_end (blocksize);
734                 }
735         }
736 }
737
738 void
739 AudioEngine::remove_session ()
740 {
741         Glib::Mutex::Lock lm (_process_lock);
742
743         if (_running) {
744
745                 stop_metering_thread ();
746
747                 if (_session) {
748                         session_remove_pending = true;
749                         session_removed.wait(_process_lock);
750                 }
751
752         } else {
753                 SessionHandlePtr::set_session (0);
754         }
755
756         remove_all_ports ();
757 }
758
759 void
760 AudioEngine::port_registration_failure (const std::string& portname)
761 {
762         GET_PRIVATE_JACK_POINTER (_jack);
763         string full_portname = jack_client_name;
764         full_portname += ':';
765         full_portname += portname;
766
767
768         jack_port_t* p = jack_port_by_name (_priv_jack, full_portname.c_str());
769         string reason;
770
771         if (p) {
772                 reason = string_compose (_("a port with the name \"%1\" already exists: check for duplicated track/bus names"), portname);
773         } else {
774                 reason = string_compose (_("No more JACK ports are available. You will need to stop %1 and restart JACK with ports if you need this many tracks."), PROGRAM_NAME);
775         }
776
777         throw PortRegistrationFailure (string_compose (_("AudioEngine: cannot register port \"%1\": %2"), portname, reason).c_str());
778 }
779
780 boost::shared_ptr<Port>
781 AudioEngine::register_port (DataType dtype, const string& portname, bool input)
782 {
783         boost::shared_ptr<Port> newport;
784
785         try {
786                 if (dtype == DataType::AUDIO) {
787                         newport.reset (new AudioPort (portname, (input ? Port::IsInput : Port::IsOutput)));
788                 } else if (dtype == DataType::MIDI) {
789                         newport.reset (new MidiPort (portname, (input ? Port::IsInput : Port::IsOutput)));
790                 } else {
791                         throw PortRegistrationFailure("unable to create port (unknown type)");
792                 }
793
794                 RCUWriter<Ports> writer (ports);
795                 boost::shared_ptr<Ports> ps = writer.get_copy ();
796                 ps->insert (ps->begin(), newport);
797
798                 /* writer goes out of scope, forces update */
799
800                 return newport;
801         }
802
803         catch (PortRegistrationFailure& err) {
804                 throw err;
805         } catch (std::exception& e) {
806                 throw PortRegistrationFailure(string_compose(
807                                 _("unable to create port: %1"), e.what()).c_str());
808         } catch (...) {
809                 throw PortRegistrationFailure("unable to create port (unknown error)");
810         }
811 }
812
813 boost::shared_ptr<Port>
814 AudioEngine::register_input_port (DataType type, const string& portname)
815 {
816         return register_port (type, portname, true);
817 }
818
819 boost::shared_ptr<Port>
820 AudioEngine::register_output_port (DataType type, const string& portname)
821 {
822         return register_port (type, portname, false);
823 }
824
825 int
826 AudioEngine::unregister_port (boost::shared_ptr<Port> port)
827 {
828         /* caller must hold process lock */
829
830         if (!_running) {
831                 /* probably happening when the engine has been halted by JACK,
832                    in which case, there is nothing we can do here.
833                    */
834                 return 0;
835         }
836
837         {
838                 RCUWriter<Ports> writer (ports);
839                 boost::shared_ptr<Ports> ps = writer.get_copy ();
840                 ps->erase (port);
841
842                 /* writer goes out of scope, forces update */
843         }
844
845         ports.flush ();
846
847         return 0;
848 }
849
850 int
851 AudioEngine::connect (const string& source, const string& destination)
852 {
853         int ret;
854
855         if (!_running) {
856                 if (!_has_run) {
857                         fatal << _("connect called before engine was started") << endmsg;
858                         /*NOTREACHED*/
859                 } else {
860                         return -1;
861                 }
862         }
863
864         string s = make_port_name_non_relative (source);
865         string d = make_port_name_non_relative (destination);
866
867
868         boost::shared_ptr<Port> src = get_port_by_name (s);
869         boost::shared_ptr<Port> dst = get_port_by_name (d);
870
871         if (src) {
872                 ret = src->connect (d);
873         } else if (dst) {
874                 ret = dst->connect (s);
875         } else {
876                 /* neither port is known to us, and this API isn't intended for use as a general patch bay */
877                 ret = -1;
878         }
879
880         if (ret > 0) {
881                 /* already exists - no error, no warning */
882         } else if (ret < 0) {
883                 error << string_compose(_("AudioEngine: cannot connect %1 (%2) to %3 (%4)"),
884                                         source, s, destination, d)
885                       << endmsg;
886         }
887
888         return ret;
889 }
890
891 int
892 AudioEngine::disconnect (const string& source, const string& destination)
893 {
894         int ret;
895
896         if (!_running) {
897                 if (!_has_run) {
898                         fatal << _("disconnect called before engine was started") << endmsg;
899                         /*NOTREACHED*/
900                 } else {
901                         return -1;
902                 }
903         }
904
905         string s = make_port_name_non_relative (source);
906         string d = make_port_name_non_relative (destination);
907
908         boost::shared_ptr<Port> src = get_port_by_name (s);
909         boost::shared_ptr<Port> dst = get_port_by_name (d);
910
911         if (src) {
912                         ret = src->disconnect (d);
913         } else if (dst) {
914                         ret = dst->disconnect (s);
915         } else {
916                 /* neither port is known to us, and this API isn't intended for use as a general patch bay */
917                 ret = -1;
918         }
919         return ret;
920 }
921
922 int
923 AudioEngine::disconnect (boost::shared_ptr<Port> port)
924 {
925         GET_PRIVATE_JACK_POINTER_RET (_jack,-1);
926
927         if (!_running) {
928                 if (!_has_run) {
929                         fatal << _("disconnect called before engine was started") << endmsg;
930                         /*NOTREACHED*/
931                 } else {
932                         return -1;
933                 }
934         }
935
936         return port->disconnect_all ();
937 }
938
939 ARDOUR::framecnt_t
940 AudioEngine::frame_rate () const
941 {
942         GET_PRIVATE_JACK_POINTER_RET (_jack, 0);
943         if (_frame_rate == 0) {
944                 return (_frame_rate = jack_get_sample_rate (_priv_jack));
945         } else {
946                 return _frame_rate;
947         }
948 }
949
950 size_t
951 AudioEngine::raw_buffer_size (DataType t)
952 {
953         std::map<DataType,size_t>::const_iterator s = _raw_buffer_sizes.find(t);
954         return (s != _raw_buffer_sizes.end()) ? s->second : 0;
955 }
956
957 ARDOUR::pframes_t
958 AudioEngine::frames_per_cycle () const
959 {
960         GET_PRIVATE_JACK_POINTER_RET (_jack,0);
961         if (_buffer_size == 0) {
962                 return jack_get_buffer_size (_jack);
963         } else {
964                 return _buffer_size;
965         }
966 }
967
968 /** @param name Full or short name of port
969  *  @return Corresponding Port or 0.
970  */
971
972 boost::shared_ptr<Port>
973 AudioEngine::get_port_by_name (const string& portname)
974 {
975         if (!_running) {
976                 if (!_has_run) {
977                         fatal << _("get_port_by_name() called before engine was started") << endmsg;
978                         /*NOTREACHED*/
979                 } else {
980                         boost::shared_ptr<Port> ();
981                 }
982         }
983
984         if (!port_is_mine (portname)) {
985                 /* not an ardour port */
986                 return boost::shared_ptr<Port> ();
987         }
988
989         std::string const rel = make_port_name_relative (portname);
990
991         boost::shared_ptr<Ports> pr = ports.reader();
992
993         for (Ports::iterator i = pr->begin(); i != pr->end(); ++i) {
994                 if (rel == (*i)->name()) {
995                         return *i;
996                 }
997         }
998
999         return boost::shared_ptr<Port> ();
1000 }
1001
1002 const char **
1003 AudioEngine::get_ports (const string& port_name_pattern, const string& type_name_pattern, uint32_t flags)
1004 {
1005         GET_PRIVATE_JACK_POINTER_RET (_jack,0);
1006         if (!_running) {
1007                 if (!_has_run) {
1008                         fatal << _("get_ports called before engine was started") << endmsg;
1009                         /*NOTREACHED*/
1010                 } else {
1011                         return 0;
1012                 }
1013         }
1014         return jack_get_ports (_priv_jack, port_name_pattern.c_str(), type_name_pattern.c_str(), flags);
1015 }
1016
1017 void
1018 AudioEngine::halted_info (jack_status_t code, const char* reason, void *arg)
1019 {
1020         /* called from jack shutdown handler  */
1021
1022         AudioEngine* ae = static_cast<AudioEngine *> (arg);
1023         bool was_running = ae->_running;
1024
1025         ae->stop_metering_thread ();
1026
1027         ae->_running = false;
1028         ae->_buffer_size = 0;
1029         ae->_frame_rate = 0;
1030         ae->_jack = 0;
1031
1032         if (was_running) {
1033 #ifdef HAVE_JACK_ON_INFO_SHUTDOWN
1034                 switch (code) {
1035                 case JackBackendError:
1036                         ae->Halted(reason); /* EMIT SIGNAL */
1037                         break;
1038                 default:
1039                         ae->Halted(""); /* EMIT SIGNAL */
1040                 }
1041 #else
1042                 ae->Halted(""); /* EMIT SIGNAL */
1043 #endif
1044         }
1045 }
1046
1047 void
1048 AudioEngine::halted (void *arg)
1049 {
1050         cerr << "HALTED by JACK\n";
1051
1052         /* called from jack shutdown handler  */
1053
1054         AudioEngine* ae = static_cast<AudioEngine *> (arg);
1055         bool was_running = ae->_running;
1056
1057         ae->stop_metering_thread ();
1058
1059         ae->_running = false;
1060         ae->_buffer_size = 0;
1061         ae->_frame_rate = 0;
1062         ae->_jack = 0;
1063
1064         if (was_running) {
1065                 ae->Halted(""); /* EMIT SIGNAL */
1066                 MIDI::Port::JackHalted (); /* EMIT SIGNAL */
1067         }
1068 }
1069
1070 void
1071 AudioEngine::died ()
1072 {
1073         /* called from a signal handler for SIGPIPE */
1074
1075         stop_metering_thread ();
1076
1077         _running = false;
1078         _buffer_size = 0;
1079         _frame_rate = 0;
1080         _jack = 0;
1081 }
1082
1083 bool
1084 AudioEngine::can_request_hardware_monitoring ()
1085 {
1086         GET_PRIVATE_JACK_POINTER_RET (_jack,false);
1087         const char ** ports;
1088
1089         if ((ports = jack_get_ports (_priv_jack, NULL, JACK_DEFAULT_AUDIO_TYPE, JackPortCanMonitor)) == 0) {
1090                 return false;
1091         }
1092
1093         free (ports);
1094
1095         return true;
1096 }
1097
1098 ChanCount
1099 AudioEngine::n_physical (unsigned long flags) const
1100 {
1101         ChanCount c;
1102
1103         GET_PRIVATE_JACK_POINTER_RET (_jack, c);
1104
1105         const char ** ports = jack_get_ports (_priv_jack, NULL, NULL, JackPortIsPhysical | flags);
1106         if (ports == 0) {
1107                 return c;
1108         }
1109
1110         for (uint32_t i = 0; ports[i]; ++i) {
1111                 if (!strstr (ports[i], "Midi-Through")) {
1112                         DataType t (jack_port_type (jack_port_by_name (_jack, ports[i])));
1113                         c.set (t, c.get (t) + 1);
1114                 }
1115         }
1116
1117         free (ports);
1118
1119         return c;
1120 }
1121
1122 ChanCount
1123 AudioEngine::n_physical_inputs () const
1124 {
1125         return n_physical (JackPortIsInput);
1126 }
1127
1128 ChanCount
1129 AudioEngine::n_physical_outputs () const
1130 {
1131         return n_physical (JackPortIsOutput);
1132 }
1133
1134 void
1135 AudioEngine::get_physical (DataType type, unsigned long flags, vector<string>& phy)
1136 {
1137         GET_PRIVATE_JACK_POINTER (_jack);
1138         const char ** ports;
1139
1140         if ((ports = jack_get_ports (_priv_jack, NULL, type.to_jack_type(), JackPortIsPhysical | flags)) == 0) {
1141                 return;
1142         }
1143
1144         if (ports) {
1145                 for (uint32_t i = 0; ports[i]; ++i) {
1146                         if (strstr (ports[i], "Midi-Through")) {
1147                                 continue;
1148                         }
1149                         phy.push_back (ports[i]);
1150                 }
1151                 free (ports);
1152         }
1153 }
1154
1155 /** Get physical ports for which JackPortIsOutput is set; ie those that correspond to
1156  *  a physical input connector.
1157  */
1158 void
1159 AudioEngine::get_physical_inputs (DataType type, vector<string>& ins)
1160 {
1161         get_physical (type, JackPortIsOutput, ins);
1162 }
1163
1164 /** Get physical ports for which JackPortIsInput is set; ie those that correspond to
1165  *  a physical output connector.
1166  */
1167 void
1168 AudioEngine::get_physical_outputs (DataType type, vector<string>& outs)
1169 {
1170         get_physical (type, JackPortIsInput, outs);
1171 }
1172
1173 void
1174 AudioEngine::transport_stop ()
1175 {
1176         GET_PRIVATE_JACK_POINTER (_jack);
1177         jack_transport_stop (_priv_jack);
1178 }
1179
1180 void
1181 AudioEngine::transport_start ()
1182 {
1183         GET_PRIVATE_JACK_POINTER (_jack);
1184         jack_transport_start (_priv_jack);
1185 }
1186
1187 void
1188 AudioEngine::transport_locate (framepos_t where)
1189 {
1190         GET_PRIVATE_JACK_POINTER (_jack);
1191         jack_transport_locate (_priv_jack, where);
1192 }
1193
1194 AudioEngine::TransportState
1195 AudioEngine::transport_state ()
1196 {
1197         GET_PRIVATE_JACK_POINTER_RET (_jack, ((TransportState) JackTransportStopped));
1198         jack_position_t pos;
1199         return (TransportState) jack_transport_query (_priv_jack, &pos);
1200 }
1201
1202 int
1203 AudioEngine::reset_timebase ()
1204 {
1205         GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
1206         if (_session) {
1207                 if (_session->config.get_jack_time_master()) {
1208                         return jack_set_timebase_callback (_priv_jack, 0, _jack_timebase_callback, this);
1209                 } else {
1210                         return jack_release_timebase (_jack);
1211                 }
1212         }
1213         return 0;
1214 }
1215
1216 int
1217 AudioEngine::freewheel (bool onoff)
1218 {
1219         GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
1220
1221         if (onoff != _freewheeling) {
1222                 return jack_set_freewheel (_priv_jack, onoff);
1223
1224         } else {
1225                 /* already doing what has been asked for */
1226                 return 0;
1227         }
1228 }
1229
1230 void
1231 AudioEngine::remove_all_ports ()
1232 {
1233         /* make sure that JACK callbacks that will be invoked as we cleanup
1234          * ports know that they have nothing to do.
1235          */
1236
1237         port_remove_in_progress = true;
1238
1239         /* process lock MUST be held by caller
1240         */
1241
1242         {
1243                 RCUWriter<Ports> writer (ports);
1244                 boost::shared_ptr<Ports> ps = writer.get_copy ();
1245                 ps->clear ();
1246         }
1247
1248         /* clear dead wood list in RCU */
1249
1250         ports.flush ();
1251
1252         port_remove_in_progress = false;
1253 }
1254
1255 int
1256 AudioEngine::connect_to_jack (string client_name, string session_uuid)
1257 {
1258         EnvironmentalProtectionAgency* global_epa = EnvironmentalProtectionAgency::get_global_epa ();
1259         boost::scoped_ptr<EnvironmentalProtectionAgency> current_epa;
1260         jack_options_t options = JackNullOption;
1261         jack_status_t status;
1262         const char *server_name = NULL;
1263
1264         /* revert all environment settings back to whatever they were when ardour started
1265          */
1266
1267         if (global_epa) {
1268                 current_epa.reset (new EnvironmentalProtectionAgency(true)); /* will restore settings when we leave scope */
1269                 global_epa->restore ();
1270         }
1271
1272         jack_client_name = client_name; /* might be reset below */
1273 #ifdef HAVE_JACK_SESSION
1274         if (! session_uuid.empty())
1275             _jack = jack_client_open (jack_client_name.c_str(), JackSessionID, &status, session_uuid.c_str());
1276         else
1277 #endif
1278             _jack = jack_client_open (jack_client_name.c_str(), options, &status, server_name);
1279
1280         if (_jack == NULL) {
1281                 // error message is not useful here
1282                 return -1;
1283         }
1284
1285         GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
1286
1287         if (status & JackNameNotUnique) {
1288                 jack_client_name = jack_get_client_name (_priv_jack);
1289         }
1290
1291         return 0;
1292 }
1293
1294 int
1295 AudioEngine::disconnect_from_jack ()
1296 {
1297         GET_PRIVATE_JACK_POINTER_RET (_jack, 0);
1298
1299         if (_running) {
1300                 stop_metering_thread ();
1301         }
1302
1303         {
1304                 Glib::Mutex::Lock lm (_process_lock);
1305                 jack_client_close (_priv_jack);
1306                 _jack = 0;
1307         }
1308
1309         _buffer_size = 0;
1310         _frame_rate = 0;
1311         _raw_buffer_sizes.clear();
1312
1313         if (_running) {
1314                 _running = false;
1315                 Stopped(); /* EMIT SIGNAL */
1316                 MIDI::Port::JackHalted (); /* EMIT SIGNAL */
1317         }
1318
1319         return 0;
1320 }
1321
1322 int
1323 AudioEngine::reconnect_to_jack ()
1324 {
1325         if (_running) {
1326                 disconnect_from_jack ();
1327                 /* XXX give jackd a chance */
1328                 Glib::usleep (250000);
1329         }
1330
1331         if (connect_to_jack (jack_client_name, "")) {
1332                 error << _("failed to connect to JACK") << endmsg;
1333                 return -1;
1334         }
1335
1336         Ports::iterator i;
1337
1338         boost::shared_ptr<Ports> p = ports.reader ();
1339
1340         for (i = p->begin(); i != p->end(); ++i) {
1341                 if ((*i)->reestablish ()) {
1342                         break;
1343                 }
1344         }
1345
1346         if (i != p->end()) {
1347                 /* failed */
1348                 remove_all_ports ();
1349                 return -1;
1350         }
1351
1352         GET_PRIVATE_JACK_POINTER_RET (_jack,-1);
1353
1354         MIDI::Manager::instance()->reestablish (_priv_jack);
1355
1356         if (_session) {
1357                 _session->reset_jack_connection (_priv_jack);
1358                 jack_bufsize_callback (jack_get_buffer_size (_priv_jack));
1359                 _session->set_frame_rate (jack_get_sample_rate (_priv_jack));
1360         }
1361
1362         last_monitor_check = 0;
1363
1364         set_jack_callbacks ();
1365
1366         if (jack_activate (_priv_jack) == 0) {
1367                 _running = true;
1368                 _has_run = true;
1369         } else {
1370                 return -1;
1371         }
1372
1373         /* re-establish connections */
1374
1375         for (i = p->begin(); i != p->end(); ++i) {
1376                 (*i)->reconnect ();
1377         }
1378
1379         MIDI::Manager::instance()->reconnect ();
1380
1381         Running (); /* EMIT SIGNAL*/
1382
1383         start_metering_thread ();
1384
1385         return 0;
1386 }
1387
1388 int
1389 AudioEngine::request_buffer_size (pframes_t nframes)
1390 {
1391         GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
1392
1393         if (nframes == jack_get_buffer_size (_priv_jack)) {
1394                 return 0;
1395         }
1396
1397         return jack_set_buffer_size (_priv_jack, nframes);
1398 }
1399
1400 string
1401 AudioEngine::make_port_name_relative (string portname) const
1402 {
1403         string::size_type len;
1404         string::size_type n;
1405
1406         len = portname.length();
1407
1408         for (n = 0; n < len; ++n) {
1409                 if (portname[n] == ':') {
1410                         break;
1411                 }
1412         }
1413
1414         if ((n != len) && (portname.substr (0, n) == jack_client_name)) {
1415                 return portname.substr (n+1);
1416         }
1417
1418         return portname;
1419 }
1420
1421 string
1422 AudioEngine::make_port_name_non_relative (string portname) const
1423 {
1424         string str;
1425
1426         if (portname.find_first_of (':') != string::npos) {
1427                 return portname;
1428         }
1429
1430         str  = jack_client_name;
1431         str += ':';
1432         str += portname;
1433
1434         return str;
1435 }
1436
1437 bool
1438 AudioEngine::port_is_mine (const string& portname) const
1439 {
1440         if (portname.find_first_of (':') != string::npos) {
1441                 if (portname.substr (0, jack_client_name.length ()) != jack_client_name) {
1442                         return false;
1443                 }
1444         }
1445         return true;
1446 }
1447
1448 bool
1449 AudioEngine::is_realtime () const
1450 {
1451         GET_PRIVATE_JACK_POINTER_RET (_jack,false);
1452         return jack_is_realtime (_priv_jack);
1453 }
1454
1455 int
1456 AudioEngine::create_process_thread (boost::function<void()> f, pthread_t* thread, size_t stacksize)
1457 {
1458         GET_PRIVATE_JACK_POINTER_RET (_jack, 0);
1459         ThreadData* td = new ThreadData (this, f, stacksize);
1460
1461         if (jack_client_create_thread (_priv_jack, thread, jack_client_real_time_priority (_priv_jack),
1462                                        jack_is_realtime (_priv_jack), _start_process_thread, td)) {
1463                 return -1;
1464         }
1465
1466         return 0;
1467 }
1468
1469 void*
1470 AudioEngine::_start_process_thread (void* arg)
1471 {
1472         ThreadData* td = reinterpret_cast<ThreadData*> (arg);
1473         boost::function<void()> f = td->f;
1474         delete td;
1475
1476         f ();
1477
1478         return 0;
1479 }
1480
1481 bool
1482 AudioEngine::port_is_physical (const std::string& portname) const
1483 {
1484         GET_PRIVATE_JACK_POINTER_RET(_jack, false);
1485
1486         jack_port_t *port = jack_port_by_name (_priv_jack, portname.c_str());
1487
1488         if (!port) {
1489                 return false;
1490         }
1491
1492         return jack_port_flags (port) & JackPortIsPhysical;
1493 }
1494
1495 void
1496 AudioEngine::ensure_monitor_input (const std::string& portname, bool yn) const
1497 {
1498         GET_PRIVATE_JACK_POINTER(_jack);
1499
1500         jack_port_t *port = jack_port_by_name (_priv_jack, portname.c_str());
1501
1502         if (!port) {
1503                 return;
1504         }
1505
1506         jack_port_request_monitor (port, yn);
1507 }
1508
1509 void
1510 AudioEngine::update_latencies ()
1511 {
1512         if (jack_recompute_total_latencies) {
1513                 GET_PRIVATE_JACK_POINTER (_jack);
1514                 jack_recompute_total_latencies (_priv_jack);
1515         }
1516 }