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