Various work on bundles. We now have a Bundle Manager dialogue, and hopefully things...
[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
26 #include <glibmm/timer.h>
27 #include <pbd/pthread_utils.h>
28 #include <pbd/stacktrace.h>
29 #include <pbd/unknown_type.h>
30
31 #include <ardour/audioengine.h>
32 #include <ardour/buffer.h>
33 #include <ardour/port.h>
34 #include <ardour/jack_audio_port.h>
35 #include <ardour/internal_audio_port.h>
36 #include <ardour/jack_midi_port.h>
37 #include <ardour/session.h>
38 #include <ardour/cycle_timer.h>
39 #include <ardour/utils.h>
40 #ifdef VST_SUPPORT
41 #include <fst.h>
42 #endif
43
44 #include <ardour/timestamps.h>
45
46 #include "i18n.h"
47
48 using namespace std;
49 using namespace ARDOUR;
50 using namespace PBD;
51
52 gint AudioEngine::m_meter_exit;
53
54 static void 
55 ardour_jack_error (const char* msg) 
56 {
57         error << "JACK: " << msg << endmsg;
58 }
59
60 AudioEngine::AudioEngine (string client_name) 
61         : ports (new Ports)
62 {
63         session = 0;
64         session_remove_pending = false;
65         _running = false;
66         _has_run = false;
67         last_monitor_check = 0;
68         monitor_check_interval = max_frames;
69         _processed_frames = 0;
70         _freewheeling = false;
71         _usecs_per_cycle = 0;
72         _jack = 0;
73         _frame_rate = 0;
74         _buffer_size = 0;
75         _freewheeling = false;
76         _freewheel_thread_registered = false;
77
78         m_meter_thread = 0;
79         g_atomic_int_set (&m_meter_exit, 0);
80
81         if (connect_to_jack (client_name)) {
82                 throw NoBackendAvailable ();
83         }
84
85         start_metering_thread();
86
87         JackPort::set_engine (this);
88 }
89
90 AudioEngine::~AudioEngine ()
91 {
92         {
93                 Glib::Mutex::Lock tm (_process_lock);
94                 session_removed.signal ();
95                 
96                 if (_running) {
97                         jack_client_close (_jack);
98                 }
99                 
100                 stop_metering_thread ();
101         }
102 }
103
104 jack_client_t*
105 AudioEngine::jack() const
106 {
107         return _jack;
108 }
109
110 void
111 _thread_init_callback (void *arg)
112 {
113         /* make sure that anybody who needs to know about this thread
114            knows about it.
115         */
116
117         PBD::ThreadCreatedWithRequestSize (pthread_self(), X_("Audioengine"), 4096);
118 }
119
120 int
121 AudioEngine::start ()
122 {
123         if (!_running) {
124
125                 if (session) {
126                         nframes_t blocksize = jack_get_buffer_size (_jack);
127
128                         session->set_block_size (blocksize);
129                         session->set_frame_rate (jack_get_sample_rate (_jack));
130
131                         /* page in as much of the session process code as we
132                            can before we really start running.
133                         */
134
135                         session->process (blocksize);
136                         session->process (blocksize);
137                         session->process (blocksize);
138                         session->process (blocksize);
139                         session->process (blocksize);
140                         session->process (blocksize);
141                         session->process (blocksize);
142                         session->process (blocksize);
143                 }
144
145                 _processed_frames = 0;
146                 last_monitor_check = 0;
147
148                 jack_on_shutdown (_jack, halted, this);
149                 jack_set_graph_order_callback (_jack, _graph_order_callback, this);
150                 jack_set_thread_init_callback (_jack, _thread_init_callback, this);
151                 jack_set_process_callback (_jack, _process_callback, this);
152                 jack_set_sample_rate_callback (_jack, _sample_rate_callback, this);
153                 jack_set_buffer_size_callback (_jack, _bufsize_callback, this);
154                 jack_set_xrun_callback (_jack, _xrun_callback, this);
155                 jack_set_sync_callback (_jack, _jack_sync_callback, this);
156                 jack_set_freewheel_callback (_jack, _freewheel_callback, this);
157
158                 if (Config->get_jack_time_master()) {
159                         jack_set_timebase_callback (_jack, 0, _jack_timebase_callback, this);
160                 }
161
162                 if (jack_activate (_jack) == 0) {
163                         _running = true;
164                         _has_run = true;
165                         Running(); /* EMIT SIGNAL */
166                 } else {
167                         // error << _("cannot activate JACK client") << endmsg;
168                 }
169         }
170
171         return _running ? 0 : -1;
172 }
173
174 int
175 AudioEngine::stop (bool forever)
176 {
177         if (_running) {
178                 _running = false;
179                 if (forever) {
180                         jack_client_t* foo = _jack;
181                         _jack = 0;
182                         jack_client_close (foo);
183                         stop_metering_thread ();
184                 } else {
185                         jack_deactivate (_jack);
186                 }
187                 Stopped(); /* EMIT SIGNAL */
188         }
189
190         return _running ? -1 : 0;
191 }
192
193
194 bool
195 AudioEngine::get_sync_offset (nframes_t& offset) const
196 {
197
198 #ifdef HAVE_JACK_VIDEO_SUPPORT
199
200         jack_position_t pos;
201         
202         (void) jack_transport_query (_jack, &pos);
203
204         if (pos.valid & JackVideoFrameOffset) {
205                 offset = pos.video_offset;
206                 return true;
207         }
208
209 #endif
210
211         return false;
212 }
213
214 void
215 AudioEngine::_jack_timebase_callback (jack_transport_state_t state, nframes_t nframes,
216                                       jack_position_t* pos, int new_position, void *arg)
217 {
218         static_cast<AudioEngine*> (arg)->jack_timebase_callback (state, nframes, pos, new_position);
219 }
220
221 void
222 AudioEngine::jack_timebase_callback (jack_transport_state_t state, nframes_t nframes,
223                                      jack_position_t* pos, int new_position)
224 {
225         if (_jack && session && session->synced_to_jack()) {
226                 session->jack_timebase_callback (state, nframes, pos, new_position);
227         }
228 }
229
230 int
231 AudioEngine::_jack_sync_callback (jack_transport_state_t state, jack_position_t* pos, void* arg)
232 {
233         return static_cast<AudioEngine*> (arg)->jack_sync_callback (state, pos);
234 }
235
236 int
237 AudioEngine::jack_sync_callback (jack_transport_state_t state, jack_position_t* pos)
238 {
239         if (_jack && session) {
240                 return session->jack_sync_callback (state, pos);
241         }
242
243         return true;
244 }
245
246 int
247 AudioEngine::_xrun_callback (void *arg)
248 {
249         AudioEngine* ae = static_cast<AudioEngine*> (arg);
250         if (ae->jack()) {
251                 ae->Xrun (); /* EMIT SIGNAL */
252         }
253         return 0;
254 }
255
256 int
257 AudioEngine::_graph_order_callback (void *arg)
258 {
259         AudioEngine* ae = static_cast<AudioEngine*> (arg);
260         if (ae->jack()) {
261                 ae->GraphReordered (); /* EMIT SIGNAL */
262         }
263         return 0;
264 }
265
266 /** Wrapped which is called by JACK as its process callback.  It is just
267  * here to get us back into C++ land by calling AudioEngine::process_callback()
268  * @param nframes Number of frames passed by JACK.
269  * @param arg User argument passed by JACK, which will be the AudioEngine*.
270  */
271 int
272 AudioEngine::_process_callback (nframes_t nframes, void *arg)
273 {
274         return static_cast<AudioEngine *> (arg)->process_callback (nframes);
275 }
276
277 void
278 AudioEngine::_freewheel_callback (int onoff, void *arg)
279 {
280         static_cast<AudioEngine*>(arg)->_freewheeling = onoff;
281 }
282
283 /** Method called by JACK (via _process_callback) which says that there
284  * is work to be done.
285  * @param nframes Number of frames to process.
286  */
287 int
288 AudioEngine::process_callback (nframes_t nframes)
289 {
290         // CycleTimer ct ("AudioEngine::process");
291         Glib::Mutex::Lock tm (_process_lock, Glib::TRY_LOCK);
292
293         /// The number of frames that will have been processed when we've finished
294         nframes_t next_processed_frames;
295         
296         /* handle wrap around of total frames counter */
297
298         if (max_frames - _processed_frames < nframes) {
299                 next_processed_frames = nframes - (max_frames - _processed_frames);
300         } else {
301                 next_processed_frames = _processed_frames + nframes;
302         }
303
304         if (!tm.locked() || session == 0) {
305                 /* return having done nothing */
306                 _processed_frames = next_processed_frames;
307                 return 0;
308         }
309
310         if (session_remove_pending) {
311                 /* perform the actual session removal */
312                 session = 0;
313                 session_remove_pending = false;
314                 session_removed.signal();
315                 _processed_frames = next_processed_frames;
316                 return 0;
317         }
318
319         if (_freewheeling) {
320                 /* emit the Freewheel signal and stop freewheeling in the event of trouble */
321                 if (Freewheel (nframes)) {
322                         cerr << "Freewheeling returned non-zero!\n";
323                         _freewheeling = false;
324                         jack_set_freewheel (_jack, false);
325                 }
326                 return 0;
327         }
328
329         boost::shared_ptr<Ports> p = ports.reader();
330
331         // Prepare ports (ie read data if necessary)
332         for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
333                 (*i)->cycle_start (nframes);
334         }
335         
336         if (session) {
337                 session->process (nframes);
338         }
339
340         if (!_running) {
341                 _processed_frames = next_processed_frames;
342                 return 0;
343         }
344         
345         // Finalize ports (ie write data if necessary)
346         for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
347                 (*i)->cycle_end ();
348         }
349
350         if (last_monitor_check + monitor_check_interval < next_processed_frames) {
351
352                 boost::shared_ptr<Ports> p = ports.reader();
353
354                 for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
355                         
356                         Port *port = (*i);
357                         bool x;
358                         
359                         if (port->_last_monitor != (x = port->monitoring_input ())) {
360                                 port->_last_monitor = x;
361                                 /* XXX I think this is dangerous, due to 
362                                    a likely mutex in the signal handlers ...
363                                 */
364                                  port->MonitorInputChanged (x); /* EMIT SIGNAL */
365                         }
366                 }
367                 last_monitor_check = next_processed_frames;
368         }
369
370         _processed_frames = next_processed_frames;
371         return 0;
372 }
373
374 int
375 AudioEngine::_sample_rate_callback (nframes_t nframes, void *arg)
376 {
377         return static_cast<AudioEngine *> (arg)->jack_sample_rate_callback (nframes);
378 }
379
380 int
381 AudioEngine::jack_sample_rate_callback (nframes_t nframes)
382 {
383         _frame_rate = nframes;
384         _usecs_per_cycle = (int) floor ((((double) frames_per_cycle() / nframes)) * 1000000.0);
385         
386         /* check for monitor input change every 1/10th of second */
387
388         monitor_check_interval = nframes / 10;
389         last_monitor_check = 0;
390         
391         if (session) {
392                 session->set_frame_rate (nframes);
393         }
394
395         SampleRateChanged (nframes); /* EMIT SIGNAL */
396
397         return 0;
398 }
399
400 int
401 AudioEngine::_bufsize_callback (nframes_t nframes, void *arg)
402 {
403         return static_cast<AudioEngine *> (arg)->jack_bufsize_callback (nframes);
404 }
405
406 int
407 AudioEngine::jack_bufsize_callback (nframes_t nframes)
408 {
409         _buffer_size = nframes;
410         _usecs_per_cycle = (int) floor ((((double) nframes / frame_rate())) * 1000000.0);
411         last_monitor_check = 0;
412
413         boost::shared_ptr<Ports> p = ports.reader();
414
415         for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
416                 (*i)->reset();
417         }
418
419         if (session) {
420                 session->set_block_size (_buffer_size);
421         }
422
423         return 0;
424 }
425
426 void
427 AudioEngine::stop_metering_thread ()
428 {
429         if (m_meter_thread) {
430                 g_atomic_int_set (&m_meter_exit, 1);
431                 m_meter_thread->join ();
432                 m_meter_thread = 0;
433         }
434 }
435
436 void
437 AudioEngine::start_metering_thread ()
438 {
439         if (m_meter_thread == 0) {
440                 m_meter_thread = Glib::Thread::create (sigc::mem_fun(this, &AudioEngine::meter_thread),
441                                 500000, true, true, Glib::THREAD_PRIORITY_NORMAL);
442         }
443 }
444
445 void
446 AudioEngine::meter_thread ()
447 {
448         while (true) {
449                 Glib::usleep (10000); /* 1/100th sec interval */
450                 if (g_atomic_int_get(&m_meter_exit)) {
451                         break;
452                 }
453                 IO::update_meters ();
454         }
455 }
456
457 void 
458 AudioEngine::set_session (Session *s)
459 {
460         Glib::Mutex::Lock pl (_process_lock);
461
462         if (!session) {
463
464                 session = s;
465
466                 nframes_t blocksize = jack_get_buffer_size (_jack);
467                 
468                 /* page in as much of the session process code as we
469                    can before we really start running.
470                 */
471                 
472                 boost::shared_ptr<Ports> p = ports.reader();
473
474                 for (Ports::iterator i = p->begin(); i != p->end(); ++i)
475                         (*i)->cycle_start (blocksize);
476
477                 s->process (blocksize);
478                 s->process (blocksize);
479                 s->process (blocksize);
480                 s->process (blocksize);
481                 s->process (blocksize);
482                 s->process (blocksize);
483                 s->process (blocksize);
484                 s->process (blocksize);
485
486                 for (Ports::iterator i = p->begin(); i != p->end(); ++i)
487                         (*i)->cycle_end ();
488
489         }
490 }
491
492 void 
493 AudioEngine::remove_session ()
494 {
495         Glib::Mutex::Lock lm (_process_lock);
496
497         if (_running) {
498
499                 if (session) {
500                         session_remove_pending = true;
501                         session_removed.wait(_process_lock);
502                 }
503
504         } else {
505                 session = 0;
506         }
507         
508         remove_all_ports ();
509 }
510
511 Port *
512 AudioEngine::register_port (PortType ptype, DataType dtype, const string& portname, bool input)
513 {
514         Port* newport = 0;
515
516         try {
517                 switch (ptype) {
518                 case Jack:
519                         if (dtype == DataType::AUDIO) {
520                                 newport = new JackAudioPort (portname, (input ? Port::IsInput : Port::IsOutput));
521                         } else if (dtype == DataType::MIDI) {
522                                 newport = new JackMidiPort (portname, (input ? Port::IsInput : Port::IsOutput));
523                         } else {
524                                 throw unknown_type();
525                         }
526                         break;
527
528                 case Internal:
529                         if (dtype == DataType::AUDIO) {
530                                 newport = new InternalAudioPort (portname, (input ? Port::IsInput : Port::IsOutput));
531                         } else if (dtype == DataType::MIDI) {
532                                 error << _("Internal MIDI ports are not implemented yet!") << endmsg;
533                                 throw unknown_type();
534                         } else {
535                                 throw unknown_type();
536                         }
537                         break;
538                 }
539         
540                 if (newport != 0) {
541                         RCUWriter<Ports> writer (ports);
542                         boost::shared_ptr<Ports> ps = writer.get_copy ();
543                         ps->insert (ps->begin(), newport);
544                         /* writer goes out of scope, forces update */
545                 }
546         
547                 return newport;
548         }
549
550         catch (...) {
551                 throw PortRegistrationFailure();
552         }
553 }
554
555 InternalPort*
556 AudioEngine::get_internal_port (const std::string& short_name)
557 {
558         boost::shared_ptr<Ports> p = ports.reader();
559         
560         for (Ports::iterator i = p->begin(); i != p->end(); ++i) {
561                 if ((*i)->short_name() == short_name) {
562                         return dynamic_cast<InternalPort*> (*i);
563                 }
564         }
565         return 0;
566 }
567
568
569 Port *
570 AudioEngine::register_input_port (PortType ptype, DataType type, const string& portname)
571 {
572         return register_port (ptype, type, portname, true);
573 }
574
575 Port *
576 AudioEngine::register_output_port (PortType ptype, DataType type, const string& portname)
577 {
578         return register_port (ptype, type, portname, false);
579 }
580
581 int          
582 AudioEngine::unregister_port (Port& port)
583 {
584         if (!_running) { 
585                 /* probably happening when the engine has been halted by JACK,
586                    in which case, there is nothing we can do here.
587                    */
588                 return 0;
589         }
590
591         {
592                 
593                 RCUWriter<Ports> writer (ports);
594                 boost::shared_ptr<Ports> ps = writer.get_copy ();
595                 
596                 for (Ports::iterator i = ps->begin(); i != ps->end(); ++i) {
597                         if ((*i) == &port) {
598                                 remove_connections_for (port);
599                                 delete *i;
600                                 ps->erase (i);
601                                 break;
602                         }
603                 }
604                 
605                 /* writer goes out of scope, forces update */
606         }
607
608         return 0;
609 }
610
611 int 
612 AudioEngine::connect (const string& source, const string& destination)
613 {
614         int ret;
615
616         if (!_running) {
617                 if (!_has_run) {
618                         fatal << _("connect called before engine was started") << endmsg;
619                         /*NOTREACHED*/
620                 } else {
621                         return -1;
622                 }
623         }
624
625         string s = make_port_name_non_relative (source);
626         string d = make_port_name_non_relative (destination);
627                 
628         if (source.substr (0, 9) == "internal:") {
629                 if (destination.substr (0, 9) == "internal:") {
630                         InternalPort* src = get_internal_port (source);
631                         InternalPort* dst = get_internal_port (destination);
632
633                         InternalPort::connect (*src, *dst);
634                         ret = 0;
635
636                 } else {
637                         ret = -1;
638                 }
639
640         } else {
641         
642                 ret = jack_connect (_jack, s.c_str(), d.c_str());
643         }
644
645         if (ret == 0) {
646                 pair<string,string> c (s, d);
647                 port_connections.push_back (c);
648         } else if (ret == EEXIST) {
649                 error << string_compose(_("AudioEngine: connection already exists: %1 (%2) to %3 (%4)"), 
650                                  source, s, destination, d) 
651                       << endmsg;
652         } else {
653                 error << string_compose(_("AudioEngine: cannot connect %1 (%2) to %3 (%4)"), 
654                                  source, s, destination, d) 
655                       << endmsg;
656         }
657
658         return ret;
659 }
660
661 int 
662 AudioEngine::disconnect (const string& source, const string& destination)
663 {
664         int ret;
665
666         if (!_running) {
667                 if (!_has_run) {
668                         fatal << _("disconnect called before engine was started") << endmsg;
669                         /*NOTREACHED*/
670                 } else {
671                         return -1;
672                 }
673         }
674         
675         string s = make_port_name_non_relative (source);
676         string d = make_port_name_non_relative (destination);
677
678         if (source.substr (0, 9) == "internal:") {
679                 if (destination.substr (0, 9) == "internal:") {
680                         InternalPort* src = get_internal_port (source);
681                         InternalPort* dst = get_internal_port (destination);
682
683                         InternalPort::disconnect (*src, *dst);
684                         ret = 0;
685                 } else {
686                         ret = -1;
687                 }
688
689         } else {
690         
691                 ret = jack_disconnect (_jack, s.c_str(), d.c_str());
692         }
693
694         if (ret == 0) {
695                 pair<string,string> c (s, d);
696                 PortConnections::iterator i;
697                 
698                 if ((i = find (port_connections.begin(), port_connections.end(), c)) != port_connections.end()) {
699                         port_connections.erase (i);
700                 }
701         }
702          
703         return ret;
704 }
705
706 int
707 AudioEngine::disconnect (Port& port)
708 {
709         if (!_running) {
710                 if (!_has_run) {
711                         fatal << _("disconnect called before engine was started") << endmsg;
712                         /*NOTREACHED*/
713                 } else {
714                         return -1;
715                 }
716         }
717
718         int ret = port.disconnect ();
719
720         if (ret == 0) {
721                 remove_connections_for (port);
722         }
723
724         return ret;
725
726 }
727
728 ARDOUR::nframes_t
729 AudioEngine::frame_rate ()
730 {
731         if (_jack) {
732                 if (_frame_rate == 0) {
733                         return (_frame_rate = jack_get_sample_rate (_jack));
734                 } else {
735                         return _frame_rate;
736                 }
737         } else {
738                 fatal << X_("programming error: AudioEngine::frame_rate() called while disconnected from JACK")
739                       << endmsg;
740                 /*NOTREACHED*/
741                 return 0;
742         }
743 }
744
745 ARDOUR::nframes_t
746 AudioEngine::frames_per_cycle ()
747 {
748         if (_jack) {
749                 if (_buffer_size == 0) {
750                         return (_buffer_size = jack_get_buffer_size (_jack));
751                 } else {
752                         return _buffer_size;
753                 }
754         } else {
755                 fatal << X_("programming error: AudioEngine::frame_rate() called while disconnected from JACK")
756                       << endmsg;
757                 /*NOTREACHED*/
758                 return 0;
759         }
760 }
761
762 /** Get a port by name.
763  * Note this can return NULL, it will NOT create a port if it is not found (any more).
764  */
765 Port *
766 AudioEngine::get_port_by_name (const string& portname, bool keep) const
767 {
768         Glib::Mutex::Lock lm (_process_lock);
769
770         if (!_running) {
771                 if (!_has_run) {
772                         fatal << _("get_port_by_name() called before engine was started") << endmsg;
773                         /*NOTREACHED*/
774                 } else {
775                         return 0;
776                 }
777         }
778         
779         boost::shared_ptr<Ports> pr = ports.reader();
780         
781         for (Ports::iterator i = pr->begin(); i != pr->end(); ++i) {
782                 if (portname == (*i)->name()) {
783                         return (*i);
784                 }
785         }
786
787         return 0;
788 }
789
790 const char **
791 AudioEngine::get_ports (const string& port_name_pattern, const string& type_name_pattern, uint32_t flags)
792 {
793         if (!_running) {
794                 if (!_has_run) {
795                         fatal << _("get_ports called before engine was started") << endmsg;
796                         /*NOTREACHED*/
797                 } else {
798                         return 0;
799                 }
800         }
801         return jack_get_ports (_jack, port_name_pattern.c_str(), type_name_pattern.c_str(), flags);
802 }
803
804 void
805 AudioEngine::halted (void *arg)
806 {
807         AudioEngine* ae = static_cast<AudioEngine *> (arg);
808
809         ae->_running = false;
810         ae->_buffer_size = 0;
811         ae->_frame_rate = 0;
812         ae->_jack = 0;
813
814         ae->Halted(); /* EMIT SIGNAL */
815 }
816
817 uint32_t
818 AudioEngine::n_physical_outputs () const
819 {
820         const char ** ports;
821         uint32_t i = 0;
822
823         if (!_jack) {
824                 return 0;
825         }
826
827         if ((ports = jack_get_ports (_jack, NULL, NULL, JackPortIsPhysical|JackPortIsInput)) == 0) {
828                 return 0;
829         }
830
831         if (ports) {
832                 for (i = 0; ports[i]; ++i);
833                 free (ports);
834         }
835         return i;
836 }
837
838 uint32_t
839 AudioEngine::n_physical_inputs () const
840 {
841         const char ** ports;
842         uint32_t i = 0;
843         
844         if (!_jack) {
845                 return 0;
846         }
847         
848         if ((ports = jack_get_ports (_jack, NULL, NULL, JackPortIsPhysical|JackPortIsOutput)) == 0) {
849                 return 0;
850         }
851
852         if (ports) {
853                 for (i = 0; ports[i]; ++i);
854                 free (ports);
855         }
856         return i;
857 }
858
859 void
860 AudioEngine::get_physical_inputs (vector<string>& ins)
861 {
862         const char ** ports;
863         uint32_t i = 0;
864         
865         if (!_jack) {
866                 return;
867         }
868         
869         if ((ports = jack_get_ports (_jack, NULL, NULL, JackPortIsPhysical|JackPortIsOutput)) == 0) {
870                 return;
871         }
872
873         if (ports) {
874                 for (i = 0; ports[i]; ++i) {
875                         ins.push_back (ports[i]);
876                 }
877                 free (ports);
878         }
879 }
880
881 void
882 AudioEngine::get_physical_outputs (vector<string>& outs)
883 {
884         const char ** ports;
885         uint32_t i = 0;
886         
887         if (!_jack) {
888                 return;
889         }
890         
891         if ((ports = jack_get_ports (_jack, NULL, NULL, JackPortIsPhysical|JackPortIsInput)) == 0) {
892                 return;
893         }
894
895         if (ports) {
896                 for (i = 0; ports[i]; ++i) {
897                         outs.push_back (ports[i]);
898                 }
899                 free (ports);
900         }
901 }
902
903 string
904 AudioEngine::get_nth_physical (DataType type, uint32_t n, int flag)
905 {
906         const char ** ports;
907         uint32_t i;
908         string ret;
909
910         assert(type != DataType::NIL);
911
912         if (!_running || !_jack) {
913                 if (!_has_run) {
914                         fatal << _("get_nth_physical called before engine was started") << endmsg;
915                         /*NOTREACHED*/
916                 } else {
917                         return "";
918                 }
919         }
920
921         ports = jack_get_ports (_jack, NULL, type.to_jack_type(), JackPortIsPhysical|flag);
922         
923         if (ports == 0) {
924                 return "";
925         }
926
927         for (i = 0; i < n && ports[i]; ++i);
928
929         if (ports[i]) {
930                 ret = ports[i];
931         }
932
933         free ((char *) ports);
934
935         return ret;
936 }
937
938 ARDOUR::nframes_t
939 AudioEngine::get_port_total_latency (const Port& port)
940 {
941         return port.total_latency ();
942 }
943
944 void
945 AudioEngine::update_total_latency (const Port& port)
946 {
947         if (!_jack) {
948                 fatal << _("update_total_latency() called with no JACK client connection") << endmsg;
949                 /*NOTREACHED*/
950         }
951
952         if (!_running) {
953                 if (!_has_run) {
954                         fatal << _("update_total_latency() called before engine was started") << endmsg;
955                         /*NOTREACHED*/
956                 } 
957         }
958
959         port.recompute_total_latency ();
960 }
961
962 void
963 AudioEngine::transport_stop ()
964 {
965         // cerr << "tell JACK to stop\n";
966         if (_jack) {
967                 jack_transport_stop (_jack);
968         }
969 }
970
971 void
972 AudioEngine::transport_start ()
973 {
974         // cerr << "tell JACK to start\n";
975         if (_jack) {
976                 jack_transport_start (_jack);
977         }
978 }
979
980 void
981 AudioEngine::transport_locate (nframes_t where)
982 {
983         // cerr << "tell JACK to locate to " << where << endl;
984         if (_jack) {
985                 jack_transport_locate (_jack, where);
986         }
987 }
988
989 AudioEngine::TransportState
990 AudioEngine::transport_state ()
991 {
992         if (_jack) {
993                 jack_position_t pos;
994                 return (TransportState) jack_transport_query (_jack, &pos);
995         } else {
996                 return (TransportState) JackTransportStopped;
997         }
998 }
999
1000 int
1001 AudioEngine::reset_timebase ()
1002 {
1003         if (_jack) {
1004                 if (Config->get_jack_time_master()) {
1005                         return jack_set_timebase_callback (_jack, 0, _jack_timebase_callback, this);
1006                 } else {
1007                         return jack_release_timebase (_jack);
1008                 }
1009         } else {
1010                 return -1;
1011         }
1012 }
1013
1014 int
1015 AudioEngine::freewheel (bool onoff)
1016 {
1017         if (_jack) {
1018
1019                 if (onoff) {
1020                         _freewheel_thread_registered = false;
1021                 }
1022
1023                 return jack_set_freewheel (_jack, onoff);
1024
1025         } else {
1026                 return -1;
1027         }
1028 }
1029
1030 void
1031 AudioEngine::remove_all_ports ()
1032 {
1033         /* process lock MUST be held */
1034
1035         {
1036                 RCUWriter<Ports> writer (ports);
1037                 boost::shared_ptr<Ports> ps = writer.get_copy ();
1038                 ps->clear ();
1039         }
1040
1041         port_connections.clear ();
1042 }
1043
1044 void
1045 AudioEngine::remove_connections_for (Port& port)
1046 {
1047         for (PortConnections::iterator i = port_connections.begin(); i != port_connections.end(); ) {
1048                 PortConnections::iterator tmp;
1049                 
1050                 tmp = i;
1051                 ++tmp;
1052                 
1053                 if ((*i).first == port.name()) {
1054                         port_connections.erase (i);
1055                 }
1056
1057                 i = tmp;
1058         }
1059 }
1060
1061 #ifdef HAVE_JACK_CLIENT_OPEN
1062
1063 int
1064 AudioEngine::connect_to_jack (string client_name)
1065 {
1066         jack_options_t options = JackNullOption;
1067         jack_status_t status;
1068         const char *server_name = NULL;
1069
1070         jack_client_name = client_name; /* might be reset below */
1071
1072         _jack = jack_client_open (jack_client_name.c_str(), options, &status, server_name);
1073         
1074         if (_jack == NULL) {
1075
1076                 if (status & JackServerFailed) {
1077                         error << _("Unable to connect to JACK server") << endmsg;
1078                 }
1079                 
1080                 // error message is not useful here
1081                 return -1;
1082         }
1083
1084         if (status & JackServerStarted) {
1085                 info << _("JACK server started") << endmsg;
1086         }
1087
1088         if (status & JackNameNotUnique) {
1089                 jack_client_name = jack_get_client_name (_jack);
1090         }
1091
1092         jack_set_error_function (ardour_jack_error);
1093         
1094         return 0;
1095 }
1096
1097 #else
1098
1099 int
1100 AudioEngine::connect_to_jack (string client_name)
1101 {
1102         jack_client_name = client_name;
1103
1104         if ((_jack = jack_client_new (client_name.c_str())) == NULL) {
1105                 return -1;
1106         }
1107
1108         return 0;
1109 }
1110
1111 #endif /* HAVE_JACK_CLIENT_OPEN */
1112
1113 int 
1114 AudioEngine::disconnect_from_jack ()
1115 {
1116         if (_jack == 0) {
1117                 return 0;
1118         }
1119
1120         jack_client_close (_jack);
1121
1122         _buffer_size = 0;
1123         _frame_rate = 0;
1124
1125         if (_running) {
1126                 _running = false;
1127                 Stopped(); /* EMIT SIGNAL */
1128         }
1129
1130         _jack = 0;
1131         return 0;
1132 }
1133
1134 int
1135 AudioEngine::reconnect_to_jack ()
1136 {
1137         if (_jack) {
1138                 disconnect_from_jack ();
1139                 /* XXX give jackd a chance */
1140                 Glib::usleep (250000);
1141         }
1142
1143         if (connect_to_jack (jack_client_name)) {
1144                 error << _("failed to connect to JACK") << endmsg;
1145                 return -1;
1146         }
1147
1148         Ports::iterator i;
1149
1150         boost::shared_ptr<Ports> p = ports.reader ();
1151
1152         for (i = p->begin(); i != p->end(); ++i) {
1153
1154                 if ((*i)->reestablish ()) {
1155                         break;
1156                 } 
1157         }
1158
1159         if (i != p->end()) {
1160                 /* failed */
1161                 remove_all_ports ();
1162                 return -1;
1163         } 
1164
1165
1166         if (session) {
1167                 session->reset_jack_connection (_jack);
1168                 nframes_t blocksize = jack_get_buffer_size (_jack);
1169                 session->set_block_size (blocksize);
1170                 session->set_frame_rate (jack_get_sample_rate (_jack));
1171         }
1172
1173         last_monitor_check = 0;
1174         
1175         jack_on_shutdown (_jack, halted, this);
1176         jack_set_graph_order_callback (_jack, _graph_order_callback, this);
1177         jack_set_thread_init_callback (_jack, _thread_init_callback, this);
1178         jack_set_process_callback (_jack, _process_callback, this);
1179         jack_set_sample_rate_callback (_jack, _sample_rate_callback, this);
1180         jack_set_buffer_size_callback (_jack, _bufsize_callback, this);
1181         jack_set_xrun_callback (_jack, _xrun_callback, this);
1182         jack_set_sync_callback (_jack, _jack_sync_callback, this);
1183         jack_set_freewheel_callback (_jack, _freewheel_callback, this);
1184         
1185         if (Config->get_jack_time_master()) {
1186                 jack_set_timebase_callback (_jack, 0, _jack_timebase_callback, this);
1187         }
1188         
1189         if (jack_activate (_jack) == 0) {
1190                 _running = true;
1191                 _has_run = true;
1192         } else {
1193                 return -1;
1194         }
1195
1196         /* re-establish connections */
1197         
1198         for (PortConnections::iterator i = port_connections.begin(); i != port_connections.end(); ++i) {
1199                 
1200                 int err;
1201                 
1202                 if ((err = jack_connect (_jack, (*i).first.c_str(), (*i).second.c_str())) != 0) {
1203                         if (err != EEXIST) {
1204                                 error << string_compose (_("could not reconnect %1 and %2 (err = %3)"),
1205                                                   (*i).first, (*i).second, err)
1206                                       << endmsg;
1207                         }
1208                 }
1209         }
1210
1211         Running (); /* EMIT SIGNAL*/
1212
1213         return 0;
1214 }
1215
1216 int
1217 AudioEngine::request_buffer_size (nframes_t nframes)
1218 {
1219         if (_jack) {
1220
1221                 if (nframes == jack_get_buffer_size (_jack)) {
1222                         return 0;
1223                 }
1224
1225                 return jack_set_buffer_size (_jack, nframes);
1226
1227         } else {
1228                 return -1;
1229         }
1230 }
1231
1232 void
1233 AudioEngine::update_total_latencies ()
1234 {
1235 #ifdef HAVE_JACK_RECOMPUTE_LATENCIES
1236         jack_recompute_total_latencies (_jack);
1237 #endif
1238 }
1239                 
1240 string
1241 AudioEngine::make_port_name_relative (string portname)
1242 {
1243         string::size_type len;
1244         string::size_type n;
1245         
1246         len = portname.length();
1247
1248         for (n = 0; n < len; ++n) {
1249                 if (portname[n] == ':') {
1250                         break;
1251                 }
1252         }
1253         
1254         if ((n != len) && (portname.substr (0, n) == jack_client_name)) {
1255                 return portname.substr (n+1);
1256         }
1257
1258         return portname;
1259 }
1260
1261 string
1262 AudioEngine::make_port_name_non_relative (string portname)
1263 {
1264         string str;
1265
1266         if (portname.find_first_of (':') != string::npos) {
1267                 return portname;
1268         }
1269
1270         str  = jack_client_name;
1271         str += ':';
1272         str += portname;
1273         
1274         return str;
1275 }
1276
1277 bool
1278 AudioEngine::is_realtime () const
1279 {
1280         if (_jack) {
1281                 return jack_is_realtime (_jack);
1282         } else {
1283                 return false;
1284         }
1285 }