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