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