fixes for latency computation and compilation
[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 int
164 AudioEngine::start ()
165 {
166         GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
167
168         if (!_running) {
169
170                 pframes_t blocksize = jack_get_buffer_size (_priv_jack);
171
172                 if (_session) {
173                         BootMessage (_("Connect session to engine"));
174
175                         _session->set_block_size (blocksize);
176                         _session->set_frame_rate (jack_get_sample_rate (_priv_jack));
177
178                         /* page in as much of the session process code as we
179                            can before we really start running.
180                         */
181
182                         _session->process (blocksize);
183                         _session->process (blocksize);
184                         _session->process (blocksize);
185                         _session->process (blocksize);
186                         _session->process (blocksize);
187                         _session->process (blocksize);
188                         _session->process (blocksize);
189                         _session->process (blocksize);
190                 }
191
192                 _processed_frames = 0;
193                 last_monitor_check = 0;
194
195                 if (jack_on_info_shutdown) {
196                         jack_on_info_shutdown (_priv_jack, halted_info, this);
197                 } else {
198                         jack_on_shutdown (_priv_jack, halted, this);
199                 }
200                 jack_set_graph_order_callback (_priv_jack, _graph_order_callback, this);
201                 jack_set_thread_init_callback (_priv_jack, _thread_init_callback, this);
202                 // jack_set_process_callback (_priv_jack, _process_callback, this);
203                 jack_set_process_thread (_priv_jack, _process_thread, this);
204                 jack_set_sample_rate_callback (_priv_jack, _sample_rate_callback, this);
205                 jack_set_buffer_size_callback (_priv_jack, _bufsize_callback, this);
206                 jack_set_xrun_callback (_priv_jack, _xrun_callback, this);
207 #ifdef HAVE_JACK_SESSION 
208                 if( jack_set_session_callback )
209                     jack_set_session_callback (_priv_jack, _session_callback, this);
210 #endif
211 #if HAVE_JACK_NEW_LATENCY
212                 if (jack_set_latency_callback) {
213                         jack_set_latency_callback (_priv_jack, _latency_callback, this);
214                 }
215 #endif
216                 jack_set_sync_callback (_priv_jack, _jack_sync_callback, this);
217                 jack_set_freewheel_callback (_priv_jack, _freewheel_callback, this);
218                 jack_set_port_registration_callback (_priv_jack, _registration_callback, this);
219                 jack_set_port_connect_callback (_priv_jack, _connect_callback, this);
220
221                 if (_session && _session->config.get_jack_time_master()) {
222                         jack_set_timebase_callback (_priv_jack, 0, _jack_timebase_callback, this);
223                 }
224
225                 jack_set_error_function (ardour_jack_error);
226
227                 if (jack_activate (_priv_jack) == 0) {
228                         _running = true;
229                         _has_run = true;
230                         Running(); /* EMIT SIGNAL */
231                 } else {
232                         // error << _("cannot activate JACK client") << endmsg;
233                 }
234
235                 _raw_buffer_sizes[DataType::AUDIO] = blocksize * sizeof(float);
236
237                 jack_port_t* midi_port = jack_port_register (_priv_jack, "m", JACK_DEFAULT_MIDI_TYPE, JackPortIsOutput, 0);
238                 if (!midi_port) {
239                         error << _("Cannot create temporary MIDI port to determine MIDI buffer size") << endmsg;
240                 } else {
241                         _raw_buffer_sizes[DataType::MIDI] = jack_midi_max_event_size (jack_port_get_buffer(midi_port, blocksize));
242                         jack_port_unregister (_priv_jack, midi_port);
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         AudioPort::increment_port_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         AudioPort::set_port_offset (0);
513         InternalReturn::CycleStart (nframes);
514
515         /* tell all Ports that we're starting a new cycle */
516
517         boost::shared_ptr<Ports> p = ports.reader();
518
519         for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
520                 (*i)->cycle_start (nframes);
521         }
522
523         /* test if we are freewheeling and there are freewheel signals connected.
524            ardour should act normally even when freewheeling unless /it/ is exporting */
525
526
527         if (_freewheeling && !Freewheel.empty()) {
528                 /* emit the Freewheel signal and stop freewheeling in the event of trouble 
529                  */
530                 boost::optional<int> r = Freewheel (nframes);
531                 if (r.get_value_or (0)) {
532                         jack_set_freewheel (_priv_jack, false);
533                 }
534
535         } else {
536                 if (_session) {
537                         _session->process (nframes);
538
539                 }
540         }
541
542         if (_freewheeling) {
543                 return 0;
544         }
545
546         if (!_running) {
547                 _processed_frames = next_processed_frames;
548                 return 0;
549         }
550
551         if (last_monitor_check + monitor_check_interval < next_processed_frames) {
552
553                 boost::shared_ptr<Ports> p = ports.reader();
554
555                 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
556
557                         Port *port = (*i);
558                         bool x;
559
560                         if (port->_last_monitor != (x = port->monitoring_input ())) {
561                                 port->_last_monitor = x;
562                                 /* XXX I think this is dangerous, due to
563                                    a likely mutex in the signal handlers ...
564                                 */
565                                  port->MonitorInputChanged (x); /* EMIT SIGNAL */
566                         }
567                 }
568                 last_monitor_check = next_processed_frames;
569         }
570
571         if (_session->silent()) {
572
573                 boost::shared_ptr<Ports> p = ports.reader();
574
575                 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
576
577                         Port *port = (*i);
578
579                         if (port->sends_output()) {
580                                 port->get_buffer(nframes).silence(nframes);
581                         }
582                 }
583         }
584
585         // Finalize ports
586
587         for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
588                 (*i)->cycle_end (nframes);
589         }
590
591         _processed_frames = next_processed_frames;
592         return 0;
593 }
594
595 int
596 AudioEngine::_sample_rate_callback (pframes_t nframes, void *arg)
597 {
598         return static_cast<AudioEngine *> (arg)->jack_sample_rate_callback (nframes);
599 }
600
601 int
602 AudioEngine::jack_sample_rate_callback (pframes_t nframes)
603 {
604         _frame_rate = nframes;
605         _usecs_per_cycle = (int) floor ((((double) frames_per_cycle() / nframes)) * 1000000.0);
606
607         /* check for monitor input change every 1/10th of second */
608
609         monitor_check_interval = nframes / 10;
610         last_monitor_check = 0;
611
612         if (_session) {
613                 _session->set_frame_rate (nframes);
614         }
615
616         SampleRateChanged (nframes); /* EMIT SIGNAL */
617
618         return 0;
619 }
620
621 void
622 AudioEngine::jack_latency_callback (jack_latency_callback_mode_t mode)
623 {
624         if (_session) {
625                 _session->update_latency (mode == JackPlaybackLatency);
626         }
627 }
628
629 int
630 AudioEngine::_bufsize_callback (pframes_t nframes, void *arg)
631 {
632         return static_cast<AudioEngine *> (arg)->jack_bufsize_callback (nframes);
633 }
634
635 int
636 AudioEngine::jack_bufsize_callback (pframes_t nframes)
637 {
638         bool need_midi_size = true;
639         bool need_audio_size = true;
640
641         _buffer_size = nframes;
642         _usecs_per_cycle = (int) floor ((((double) nframes / frame_rate())) * 1000000.0);
643         last_monitor_check = 0;
644
645         boost::shared_ptr<Ports> p = ports.reader();
646
647         /* crude guesses, see below where we try to get the right answers.
648
649            Note that our guess for MIDI deliberatey tries to overestimate
650            by a little. It would be nicer if we could get the actual
651            size from a port, but we have to use this estimate in the 
652            event that there are no MIDI ports currently. If there are
653            the value will be adjusted below.
654          */
655
656         _raw_buffer_sizes[DataType::AUDIO] = nframes * sizeof (Sample);
657         _raw_buffer_sizes[DataType::MIDI] = nframes * 4 - (nframes/2);
658
659         for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
660
661                 if (need_audio_size && (*i)->type() == DataType::AUDIO) {
662                         _raw_buffer_sizes[DataType::AUDIO] = (*i)->raw_buffer_size (nframes);
663                         need_audio_size = false;
664                 }
665                 
666                         
667                 if (need_midi_size && (*i)->type() == DataType::MIDI) {
668                         _raw_buffer_sizes[DataType::MIDI] = (*i)->raw_buffer_size (nframes);
669                         need_midi_size = false;
670                 }
671                 
672                 (*i)->reset();
673         }
674
675         if (_session) {
676                 _session->set_block_size (_buffer_size);
677         }
678
679         return 0;
680 }
681
682 void
683 AudioEngine::stop_metering_thread ()
684 {
685         if (m_meter_thread) {
686                 g_atomic_int_set (&m_meter_exit, 1);
687                 m_meter_thread->join ();
688                 m_meter_thread = 0;
689         }
690 }
691
692 void
693 AudioEngine::start_metering_thread ()
694 {
695         if (m_meter_thread == 0) {
696                 g_atomic_int_set (&m_meter_exit, 0);
697                 m_meter_thread = Glib::Thread::create (boost::bind (&AudioEngine::meter_thread, this),
698                                                        500000, true, true, Glib::THREAD_PRIORITY_NORMAL);
699         }
700 }
701
702 void
703 AudioEngine::meter_thread ()
704 {
705         pthread_set_name (X_("meter"));
706
707         while (true) {
708                 Glib::usleep (10000); /* 1/100th sec interval */
709                 if (g_atomic_int_get(&m_meter_exit)) {
710                         break;
711                 }
712                 Metering::Meter ();
713         }
714 }
715
716 void
717 AudioEngine::set_session (Session *s)
718 {
719         Glib::Mutex::Lock pl (_process_lock);
720
721         SessionHandlePtr::set_session (s);
722
723         if (_session) {
724
725                 start_metering_thread ();
726                 
727                 pframes_t blocksize = jack_get_buffer_size (_jack);
728                 
729                 /* page in as much of the session process code as we
730                    can before we really start running.
731                 */
732                 
733                 boost::shared_ptr<Ports> p = ports.reader();
734                 
735                 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
736                         (*i)->cycle_start (blocksize);
737                 }
738                 
739                 _session->process (blocksize);
740                 _session->process (blocksize);
741                 _session->process (blocksize);
742                 _session->process (blocksize);
743                 _session->process (blocksize);
744                 _session->process (blocksize);
745                 _session->process (blocksize);
746                 _session->process (blocksize);
747                 
748                 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
749                         (*i)->cycle_end (blocksize);
750                 }
751         }
752 }
753
754 void
755 AudioEngine::remove_session ()
756 {
757         Glib::Mutex::Lock lm (_process_lock);
758
759         if (_running) {
760
761                 stop_metering_thread ();
762
763                 if (_session) {
764                         session_remove_pending = true;
765                         session_removed.wait(_process_lock);
766                 }
767
768         } else {
769                 SessionHandlePtr::set_session (0);
770         }
771
772         remove_all_ports ();
773 }
774
775 void
776 AudioEngine::port_registration_failure (const std::string& portname)
777 {
778         GET_PRIVATE_JACK_POINTER (_jack);
779         string full_portname = jack_client_name;
780         full_portname += ':';
781         full_portname += portname;
782
783
784         jack_port_t* p = jack_port_by_name (_priv_jack, full_portname.c_str());
785         string reason;
786
787         if (p) {
788                 reason = string_compose (_("a port with the name \"%1\" already exists: check for duplicated track/bus names"), portname);
789         } else {
790                 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);
791         }
792
793         throw PortRegistrationFailure (string_compose (_("AudioEngine: cannot register port \"%1\": %2"), portname, reason).c_str());
794 }
795
796 Port *
797 AudioEngine::register_port (DataType dtype, const string& portname, bool input)
798 {
799         Port* newport = 0;
800
801         try {
802                 if (dtype == DataType::AUDIO) {
803                         newport = new AudioPort (portname, (input ? Port::IsInput : Port::IsOutput));
804                 } else if (dtype == DataType::MIDI) {
805                         newport = new MidiPort (portname, (input ? Port::IsInput : Port::IsOutput));
806                 } else {
807                         throw PortRegistrationFailure("unable to create port (unknown type)");
808                 }
809
810                 size_t& old_buffer_size  = _raw_buffer_sizes[newport->type()];
811                 size_t  port_buffer_size = newport->raw_buffer_size(0);
812                 if (port_buffer_size > old_buffer_size) {
813                         old_buffer_size = port_buffer_size;
814                 }
815
816                 RCUWriter<Ports> writer (ports);
817                 boost::shared_ptr<Ports> ps = writer.get_copy ();
818                 ps->insert (ps->begin(), newport);
819
820                 /* writer goes out of scope, forces update */
821
822                 return newport;
823         }
824
825         catch (PortRegistrationFailure& err) {
826                 throw err;
827         } catch (std::exception& e) {
828                 throw PortRegistrationFailure(string_compose(
829                                 _("unable to create port: %1"), e.what()).c_str());
830         } catch (...) {
831                 throw PortRegistrationFailure("unable to create port (unknown error)");
832         }
833 }
834
835 Port *
836 AudioEngine::register_input_port (DataType type, const string& portname)
837 {
838         return register_port (type, portname, true);
839 }
840
841 Port *
842 AudioEngine::register_output_port (DataType type, const string& portname)
843 {
844         return register_port (type, portname, false);
845 }
846
847 int
848 AudioEngine::unregister_port (Port& port)
849 {
850         /* caller must hold process lock */
851
852         if (!_running) {
853                 /* probably happening when the engine has been halted by JACK,
854                    in which case, there is nothing we can do here.
855                    */
856                 return 0;
857         }
858
859         {
860                 RCUWriter<Ports> writer (ports);
861                 boost::shared_ptr<Ports> ps = writer.get_copy ();
862
863                 for (Ports::iterator i = ps->begin(); i != ps->end(); ++i) {
864                         if ((*i) == &port) {
865                                 delete *i;
866                                 ps->erase (i);
867                                 break;
868                         }
869                 }
870
871                 /* writer goes out of scope, forces update */
872         }
873
874         return 0;
875 }
876
877 int
878 AudioEngine::connect (const string& source, const string& destination)
879 {
880         int ret;
881
882         if (!_running) {
883                 if (!_has_run) {
884                         fatal << _("connect called before engine was started") << endmsg;
885                         /*NOTREACHED*/
886                 } else {
887                         return -1;
888                 }
889         }
890
891         string s = make_port_name_non_relative (source);
892         string d = make_port_name_non_relative (destination);
893
894
895         Port* src = get_port_by_name (s);
896         Port* dst = get_port_by_name (d);
897
898         if (src) {
899                 ret = src->connect (d);
900         } else if (dst) {
901                 ret = dst->connect (s);
902         } else {
903                 /* neither port is known to us, and this API isn't intended for use as a general patch bay */
904                 ret = -1;
905         }
906
907         if (ret > 0) {
908                 /* already exists - no error, no warning */
909         } else if (ret < 0) {
910                 error << string_compose(_("AudioEngine: cannot connect %1 (%2) to %3 (%4)"),
911                                         source, s, destination, d)
912                       << endmsg;
913         }
914
915         return ret;
916 }
917
918 int
919 AudioEngine::disconnect (const string& source, const string& destination)
920 {
921         int ret;
922
923         if (!_running) {
924                 if (!_has_run) {
925                         fatal << _("disconnect called before engine was started") << endmsg;
926                         /*NOTREACHED*/
927                 } else {
928                         return -1;
929                 }
930         }
931
932         string s = make_port_name_non_relative (source);
933         string d = make_port_name_non_relative (destination);
934
935         Port* src = get_port_by_name (s);
936         Port* dst = get_port_by_name (d);
937
938         if (src) {
939                         ret = src->disconnect (d);
940         } else if (dst) {
941                         ret = dst->disconnect (s);
942         } else {
943                 /* neither port is known to us, and this API isn't intended for use as a general patch bay */
944                 ret = -1;
945         }
946         return ret;
947 }
948
949 int
950 AudioEngine::disconnect (Port& port)
951 {
952         GET_PRIVATE_JACK_POINTER_RET (_jack,-1);
953
954         if (!_running) {
955                 if (!_has_run) {
956                         fatal << _("disconnect called before engine was started") << endmsg;
957                         /*NOTREACHED*/
958                 } else {
959                         return -1;
960                 }
961         }
962
963         return port.disconnect_all ();
964 }
965
966 ARDOUR::framecnt_t
967 AudioEngine::frame_rate () const
968 {
969         GET_PRIVATE_JACK_POINTER_RET (_jack, 0);
970         if (_frame_rate == 0) {
971                 return (_frame_rate = jack_get_sample_rate (_priv_jack));
972         } else {
973                 return _frame_rate;
974         }
975 }
976
977 size_t
978 AudioEngine::raw_buffer_size (DataType t)
979 {
980         std::map<DataType,size_t>::const_iterator s = _raw_buffer_sizes.find(t);
981         return (s != _raw_buffer_sizes.end()) ? s->second : 0;
982 }
983
984 ARDOUR::pframes_t
985 AudioEngine::frames_per_cycle () const
986 {
987         GET_PRIVATE_JACK_POINTER_RET (_jack,0);
988         if (_buffer_size == 0) {
989                 return (_buffer_size = jack_get_buffer_size (_jack));
990         } else {
991                 return _buffer_size;
992         }
993 }
994
995 /** @param name Full or short name of port
996  *  @return Corresponding Port*, or 0.  This object remains the property of the AudioEngine
997  *  so must not be deleted.
998  */
999 Port *
1000 AudioEngine::get_port_by_name (const string& portname)
1001 {
1002         if (!_running) {
1003                 if (!_has_run) {
1004                         fatal << _("get_port_by_name() called before engine was started") << endmsg;
1005                         /*NOTREACHED*/
1006                 } else {
1007                         return 0;
1008                 }
1009         }
1010
1011         if (portname.find_first_of (':') != string::npos) {
1012                 if (portname.substr (0, jack_client_name.length ()) != jack_client_name) {
1013                         /* not an ardour: port */
1014                         return 0;
1015                 }
1016         }
1017
1018         std::string const rel = make_port_name_relative (portname);
1019
1020         boost::shared_ptr<Ports> pr = ports.reader();
1021
1022         for (Ports::iterator i = pr->begin(); i != pr->end(); ++i) {
1023                 if (rel == (*i)->name()) {
1024                         return *i;
1025                 }
1026         }
1027
1028         return 0;
1029 }
1030
1031 const char **
1032 AudioEngine::get_ports (const string& port_name_pattern, const string& type_name_pattern, uint32_t flags)
1033 {
1034         GET_PRIVATE_JACK_POINTER_RET (_jack,0);
1035         if (!_running) {
1036                 if (!_has_run) {
1037                         fatal << _("get_ports called before engine was started") << endmsg;
1038                         /*NOTREACHED*/
1039                 } else {
1040                         return 0;
1041                 }
1042         }
1043         return jack_get_ports (_priv_jack, port_name_pattern.c_str(), type_name_pattern.c_str(), flags);
1044 }
1045
1046 void
1047 AudioEngine::halted_info (jack_status_t code, const char* reason, void *arg)
1048 {
1049         /* called from jack shutdown handler  */
1050         
1051         AudioEngine* ae = static_cast<AudioEngine *> (arg);
1052         bool was_running = ae->_running;
1053         
1054         ae->stop_metering_thread ();
1055         
1056         ae->_running = false;
1057         ae->_buffer_size = 0;
1058         ae->_frame_rate = 0;
1059         ae->_jack = 0;
1060         
1061         if (was_running) {
1062 #ifdef HAVE_JACK_ON_INFO_SHUTDOWN
1063                 switch (code) {
1064                 case JackBackendError:
1065                         ae->Halted(reason); /* EMIT SIGNAL */
1066                         break;
1067                 default:
1068                         ae->Halted(""); /* EMIT SIGNAL */
1069                 }
1070 #else
1071                 ae->Halted(""); /* EMIT SIGNAL */
1072 #endif
1073         }
1074 }
1075
1076 void
1077 AudioEngine::halted (void *arg)
1078 {
1079         cerr << "HALTED by JACK\n";
1080
1081         /* called from jack shutdown handler  */
1082
1083         AudioEngine* ae = static_cast<AudioEngine *> (arg);
1084         bool was_running = ae->_running;
1085
1086         ae->stop_metering_thread ();
1087
1088         ae->_running = false;
1089         ae->_buffer_size = 0;
1090         ae->_frame_rate = 0;
1091         ae->_jack = 0;
1092
1093         if (was_running) {
1094                 ae->Halted(""); /* EMIT SIGNAL */
1095                 MIDI::Port::JackHalted (); /* EMIT SIGNAL */
1096         }
1097 }
1098
1099 void
1100 AudioEngine::died ()
1101 {
1102         /* called from a signal handler for SIGPIPE */
1103
1104         stop_metering_thread ();
1105
1106         _running = false;
1107         _buffer_size = 0;
1108         _frame_rate = 0;
1109         _jack = 0;
1110 }
1111
1112 bool
1113 AudioEngine::can_request_hardware_monitoring ()
1114 {
1115         GET_PRIVATE_JACK_POINTER_RET (_jack,false);
1116         const char ** ports;
1117
1118         if ((ports = jack_get_ports (_priv_jack, NULL, JACK_DEFAULT_AUDIO_TYPE, JackPortCanMonitor)) == 0) {
1119                 return false;
1120         }
1121
1122         free (ports);
1123
1124         return true;
1125 }
1126
1127 ChanCount
1128 AudioEngine::n_physical (unsigned long flags) const
1129 {
1130         ChanCount c;
1131         
1132         GET_PRIVATE_JACK_POINTER_RET (_jack, c);
1133
1134         const char ** ports = jack_get_ports (_priv_jack, NULL, NULL, JackPortIsPhysical | flags);
1135         if (ports == 0) {
1136                 return c;
1137         }
1138
1139         for (uint32_t i = 0; ports[i]; ++i) {
1140                 if (!strstr (ports[i], "Midi-Through")) {
1141                         DataType t (jack_port_type (jack_port_by_name (_jack, ports[i])));
1142                         c.set (t, c.get (t) + 1);
1143                 }
1144         }
1145
1146         free (ports);
1147
1148         return c;
1149 }
1150
1151 ChanCount
1152 AudioEngine::n_physical_inputs () const
1153 {
1154         return n_physical (JackPortIsInput);
1155 }
1156
1157 ChanCount
1158 AudioEngine::n_physical_outputs () const
1159 {
1160         return n_physical (JackPortIsOutput);
1161 }
1162
1163 void
1164 AudioEngine::get_physical (DataType type, unsigned long flags, vector<string>& phy)
1165 {
1166         GET_PRIVATE_JACK_POINTER (_jack);
1167         const char ** ports;
1168
1169         if ((ports = jack_get_ports (_priv_jack, NULL, type.to_jack_type(), JackPortIsPhysical | flags)) == 0) {
1170                 return;
1171         }
1172
1173         if (ports) {
1174                 for (uint32_t i = 0; ports[i]; ++i) {
1175                         if (strstr (ports[i], "Midi-Through")) {
1176                                 continue;
1177                         }
1178                         phy.push_back (ports[i]);
1179                 }
1180                 free (ports);
1181         }
1182 }
1183
1184 /** Get physical ports for which JackPortIsOutput is set; ie those that correspond to
1185  *  a physical input connector.
1186  */
1187 void
1188 AudioEngine::get_physical_inputs (DataType type, vector<string>& ins)
1189 {
1190         get_physical (type, JackPortIsOutput, ins);
1191 }
1192
1193 /** Get physical ports for which JackPortIsInput is set; ie those that correspond to
1194  *  a physical output connector.
1195  */
1196 void
1197 AudioEngine::get_physical_outputs (DataType type, vector<string>& outs)
1198 {
1199         get_physical (type, JackPortIsInput, outs);
1200 }
1201
1202 void
1203 AudioEngine::update_total_latency (const Port& port)
1204 {
1205         port.recompute_total_latency ();
1206 }
1207
1208 void
1209 AudioEngine::transport_stop ()
1210 {
1211         GET_PRIVATE_JACK_POINTER (_jack);
1212         jack_transport_stop (_priv_jack);
1213 }
1214
1215 void
1216 AudioEngine::transport_start ()
1217 {
1218         GET_PRIVATE_JACK_POINTER (_jack);
1219         jack_transport_start (_priv_jack);
1220 }
1221
1222 void
1223 AudioEngine::transport_locate (framepos_t where)
1224 {
1225         GET_PRIVATE_JACK_POINTER (_jack);
1226         // cerr << "tell JACK to locate to " << where << endl;
1227         jack_transport_locate (_priv_jack, where);
1228 }
1229
1230 AudioEngine::TransportState
1231 AudioEngine::transport_state ()
1232 {
1233         GET_PRIVATE_JACK_POINTER_RET (_jack, ((TransportState) JackTransportStopped));
1234         jack_position_t pos;
1235         return (TransportState) jack_transport_query (_priv_jack, &pos);
1236 }
1237
1238 int
1239 AudioEngine::reset_timebase ()
1240 {
1241         GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
1242         if (_session) {
1243                 if (_session->config.get_jack_time_master()) {
1244                         return jack_set_timebase_callback (_priv_jack, 0, _jack_timebase_callback, this);
1245                 } else {
1246                         return jack_release_timebase (_jack);
1247                 }
1248         }
1249         return 0;
1250 }
1251
1252 int
1253 AudioEngine::freewheel (bool onoff)
1254 {
1255         GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
1256
1257         if (onoff != _freewheeling) {
1258                 return jack_set_freewheel (_priv_jack, onoff);
1259                 
1260         } else {
1261                 /* already doing what has been asked for */
1262                 return 0;
1263         }
1264 }
1265
1266 void
1267 AudioEngine::remove_all_ports ()
1268 {
1269         /* process lock MUST be held */
1270
1271         {
1272                 RCUWriter<Ports> writer (ports);
1273                 boost::shared_ptr<Ports> ps = writer.get_copy ();
1274
1275                 for (Ports::iterator i = ps->begin(); i != ps->end(); ++i) {
1276                         delete *i;
1277                 }
1278
1279                 ps->clear ();
1280         }
1281
1282         /* clear dead wood list too */
1283
1284         ports.flush ();
1285 }
1286
1287 int
1288 AudioEngine::connect_to_jack (string client_name, string session_uuid)
1289 {
1290         EnvironmentalProtectionAgency* global_epa = EnvironmentalProtectionAgency::get_global_epa ();
1291         boost::scoped_ptr<EnvironmentalProtectionAgency> current_epa;
1292         jack_options_t options = JackNullOption;
1293         jack_status_t status;
1294         const char *server_name = NULL;
1295
1296         /* revert all environment settings back to whatever they were when ardour started
1297          */
1298
1299         if (global_epa) {
1300                 current_epa.reset (new EnvironmentalProtectionAgency(true)); /* will restore settings when we leave scope */
1301                 global_epa->restore ();
1302         }
1303
1304         jack_client_name = client_name; /* might be reset below */
1305 #ifdef HAVE_JACK_SESSION
1306         if (! session_uuid.empty())
1307             _jack = jack_client_open (jack_client_name.c_str(), JackSessionID, &status, session_uuid.c_str());
1308         else
1309 #endif
1310             _jack = jack_client_open (jack_client_name.c_str(), options, &status, server_name);
1311
1312         if (_jack == NULL) {
1313                 // error message is not useful here
1314                 return -1;
1315         }
1316
1317         GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
1318
1319         if (status & JackNameNotUnique) {
1320                 jack_client_name = jack_get_client_name (_priv_jack);
1321         }
1322
1323         return 0;
1324 }
1325
1326 int
1327 AudioEngine::disconnect_from_jack ()
1328 {
1329         GET_PRIVATE_JACK_POINTER_RET (_jack, 0);
1330
1331         if (_running) {
1332                 stop_metering_thread ();
1333         }
1334
1335         {
1336                 Glib::Mutex::Lock lm (_process_lock);
1337                 jack_client_close (_priv_jack);
1338                 _jack = 0;
1339         }
1340
1341         _buffer_size = 0;
1342         _frame_rate = 0;
1343         _raw_buffer_sizes.clear();
1344
1345         if (_running) {
1346                 _running = false;
1347                 Stopped(); /* EMIT SIGNAL */
1348                 MIDI::Port::JackHalted (); /* EMIT SIGNAL */
1349         }
1350
1351         return 0;
1352 }
1353
1354 int
1355 AudioEngine::reconnect_to_jack ()
1356 {
1357         if (_running) {
1358                 disconnect_from_jack ();
1359                 /* XXX give jackd a chance */
1360                 Glib::usleep (250000);
1361         }
1362
1363         if (connect_to_jack (jack_client_name, "")) {
1364                 error << _("failed to connect to JACK") << endmsg;
1365                 return -1;
1366         }
1367
1368         Ports::iterator i;
1369
1370         boost::shared_ptr<Ports> p = ports.reader ();
1371
1372         for (i = p->begin(); i != p->end(); ++i) {
1373                 if ((*i)->reestablish ()) {
1374                         break;
1375                 }
1376         }
1377
1378         if (i != p->end()) {
1379                 /* failed */
1380                 remove_all_ports ();
1381                 return -1;
1382         }
1383
1384         GET_PRIVATE_JACK_POINTER_RET (_jack,-1);
1385
1386         MIDI::Manager::instance()->reestablish (_priv_jack);
1387         
1388         if (_session) {
1389                 _session->reset_jack_connection (_priv_jack);
1390                 jack_bufsize_callback (jack_get_buffer_size (_priv_jack));
1391                 _session->set_frame_rate (jack_get_sample_rate (_priv_jack));
1392         }
1393
1394         last_monitor_check = 0;
1395
1396         jack_on_shutdown (_priv_jack, halted, this);
1397         jack_set_graph_order_callback (_priv_jack, _graph_order_callback, this);
1398         jack_set_thread_init_callback (_priv_jack, _thread_init_callback, this);
1399         // jack_set_process_callback (_priv_jack, _process_callback, this);
1400         jack_set_process_thread (_priv_jack, _process_thread, this);
1401         jack_set_sample_rate_callback (_priv_jack, _sample_rate_callback, this);
1402         jack_set_buffer_size_callback (_priv_jack, _bufsize_callback, this);
1403         jack_set_xrun_callback (_priv_jack, _xrun_callback, this);
1404 #ifdef HAVE_JACK_SESSION
1405         if( jack_set_session_callback )
1406             jack_set_session_callback (_priv_jack, _session_callback, this);
1407 #endif
1408         jack_set_sync_callback (_priv_jack, _jack_sync_callback, this);
1409         jack_set_freewheel_callback (_priv_jack, _freewheel_callback, this);
1410
1411         if (_session && _session->config.get_jack_time_master()) {
1412                 jack_set_timebase_callback (_priv_jack, 0, _jack_timebase_callback, this);
1413         }
1414
1415         if (jack_activate (_priv_jack) == 0) {
1416                 _running = true;
1417                 _has_run = true;
1418         } else {
1419                 return -1;
1420         }
1421
1422         /* re-establish connections */
1423
1424         for (i = p->begin(); i != p->end(); ++i) {
1425                 (*i)->reconnect ();
1426         }
1427
1428         MIDI::Manager::instance()->reconnect ();
1429
1430         Running (); /* EMIT SIGNAL*/
1431
1432         start_metering_thread ();
1433
1434         return 0;
1435 }
1436
1437 int
1438 AudioEngine::request_buffer_size (pframes_t nframes)
1439 {
1440         GET_PRIVATE_JACK_POINTER_RET (_jack, -1);
1441
1442         if (nframes == jack_get_buffer_size (_priv_jack)) {
1443           return 0;
1444         }
1445         
1446         return jack_set_buffer_size (_priv_jack, nframes);
1447 }
1448
1449 void
1450 AudioEngine::update_total_latencies ()
1451 {
1452         GET_PRIVATE_JACK_POINTER (_jack);
1453         jack_recompute_total_latencies (_priv_jack);
1454 }
1455
1456 string
1457 AudioEngine::make_port_name_relative (string portname)
1458 {
1459         string::size_type len;
1460         string::size_type n;
1461
1462         len = portname.length();
1463
1464         for (n = 0; n < len; ++n) {
1465                 if (portname[n] == ':') {
1466                         break;
1467                 }
1468         }
1469
1470         if ((n != len) && (portname.substr (0, n) == jack_client_name)) {
1471                 return portname.substr (n+1);
1472         }
1473
1474         return portname;
1475 }
1476
1477 string
1478 AudioEngine::make_port_name_non_relative (string portname)
1479 {
1480         string str;
1481
1482         if (portname.find_first_of (':') != string::npos) {
1483                 return portname;
1484         }
1485
1486         str  = jack_client_name;
1487         str += ':';
1488         str += portname;
1489
1490         return str;
1491 }
1492
1493 bool
1494 AudioEngine::is_realtime () const
1495 {
1496         GET_PRIVATE_JACK_POINTER_RET (_jack,false);
1497         return jack_is_realtime (_priv_jack);
1498 }
1499
1500 int
1501 AudioEngine::create_process_thread (boost::function<void()> f, pthread_t* thread, size_t stacksize)
1502 {
1503         GET_PRIVATE_JACK_POINTER_RET (_jack, 0);
1504         ThreadData* td = new ThreadData (this, f, stacksize);
1505
1506         if (jack_client_create_thread (_priv_jack, thread, jack_client_real_time_priority (_priv_jack), 
1507                                        jack_is_realtime (_priv_jack), _start_process_thread, td)) {
1508                 return -1;
1509         } 
1510
1511         return 0;
1512 }
1513
1514 void*
1515 AudioEngine::_start_process_thread (void* arg)
1516 {
1517         ThreadData* td = reinterpret_cast<ThreadData*> (arg);
1518         boost::function<void()> f = td->f;
1519         delete td;
1520
1521         f ();
1522
1523         return 0;
1524 }