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