Part 1 of loading 2.X sessions; some things work, some things don't, hacks a-plenty.
[ardour.git] / libs / ardour / io.cc
1 /*
2     Copyright (C) 2000-2006 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 #include <fstream>
20 #include <algorithm>
21 #include <unistd.h>
22 #include <locale.h>
23 #include <errno.h>
24
25 #include <sigc++/bind.h>
26
27 #include <glibmm.h>
28 #include <glibmm/thread.h>
29
30 #include "pbd/xml++.h"
31 #include "pbd/replace_all.h"
32 #include "pbd/unknown_type.h"
33 #include "pbd/enumwriter.h"
34
35 #include "ardour/audioengine.h"
36 #include "ardour/buffer.h"
37 #include "ardour/io.h"
38 #include "ardour/route.h"
39 #include "ardour/port.h"
40 #include "ardour/audio_port.h"
41 #include "ardour/midi_port.h"
42 #include "ardour/session.h"
43 #include "ardour/cycle_timer.h"
44 #include "ardour/panner.h"
45 #include "ardour/buffer_set.h"
46 #include "ardour/meter.h"
47 #include "ardour/amp.h"
48 #include "ardour/user_bundle.h"
49
50 #include "i18n.h"
51
52 #include <cmath>
53
54 /*
55   A bug in OS X's cmath that causes isnan() and isinf() to be
56   "undeclared". the following works around that
57 */
58
59 #if defined(__APPLE__) && defined(__MACH__)
60 extern "C" int isnan (double);
61 extern "C" int isinf (double);
62 #endif
63
64 #define BLOCK_PROCESS_CALLBACK() Glib::Mutex::Lock em (_session.engine().process_lock())
65
66 using namespace std;
67 using namespace ARDOUR;
68 using namespace PBD;
69
70 const string                 IO::state_node_name = "IO";
71 bool                         IO::connecting_legal = false;
72 sigc::signal<int>            IO::ConnectingLegal;
73 sigc::signal<void,ChanCount> IO::PortCountChanged;
74
75 /** @param default_type The type of port that will be created by ensure_io
76  * and friends if no type is explicitly requested (to avoid breakage).
77  */
78 IO::IO (Session& s, const string& name, Direction dir, DataType default_type)
79         : SessionObject (s, name)
80         , _direction (dir)
81         , _default_type (default_type)
82 {
83         _active = true;
84         pending_state_node = 0;
85         setup_bundles ();
86 }
87
88 IO::IO (Session& s, const XMLNode& node, DataType dt)
89         : SessionObject(s, "unnamed io")
90         , _direction (Input)
91         , _default_type (dt)
92 {
93         _active = true;
94         pending_state_node = 0;
95
96         set_state (node);
97         setup_bundles ();
98 }
99
100 IO::~IO ()
101 {
102         Glib::Mutex::Lock lm (io_lock);
103
104         BLOCK_PROCESS_CALLBACK ();
105
106         for (PortSet::iterator i = _ports.begin(); i != _ports.end(); ++i) {
107                 _session.engine().unregister_port (*i);
108         }
109 }
110
111 void
112 IO::silence (nframes_t nframes)
113 {
114         /* io_lock, not taken: function must be called from Session::process() calltree */
115
116         for (PortSet::iterator i = _ports.begin(); i != _ports.end(); ++i) {
117                 i->get_buffer(nframes).silence (nframes);
118         }
119 }
120
121 void
122 IO::check_bundles_connected ()
123 {
124         check_bundles (_bundles_connected, ports());
125 }
126
127 void
128 IO::check_bundles (std::vector<UserBundleInfo>& list, const PortSet& ports)
129 {
130         std::vector<UserBundleInfo> new_list;
131
132         for (std::vector<UserBundleInfo>::iterator i = list.begin(); i != list.end(); ++i) {
133
134                 uint32_t const N = i->bundle->nchannels ();
135
136                 if (_ports.num_ports (default_type()) < N) {
137                         continue;
138                 }
139
140                 bool ok = true;
141
142                 for (uint32_t j = 0; j < N; ++j) {
143                         /* Every port on bundle channel j must be connected to our input j */
144                         Bundle::PortList const pl = i->bundle->channel_ports (j);
145                         for (uint32_t k = 0; k < pl.size(); ++k) {
146                                 if (ports.port(j)->connected_to (pl[k]) == false) {
147                                         ok = false;
148                                         break;
149                                 }
150                         }
151
152                         if (ok == false) {
153                                 break;
154                         }
155                 }
156
157                 if (ok) {
158                         new_list.push_back (*i);
159                 } else {
160                         i->changed.disconnect ();
161                 }
162         }
163
164         list = new_list;
165 }
166
167
168 int
169 IO::disconnect (Port* our_port, string other_port, void* src)
170 {
171         if (other_port.length() == 0 || our_port == 0) {
172                 return 0;
173         }
174
175         {
176                 BLOCK_PROCESS_CALLBACK ();
177
178                 {
179                         Glib::Mutex::Lock lm (io_lock);
180
181                         /* check that our_port is really one of ours */
182
183                         if ( ! _ports.contains(our_port)) {
184                                 return -1;
185                         }
186
187                         /* disconnect it from the source */
188
189                         if (our_port->disconnect (other_port)) {
190                                 error << string_compose(_("IO: cannot disconnect port %1 from %2"), our_port->name(), other_port) << endmsg;
191                                 return -1;
192                         }
193
194                         check_bundles_connected ();
195                 }
196         }
197
198         changed (ConnectionsChanged, src); /* EMIT SIGNAL */
199         _session.set_dirty ();
200
201         return 0;
202 }
203
204 int
205 IO::connect (Port* our_port, string other_port, void* src)
206 {
207         if (other_port.length() == 0 || our_port == 0) {
208                 return 0;
209         }
210
211         {
212                 BLOCK_PROCESS_CALLBACK ();
213
214                 {
215                         Glib::Mutex::Lock lm (io_lock);
216
217                         /* check that our_port is really one of ours */
218
219                         if ( ! _ports.contains(our_port) ) {
220                                 return -1;
221                         }
222
223                         /* connect it to the source */
224
225                         if (our_port->connect (other_port)) {
226                                 return -1;
227                         }
228                 }
229         }
230
231         changed (ConnectionsChanged, src); /* EMIT SIGNAL */
232         _session.set_dirty ();
233         return 0;
234 }
235
236 int
237 IO::remove_port (Port* port, void* src)
238 {
239         IOChange change (NoChange);
240
241         {
242                 BLOCK_PROCESS_CALLBACK ();
243
244
245                 {
246                         Glib::Mutex::Lock lm (io_lock);
247
248                         if (_ports.remove(port)) {
249                                 change = IOChange (change|ConfigurationChanged);
250
251                                 if (port->connected()) {
252                                         change = IOChange (change|ConnectionsChanged);
253                                 }
254
255                                 _session.engine().unregister_port (*port);
256                                 check_bundles_connected ();
257                         }
258                 }
259
260                 PortCountChanged (n_ports()); /* EMIT SIGNAL */
261         }
262
263         if (change & ConfigurationChanged) {
264                 setup_bundles ();
265         }
266
267         if (change != NoChange) {
268                 changed (change, src);
269                 _session.set_dirty ();
270                 return 0;
271         }
272
273         return -1;
274 }
275
276 /** Add an output port.
277  *
278  * @param destination Name of input port to connect new port to.
279  * @param src Source for emitted ConfigurationChanged signal.
280  * @param type Data type of port.  Default value (NIL) will use this IO's default type.
281  */
282 int
283 IO::add_port (string destination, void* src, DataType type)
284 {
285         Port* our_port;
286
287         if (type == DataType::NIL) {
288                 type = _default_type;
289         }
290
291         {
292                 BLOCK_PROCESS_CALLBACK ();
293
294
295                 {
296                         Glib::Mutex::Lock lm (io_lock);
297
298                         /* Create a new output port */
299
300                         string portname = build_legal_port_name (type);
301
302                         if (_direction == Input) {
303                                 if ((our_port = _session.engine().register_input_port (type, portname)) == 0) {
304                                         error << string_compose(_("IO: cannot register input port %1"), portname) << endmsg;
305                                         return -1;
306                                 }
307                         } else {
308                                 if ((our_port = _session.engine().register_output_port (type, portname)) == 0) {
309                                         error << string_compose(_("IO: cannot register output port %1"), portname) << endmsg;
310                                         return -1;
311                                 }
312                         }
313
314                         _ports.add (our_port);
315                 }
316
317                 PortCountChanged (n_ports()); /* EMIT SIGNAL */
318         }
319
320         if (destination.length()) {
321                 if (our_port->connect (destination)) {
322                         return -1;
323                 }
324         }
325
326         // pan_changed (src); /* EMIT SIGNAL */
327         changed (ConfigurationChanged, src); /* EMIT SIGNAL */
328         setup_bundles ();
329         _session.set_dirty ();
330
331         return 0;
332 }
333
334 int
335 IO::disconnect (void* src)
336 {
337         {
338                 BLOCK_PROCESS_CALLBACK ();
339
340                 {
341                         Glib::Mutex::Lock lm (io_lock);
342
343                         for (PortSet::iterator i = _ports.begin(); i != _ports.end(); ++i) {
344                                 i->disconnect_all ();
345                         }
346
347                         check_bundles_connected ();
348                 }
349         }
350
351         changed (ConnectionsChanged, src); /* EMIT SIGNAL */
352
353         return 0;
354 }
355
356 bool
357 IO::ensure_ports_locked (ChanCount count, bool clear, void* /*src*/)
358 {
359         Port* port = 0;
360         bool  changed    = false;
361
362         for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
363
364                 const size_t n = count.get(*t);
365
366                 /* remove unused ports */
367                 for (size_t i = n_ports().get(*t); i > n; --i) {
368                         port = _ports.port(*t, i-1);
369
370                         assert(port);
371                         _ports.remove(port);
372                         _session.engine().unregister_port (*port);
373
374                         changed = true;
375                 }
376
377                 /* create any necessary new ports */
378                 while (n_ports().get(*t) < n) {
379
380                         string portname = build_legal_port_name (*t);
381
382                         try {
383
384                                 if (_direction == Input) {
385                                         if ((port = _session.engine().register_input_port (*t, portname)) == 0) {
386                                                 error << string_compose(_("IO: cannot register input port %1"), portname) << endmsg;
387                                                 return -1;
388                                         }
389                                 } else {
390                                         if ((port = _session.engine().register_output_port (*t, portname)) == 0) {
391                                                 error << string_compose(_("IO: cannot register output port %1"), portname) << endmsg;
392                                                 return -1;
393                                         }
394                                 }
395                         }
396
397                         catch (AudioEngine::PortRegistrationFailure& err) {
398                                 /* pass it on */
399                                 throw AudioEngine::PortRegistrationFailure();
400                         }
401
402                         _ports.add (port);
403                         changed = true;
404                 }
405         }
406
407         if (changed) {
408                 check_bundles_connected ();
409                 PortCountChanged (n_ports()); /* EMIT SIGNAL */
410                 _session.set_dirty ();
411         }
412
413         if (clear) {
414                 /* disconnect all existing ports so that we get a fresh start */
415                 for (PortSet::iterator i = _ports.begin(); i != _ports.end(); ++i) {
416                         i->disconnect_all ();
417                 }
418         }
419
420         return changed;
421 }
422
423
424 int
425 IO::ensure_ports (ChanCount count, bool clear, bool lockit, void* src)
426 {
427         bool changed = false;
428
429         if (count == n_ports() && !clear) {
430                 return 0;
431         }
432
433         if (lockit) {
434                 BLOCK_PROCESS_CALLBACK ();
435                 Glib::Mutex::Lock im (io_lock);
436                 changed = ensure_ports_locked (count, clear, src);
437         } else {
438                 changed = ensure_ports_locked (count, clear, src);
439         }
440
441         if (changed) {
442                 this->changed (ConfigurationChanged, src); /* EMIT SIGNAL */
443                 setup_bundles ();
444                 _session.set_dirty ();
445         }
446
447         return 0;
448 }
449
450 int
451 IO::ensure_io (ChanCount count, bool clear, void* src)
452 {
453         return ensure_ports (count, clear, true, src);
454 }
455
456 XMLNode&
457 IO::get_state (void)
458 {
459         return state (true);
460 }
461
462 XMLNode&
463 IO::state (bool /*full_state*/)
464 {
465         XMLNode* node = new XMLNode (state_node_name);
466         char buf[64];
467         string str;
468         vector<string>::iterator ci;
469         int n;
470         LocaleGuard lg (X_("POSIX"));
471         Glib::Mutex::Lock lm (io_lock);
472
473         node->add_property("name", _name);
474         id().print (buf, sizeof (buf));
475         node->add_property("id", buf);
476         node->add_property ("direction", enum_2_string (_direction));
477         node->add_property ("default-type", _default_type.to_string());
478
479         for (std::vector<UserBundleInfo>::iterator i = _bundles_connected.begin(); i != _bundles_connected.end(); ++i) {
480                 XMLNode* n = new XMLNode ("Bundle");
481                 n->add_property ("name", i->bundle->name ());
482                 node->add_child_nocopy (*n);
483         }
484
485         for (PortSet::iterator i = _ports.begin(); i != _ports.end(); ++i) {
486
487                 vector<string> connections;
488
489                 XMLNode* pnode = new XMLNode (X_("Port"));
490                 pnode->add_property (X_("type"), i->type().to_string());
491                 pnode->add_property (X_("name"), i->name());
492
493                 if (i->get_connections (connections)) {
494
495                         for (n = 0, ci = connections.begin(); ci != connections.end(); ++ci, ++n) {
496
497                                 /* if its a connection to our own port,
498                                    return only the port name, not the
499                                    whole thing. this allows connections
500                                    to be re-established even when our
501                                    client name is different.
502                                 */
503
504                                 XMLNode* cnode = new XMLNode (X_("Connection"));
505
506                                 cnode->add_property (X_("other"), _session.engine().make_port_name_relative (*ci));
507                                 pnode->add_child_nocopy (*cnode);
508                         }
509                 }
510
511                 node->add_child_nocopy (*pnode);
512         }
513
514         return *node;
515 }
516
517 int
518 IO::set_state (const XMLNode& node, int version)
519 {
520         /* callers for version < 3000 need to call set_state_2X directly, as A3 IOs
521          * are input OR output, not both, so the direction needs to be specified
522          * by the caller.
523          */
524         assert (version >= 3000);
525         
526         const XMLProperty* prop;
527         XMLNodeConstIterator iter;
528         LocaleGuard lg (X_("POSIX"));
529
530         /* force use of non-localized representation of decimal point,
531            since we use it a lot in XML files and so forth.
532         */
533
534         if (node.name() != state_node_name) {
535                 error << string_compose(_("incorrect XML node \"%1\" passed to IO object"), node.name()) << endmsg;
536                 return -1;
537         }
538
539         if ((prop = node.property ("name")) != 0) {
540                 set_name (prop->value());
541         }
542
543         if ((prop = node.property (X_("default-type"))) != 0) {
544                 _default_type = DataType(prop->value());
545                 assert(_default_type != DataType::NIL);
546         }
547
548         if ((prop = node.property ("id")) != 0) {
549                 _id = prop->value ();
550         }
551
552         if ((prop = node.property ("direction")) != 0) {
553                 _direction = (Direction) string_2_enum (prop->value(), _direction);
554         }
555
556         if (create_ports (node, version)) {
557                 return -1;
558         }
559
560         if (connecting_legal) {
561
562                 if (make_connections (node, version, false)) {
563                         return -1;
564                 }
565
566         } else {
567
568                 pending_state_node = new XMLNode (node);
569                 pending_state_node_version = version;
570                 pending_state_node_in = false;
571                 connection_legal_c = ConnectingLegal.connect (mem_fun (*this, &IO::connecting_became_legal));
572         }
573
574
575         return 0;
576 }
577
578 int
579 IO::set_state_2X (const XMLNode& node, int version, bool in)
580 {
581         const XMLProperty* prop;
582         XMLNodeConstIterator iter;
583         LocaleGuard lg (X_("POSIX"));
584
585         /* force use of non-localized representation of decimal point,
586            since we use it a lot in XML files and so forth.
587         */
588
589         if (node.name() != state_node_name) {
590                 error << string_compose(_("incorrect XML node \"%1\" passed to IO object"), node.name()) << endmsg;
591                 return -1;
592         }
593         
594         if ((prop = node.property ("name")) != 0) {
595                 set_name (prop->value());
596         }
597
598         if ((prop = node.property (X_("default-type"))) != 0) {
599                 _default_type = DataType(prop->value());
600                 assert(_default_type != DataType::NIL);
601         }
602
603         if ((prop = node.property ("id")) != 0) {
604                 _id = prop->value ();
605         }
606
607         _direction = in ? Input : Output;
608
609         if (create_ports (node, version)) {
610                 return -1;
611         }
612
613         if (connecting_legal) {
614                 
615                 if (make_connections_2X (node, version, in)) {
616                         return -1;
617                 }
618
619         } else {
620
621                 pending_state_node = new XMLNode (node);
622                 pending_state_node_version = version;
623                 pending_state_node_in = in;
624                 connection_legal_c = ConnectingLegal.connect (mem_fun (*this, &IO::connecting_became_legal));
625         }
626
627         return 0;
628 }
629
630 int
631 IO::connecting_became_legal ()
632 {
633         int ret;
634
635         assert (pending_state_node);
636
637         connection_legal_c.disconnect ();
638
639         ret = make_connections (*pending_state_node, pending_state_node_version, pending_state_node_in);
640
641         delete pending_state_node;
642         pending_state_node = 0;
643
644         return ret;
645 }
646
647 boost::shared_ptr<Bundle>
648 IO::find_possible_bundle (const string &desired_name)
649 {
650         static const string digits = "0123456789";
651         const string &default_name = (_direction == Input ? _("in") : _("out"));
652         const string &bundle_type_name = (_direction == Input ? _("input") : _("output"));
653
654         boost::shared_ptr<Bundle> c = _session.bundle_by_name (desired_name);
655
656         if (!c) {
657                 int bundle_number, mask;
658                 string possible_name;
659                 bool stereo = false;
660                 string::size_type last_non_digit_pos;
661
662                 error << string_compose(_("Unknown bundle \"%1\" listed for %2 of %3"), desired_name, bundle_type_name, _name)
663                       << endmsg;
664
665                 // find numeric suffix of desired name
666                 bundle_number = 0;
667
668                 last_non_digit_pos = desired_name.find_last_not_of(digits);
669
670                 if (last_non_digit_pos != string::npos) {
671                         stringstream s;
672                         s << desired_name.substr(last_non_digit_pos);
673                         s >> bundle_number;
674                 }
675
676                 // see if it's a stereo connection e.g. "in 3+4"
677
678                 if (last_non_digit_pos > 1 && desired_name[last_non_digit_pos] == '+') {
679                         int left_bundle_number = 0;
680                         string::size_type left_last_non_digit_pos;
681
682                         left_last_non_digit_pos = desired_name.find_last_not_of(digits, last_non_digit_pos-1);
683
684                         if (left_last_non_digit_pos != string::npos) {
685                                 stringstream s;
686                                 s << desired_name.substr(left_last_non_digit_pos, last_non_digit_pos-1);
687                                 s >> left_bundle_number;
688
689                                 if (left_bundle_number > 0 && left_bundle_number + 1 == bundle_number) {
690                                         bundle_number--;
691                                         stereo = true;
692                                 }
693                         }
694                 }
695
696                 // make 0-based
697                 if (bundle_number)
698                         bundle_number--;
699
700                 // find highest set bit
701                 mask = 1;
702                 while ((mask <= bundle_number) && (mask <<= 1)) {}
703
704                 // "wrap" bundle number into largest possible power of 2
705                 // that works...
706
707                 while (mask) {
708
709                         if (bundle_number & mask) {
710                                 bundle_number &= ~mask;
711
712                                 stringstream s;
713                                 s << default_name << " " << bundle_number + 1;
714
715                                 if (stereo) {
716                                         s << "+" << bundle_number + 2;
717                                 }
718
719                                 possible_name = s.str();
720
721                                 if ((c = _session.bundle_by_name (possible_name)) != 0) {
722                                         break;
723                                 }
724                         }
725                         mask >>= 1;
726                 }
727                 if (c) {
728                         info << string_compose (_("Bundle %1 was not available - \"%2\" used instead"), desired_name, possible_name)
729                              << endmsg;
730                 } else {
731                         error << string_compose(_("No %1 bundles available as a replacement"), bundle_type_name)
732                               << endmsg;
733                 }
734
735         }
736
737         return c;
738
739 }
740
741 int
742 IO::get_port_counts_2X (XMLNode const & node, int version, ChanCount& n, boost::shared_ptr<Bundle>& c)
743 {
744         XMLProperty const * prop;
745         XMLNodeList children = node.children ();
746
747         uint32_t n_audio = 0;
748         
749         for (XMLNodeIterator i = children.begin(); i != children.end(); ++i) {
750
751                 if ((prop = node.property ("inputs")) != 0 && _direction == Input) {
752                         n_audio = count (prop->value().begin(), prop->value().end(), '{');
753                 } else if ((prop = node.property ("outputs")) != 0 && _direction == Output) {
754                         n_audio = count (prop->value().begin(), prop->value().end(), '{');
755                 }
756         }
757
758         ChanCount cnt;
759         cnt.set_audio (n_audio);
760         n = ChanCount::max (n, cnt);
761
762         return 0;
763 }
764
765 int
766 IO::get_port_counts (const XMLNode& node, int version, ChanCount& n, boost::shared_ptr<Bundle>& c)
767 {
768         if (version < 3000) {
769                 return get_port_counts_2X (node, version, n, c);
770         }
771         
772         XMLProperty const * prop;
773         XMLNodeConstIterator iter;
774         uint32_t n_audio = 0;
775         uint32_t n_midi = 0;
776         ChanCount cnt;
777
778         n = n_ports();
779
780         if ((prop = node.property ("connection")) != 0) {
781
782                 if ((c = find_possible_bundle (prop->value())) != 0) {
783                         n = ChanCount::max (n, ChanCount(c->type(), c->nchannels()));
784                 }
785                 return 0;
786         }
787
788         for (iter = node.children().begin(); iter != node.children().end(); ++iter) {
789
790                 if ((*iter)->name() == X_("Bundle")) {
791                         if ((c = find_possible_bundle (prop->value())) != 0) {
792                                 n = ChanCount::max (n, ChanCount(c->type(), c->nchannels()));
793                                 return 0;
794                         } else {
795                                 return -1;
796                         }
797                 }
798
799                 if ((*iter)->name() == X_("Port")) {
800                         prop = (*iter)->property (X_("type"));
801
802                         if (!prop) {
803                                 continue;
804                         }
805
806                         if (prop->value() == X_("audio")) {
807                                 cnt.set_audio (++n_audio);
808                         } else if (prop->value() == X_("midi")) {
809                                 cnt.set_midi (++n_midi);
810                         }
811                 }
812         }
813
814         n = ChanCount::max (n, cnt);
815         return 0;
816 }
817
818 int
819 IO::create_ports (const XMLNode& node, int version)
820 {
821         ChanCount n;
822         boost::shared_ptr<Bundle> c;
823         
824         get_port_counts (node, version, n, c);
825         
826         if (ensure_ports (n, true, true, this)) {
827                 error << string_compose(_("%1: cannot create I/O ports"), _name) << endmsg;
828                 return -1;
829         }
830
831         /* XXX use c */
832
833         return 0;
834 }
835
836 int
837 IO::make_connections (const XMLNode& node, int version, bool in)
838 {
839         if (version < 3000) {
840                 return make_connections_2X (node, version, in);
841         }
842                         
843         const XMLProperty* prop;
844
845         for (XMLNodeConstIterator i = node.children().begin(); i != node.children().end(); ++i) {
846
847                 if ((*i)->name() == "Bundle") {
848                         XMLProperty const * prop = (*i)->property ("name");
849                         if (prop) {
850                                 boost::shared_ptr<Bundle> b = find_possible_bundle (prop->value());
851                                 if (b) {
852                                         connect_ports_to_bundle (b, this);
853                                 }
854                         }
855
856                         return 0;
857                 }
858
859                 if ((*i)->name() == "Port") {
860
861                         prop = (*i)->property (X_("name"));
862
863                         if (!prop) {
864                                 continue;
865                         }
866
867                         Port* p = port_by_name (prop->value());
868
869                         if (p) {
870                                 for (XMLNodeConstIterator c = (*i)->children().begin(); c != (*i)->children().end(); ++c) {
871
872                                         XMLNode* cnode = (*c);
873
874                                         if (cnode->name() != X_("Connection")) {
875                                                 continue;
876                                         }
877
878                                         if ((prop = cnode->property (X_("other"))) == 0) {
879                                                 continue;
880                                         }
881
882                                         if (prop) {
883                                                 p->connect (prop->value());
884                                         }
885                                 }
886                         }
887                 }
888         }
889
890         return 0;
891 }
892
893
894 int
895 IO::make_connections_2X (const XMLNode& node, int version, bool in)
896 {
897         const XMLProperty* prop;
898
899         /* XXX: bundles ("connections" as was) */
900         
901         if ((prop = node.property ("inputs")) != 0 && in) {
902
903                 string::size_type ostart = 0;
904                 string::size_type start = 0;
905                 string::size_type end = 0;
906                 int i = 0;
907                 int n;
908                 vector<string> ports;
909
910                 string const str = prop->value ();
911                 
912                 while ((start = str.find_first_of ('{', ostart)) != string::npos) {
913                         start += 1;
914                         
915                         if ((end = str.find_first_of ('}', start)) == string::npos) {
916                                 error << string_compose(_("IO: badly formed string in XML node for inputs \"%1\""), str) << endmsg;
917                                 return -1;
918                         }
919                         
920                         if ((n = parse_io_string (str.substr (start, end - start), ports)) < 0) {
921                                 error << string_compose(_("bad input string in XML node \"%1\""), str) << endmsg;
922                                 
923                                 return -1;
924                                 
925                         } else if (n > 0) {
926
927
928                                 for (int x = 0; x < n; ++x) {
929                                         /* XXX: this is a bit of a hack; need to check if it's always valid */
930                                         string::size_type const p = ports[x].find ("/out");
931                                         if (p != string::npos) {
932                                                 ports[x].replace (p, 4, "/audio_out");
933                                         }
934                                         nth(i)->connect (ports[x]);
935                                 }
936                         }
937                         
938                         ostart = end+1;
939                         i++;
940                 }
941
942         }
943
944         if ((prop = node.property ("outputs")) != 0 && !in) {
945
946                 string::size_type ostart = 0;
947                 string::size_type start = 0;
948                 string::size_type end = 0;
949                 int i = 0;
950                 int n;
951                 vector<string> ports;
952         
953                 string const str = prop->value ();
954                 
955                 while ((start = str.find_first_of ('{', ostart)) != string::npos) {
956                         start += 1;
957                         
958                         if ((end = str.find_first_of ('}', start)) == string::npos) {
959                                 error << string_compose(_("IO: badly formed string in XML node for outputs \"%1\""), str) << endmsg;
960                                 return -1;
961                         }
962                         
963                         if ((n = parse_io_string (str.substr (start, end - start), ports)) < 0) {
964                                 error << string_compose(_("IO: bad output string in XML node \"%1\""), str) << endmsg;
965                                 
966                                 return -1;
967                                 
968                         } else if (n > 0) {
969                                 
970                                 for (int x = 0; x < n; ++x) {
971                                         /* XXX: this is a bit of a hack; need to check if it's always valid */
972                                         string::size_type const p = ports[x].find ("/in");
973                                         if (p != string::npos) {
974                                                 ports[x].replace (p, 3, "/audio_in");
975                                         }
976                                         nth(i)->connect (ports[x]);
977                                 }
978                         }
979                         
980                         ostart = end+1;
981                         i++;
982                 }
983         }
984
985         return 0;
986 }
987
988 int
989 IO::set_ports (const string& str)
990 {
991         vector<string> ports;
992         int i;
993         int n;
994         uint32_t nports;
995
996         if ((nports = count (str.begin(), str.end(), '{')) == 0) {
997                 return 0;
998         }
999
1000         // FIXME: audio-only
1001         if (ensure_ports (ChanCount(DataType::AUDIO, nports), true, true, this)) {
1002                 return -1;
1003         }
1004
1005         string::size_type start, end, ostart;
1006
1007         ostart = 0;
1008         start = 0;
1009         end = 0;
1010         i = 0;
1011
1012         while ((start = str.find_first_of ('{', ostart)) != string::npos) {
1013                 start += 1;
1014
1015                 if ((end = str.find_first_of ('}', start)) == string::npos) {
1016                         error << string_compose(_("IO: badly formed string in XML node for inputs \"%1\""), str) << endmsg;
1017                         return -1;
1018                 }
1019
1020                 if ((n = parse_io_string (str.substr (start, end - start), ports)) < 0) {
1021                         error << string_compose(_("bad input string in XML node \"%1\""), str) << endmsg;
1022
1023                         return -1;
1024
1025                 } else if (n > 0) {
1026
1027                         for (int x = 0; x < n; ++x) {
1028                                 connect (nth (i), ports[x], this);
1029                         }
1030                 }
1031
1032                 ostart = end+1;
1033                 i++;
1034         }
1035
1036         return 0;
1037 }
1038
1039 int
1040 IO::parse_io_string (const string& str, vector<string>& ports)
1041 {
1042         string::size_type pos, opos;
1043
1044         if (str.length() == 0) {
1045                 return 0;
1046         }
1047
1048         pos = 0;
1049         opos = 0;
1050
1051         ports.clear ();
1052
1053         while ((pos = str.find_first_of (',', opos)) != string::npos) {
1054                 ports.push_back (str.substr (opos, pos - opos));
1055                 opos = pos + 1;
1056         }
1057
1058         if (opos < str.length()) {
1059                 ports.push_back (str.substr(opos));
1060         }
1061
1062         return ports.size();
1063 }
1064
1065 int
1066 IO::parse_gain_string (const string& str, vector<string>& ports)
1067 {
1068         string::size_type pos, opos;
1069
1070         pos = 0;
1071         opos = 0;
1072         ports.clear ();
1073
1074         while ((pos = str.find_first_of (',', opos)) != string::npos) {
1075                 ports.push_back (str.substr (opos, pos - opos));
1076                 opos = pos + 1;
1077         }
1078
1079         if (opos < str.length()) {
1080                 ports.push_back (str.substr(opos));
1081         }
1082
1083         return ports.size();
1084 }
1085
1086 bool
1087 IO::set_name (const string& requested_name)
1088 {
1089         string name = requested_name;
1090
1091         if (name == _name) {
1092                 return true;
1093         }
1094
1095         /* replace all colons in the name. i wish we didn't have to do this */
1096
1097         if (replace_all (name, ":", "-")) {
1098                 warning << _("you cannot use colons to name objects with I/O connections") << endmsg;
1099         }
1100
1101         for (PortSet::iterator i = _ports.begin(); i != _ports.end(); ++i) {
1102                 string current_name = i->name();
1103                 current_name.replace (current_name.find (_name), _name.length(), name);
1104                 i->set_name (current_name);
1105         }
1106
1107         bool const r = SessionObject::set_name (name);
1108
1109         setup_bundles ();
1110
1111         return r;
1112 }
1113
1114 void
1115 IO::set_port_latency (nframes_t nframes)
1116 {
1117         Glib::Mutex::Lock lm (io_lock);
1118
1119         for (PortSet::iterator i = _ports.begin(); i != _ports.end(); ++i) {
1120                 i->set_latency (nframes);
1121         }
1122 }
1123
1124 nframes_t
1125 IO::latency () const
1126 {
1127         nframes_t max_latency;
1128         nframes_t latency;
1129
1130         max_latency = 0;
1131
1132         /* io lock not taken - must be protected by other means */
1133
1134         for (PortSet::const_iterator i = _ports.begin(); i != _ports.end(); ++i) {
1135                 if ((latency = i->total_latency ()) > max_latency) {
1136                         max_latency = latency;
1137                 }
1138         }
1139
1140         return max_latency;
1141 }
1142
1143 void
1144 IO::update_port_total_latencies ()
1145 {
1146         /* io_lock, not taken: function must be called from Session::process() calltree */
1147
1148         for (PortSet::iterator i = _ports.begin(); i != _ports.end(); ++i) {
1149                 _session.engine().update_total_latency (*i);
1150         }
1151 }
1152
1153 int
1154 IO::connect_ports_to_bundle (boost::shared_ptr<Bundle> c, void* src)
1155 {
1156         {
1157                 BLOCK_PROCESS_CALLBACK ();
1158                 Glib::Mutex::Lock lm2 (io_lock);
1159
1160                 c->connect (_bundle, _session.engine());
1161
1162                 /* If this is a UserBundle, make a note of what we've done */
1163
1164                 boost::shared_ptr<UserBundle> ub = boost::dynamic_pointer_cast<UserBundle> (c);
1165                 if (ub) {
1166
1167                         /* See if we already know about this one */
1168                         std::vector<UserBundleInfo>::iterator i = _bundles_connected.begin();
1169                         while (i != _bundles_connected.end() && i->bundle != ub) {
1170                                 ++i;
1171                         }
1172
1173                         if (i == _bundles_connected.end()) {
1174                                 /* We don't, so make a note */
1175                                 _bundles_connected.push_back (UserBundleInfo (this, ub));
1176                         }
1177                 }
1178         }
1179
1180         changed (IOChange (ConfigurationChanged|ConnectionsChanged), src); /* EMIT SIGNAL */
1181         return 0;
1182 }
1183
1184 int
1185 IO::disconnect_ports_from_bundle (boost::shared_ptr<Bundle> c, void* src)
1186 {
1187         {
1188                 BLOCK_PROCESS_CALLBACK ();
1189                 Glib::Mutex::Lock lm2 (io_lock);
1190
1191                 c->disconnect (_bundle, _session.engine());
1192
1193                 /* If this is a UserBundle, make a note of what we've done */
1194
1195                 boost::shared_ptr<UserBundle> ub = boost::dynamic_pointer_cast<UserBundle> (c);
1196                 if (ub) {
1197
1198                         std::vector<UserBundleInfo>::iterator i = _bundles_connected.begin();
1199                         while (i != _bundles_connected.end() && i->bundle != ub) {
1200                                 ++i;
1201                         }
1202
1203                         if (i != _bundles_connected.end()) {
1204                                 _bundles_connected.erase (i);
1205                         }
1206                 }
1207         }
1208
1209         changed (IOChange (ConfigurationChanged|ConnectionsChanged), src); /* EMIT SIGNAL */
1210         return 0;
1211 }
1212
1213
1214 int
1215 IO::disable_connecting ()
1216 {
1217         connecting_legal = false;
1218         return 0;
1219 }
1220
1221 int
1222 IO::enable_connecting ()
1223 {
1224         connecting_legal = true;
1225         return ConnectingLegal ();
1226 }
1227
1228 void
1229 IO::bundle_changed (Bundle::Change /*c*/)
1230 {
1231         //XXX
1232 //      connect_input_ports_to_bundle (_input_bundle, this);
1233 }
1234
1235
1236 string
1237 IO::build_legal_port_name (DataType type)
1238 {
1239         const int name_size = jack_port_name_size();
1240         int limit;
1241         string suffix;
1242
1243         if (type == DataType::AUDIO) {
1244                 suffix = _("audio");
1245         } else if (type == DataType::MIDI) {
1246                 suffix = _("midi");
1247         } else {
1248                 throw unknown_type();
1249         }
1250
1251         /* note that if "in" or "out" are translated it will break a session
1252            across locale switches because a port's connection list will
1253            show (old) translated names, but the current port name will
1254            use the (new) translated name.
1255         */
1256
1257         if (_direction == Input) {
1258                 suffix += X_("_in");
1259         } else {
1260                 suffix += X_("_out");
1261         }
1262
1263         // allow up to 4 digits for the output port number, plus the slash, suffix and extra space
1264
1265         limit = name_size - _session.engine().client_name().length() - (suffix.length() + 5);
1266
1267         char buf1[name_size+1];
1268         char buf2[name_size+1];
1269
1270         snprintf (buf1, name_size+1, ("%.*s/%s"), limit, _name.c_str(), suffix.c_str());
1271
1272         int port_number = find_port_hole (buf1);
1273         snprintf (buf2, name_size+1, "%s %d", buf1, port_number);
1274
1275         return string (buf2);
1276 }
1277
1278 int32_t
1279 IO::find_port_hole (const char* base)
1280 {
1281         /* CALLER MUST HOLD IO LOCK */
1282
1283         uint32_t n;
1284
1285         if (_ports.empty()) {
1286                 return 1;
1287         }
1288
1289         /* we only allow up to 4 characters for the port number
1290          */
1291
1292         for (n = 1; n < 9999; ++n) {
1293                 char buf[jack_port_name_size()];
1294                 PortSet::iterator i = _ports.begin();
1295
1296                 snprintf (buf, jack_port_name_size(), _("%s %u"), base, n);
1297
1298                 for ( ; i != _ports.end(); ++i) {
1299                         if (i->name() == buf) {
1300                                 break;
1301                         }
1302                 }
1303
1304                 if (i == _ports.end()) {
1305                         break;
1306                 }
1307         }
1308         return n;
1309 }
1310
1311
1312 AudioPort*
1313 IO::audio(uint32_t n) const
1314 {
1315         return _ports.nth_audio_port (n);
1316
1317 }
1318
1319 MidiPort*
1320 IO::midi(uint32_t n) const
1321 {
1322         return _ports.nth_midi_port (n);
1323 }
1324
1325 /**
1326  *  Setup bundles that describe our inputs and outputs. Also creates bundles if necessary.
1327  */
1328
1329 void
1330 IO::setup_bundles ()
1331 {
1332         char buf[32];
1333
1334         if (!_bundle) {
1335                 _bundle.reset (new Bundle (_direction == Input));
1336         }
1337
1338         _bundle->suspend_signals ();
1339
1340         _bundle->set_type (default_type ());
1341
1342         _bundle->remove_channels ();
1343
1344         if (_direction == Input) {
1345                 snprintf(buf, sizeof (buf), _("%s in"), _name.c_str());
1346         } else {
1347                 snprintf(buf, sizeof (buf), _("%s out"), _name.c_str());
1348         }
1349         _bundle->set_name (buf);
1350         uint32_t const ni = _ports.num_ports();
1351         for (uint32_t i = 0; i < ni; ++i) {
1352                 _bundle->add_channel (bundle_channel_name (i, ni));
1353                 _bundle->set_port (i, _session.engine().make_port_name_non_relative (_ports.port(i)->name()));
1354         }
1355
1356         _bundle->resume_signals ();
1357 }
1358
1359 /** @return Bundles connected to our ports */
1360 BundleList
1361 IO::bundles_connected ()
1362 {
1363         BundleList bundles;
1364
1365         /* User bundles */
1366         for (std::vector<UserBundleInfo>::iterator i = _bundles_connected.begin(); i != _bundles_connected.end(); ++i) {
1367                 bundles.push_back (i->bundle);
1368         }
1369
1370         /* Session bundles */
1371         boost::shared_ptr<ARDOUR::BundleList> b = _session.bundles ();
1372         for (ARDOUR::BundleList::iterator i = b->begin(); i != b->end(); ++i) {
1373                 if ((*i)->connected_to (_bundle, _session.engine())) {
1374                         bundles.push_back (*i);
1375                 }
1376         }
1377
1378         /* Route bundles */
1379
1380         boost::shared_ptr<ARDOUR::RouteList> r = _session.get_routes ();
1381
1382         if (_direction == Input) {
1383                 for (ARDOUR::RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1384                         if ((*i)->output()->bundle()->connected_to (_bundle, _session.engine())) {
1385                                 bundles.push_back ((*i)->output()->bundle());
1386                         }
1387                 }
1388         } else {
1389                 for (ARDOUR::RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1390                         if ((*i)->input()->bundle()->connected_to (_bundle, _session.engine())) {
1391                                 bundles.push_back ((*i)->input()->bundle());
1392                         }
1393                 }
1394         }
1395
1396         return bundles;
1397 }
1398
1399
1400 IO::UserBundleInfo::UserBundleInfo (IO* io, boost::shared_ptr<UserBundle> b)
1401 {
1402         bundle = b;
1403         changed = b->Changed.connect (
1404                 sigc::mem_fun (*io, &IO::bundle_changed)
1405                 );
1406 }
1407
1408 std::string
1409 IO::bundle_channel_name (uint32_t c, uint32_t n) const
1410 {
1411         char buf[32];
1412
1413         switch (n) {
1414         case 1:
1415                 return _("mono");
1416         case 2:
1417                 return c == 0 ? _("L") : _("R");
1418         default:
1419                 snprintf (buf, sizeof(buf), _("%d"), (c + 1));
1420                 return buf;
1421         }
1422
1423         return "";
1424 }
1425
1426 string
1427 IO::name_from_state (const XMLNode& node)
1428 {
1429         const XMLProperty* prop;
1430
1431         if ((prop = node.property ("name")) != 0) {
1432                 return prop->value();
1433         }
1434
1435         return string();
1436 }
1437
1438 void
1439 IO::set_name_in_state (XMLNode& node, const string& new_name)
1440 {
1441         const XMLProperty* prop;
1442
1443         if ((prop = node.property ("name")) != 0) {
1444                 node.add_property ("name", new_name);
1445         }
1446 }
1447
1448 bool
1449 IO::connected_to (boost::shared_ptr<const IO> other) const
1450 {
1451         if (!other) {
1452                 /* do we have any connections at all? */
1453
1454                 for (PortSet::const_iterator p = _ports.begin(); p != _ports.end(); ++p) {
1455                         if (p->connected()) {
1456                                 return true;
1457                         }
1458                 }
1459
1460                 return false;
1461         }
1462
1463         assert (_direction != other->direction());
1464
1465         uint32_t i, j;
1466         uint32_t no = n_ports().n_total();
1467         uint32_t ni = other->n_ports ().n_total();
1468
1469         for (i = 0; i < no; ++i) {
1470                 for (j = 0; j < ni; ++j) {
1471                         if (nth(i)->connected_to (other->nth(j)->name())) {
1472                                 return true;
1473                         }
1474                 }
1475         }
1476
1477         return false;
1478 }
1479
1480 void
1481 IO::process_input (boost::shared_ptr<Processor> proc, sframes_t start_frame, sframes_t end_frame, nframes_t nframes)
1482 {
1483         BufferSet bufs;
1484
1485         /* don't read the data into new buffers - just use the port buffers directly */
1486
1487         bufs.attach_buffers (_ports, nframes, 0);
1488         proc->run (bufs, start_frame, end_frame, nframes);
1489 }
1490
1491 void
1492 IO::collect_input (BufferSet& bufs, nframes_t nframes, ChanCount offset)
1493 {
1494         assert(bufs.available() >= _ports.count());
1495
1496         if (_ports.count() == ChanCount::ZERO) {
1497                 return;
1498         }
1499
1500         bufs.set_count (_ports.count());
1501
1502         for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1503                 PortSet::iterator   i = _ports.begin(*t);
1504                 BufferSet::iterator b = bufs.begin(*t);
1505
1506                 for (uint32_t off = 0; off < offset.get(*t); ++off, ++b) {
1507                         if (b == bufs.end(*t)) {
1508                                 continue;
1509                         }
1510                 }
1511
1512                 for ( ; i != _ports.end(*t); ++i, ++b) {
1513                         Buffer& bb (i->get_buffer (nframes));
1514                         b->read_from (bb, nframes);
1515                 }
1516         }
1517 }
1518
1519 void
1520 IO::copy_to_outputs (BufferSet& bufs, DataType type, nframes_t nframes, nframes_t offset)
1521 {
1522         // Copy any buffers 1:1 to outputs
1523
1524         PortSet::iterator o = _ports.begin(type);
1525         BufferSet::iterator i = bufs.begin(type);
1526         BufferSet::iterator prev = i;
1527
1528         while (i != bufs.end(type) && o != _ports.end (type)) {
1529                 Buffer& port_buffer (o->get_buffer (nframes));
1530                 port_buffer.read_from (*i, nframes, offset);
1531                 prev = i;
1532                 ++i;
1533                 ++o;
1534         }
1535
1536         // Copy last buffer to any extra outputs
1537
1538         while (o != _ports.end(type)) {
1539                 Buffer& port_buffer (o->get_buffer (nframes));
1540                 port_buffer.read_from (*prev, nframes, offset);
1541                 ++o;
1542         }
1543 }
1544
1545 Port*
1546 IO::port_by_name (const std::string& str) const
1547 {
1548         /* to be called only from ::set_state() - no locking */
1549
1550         for (PortSet::const_iterator i = _ports.begin(); i != _ports.end(); ++i) {
1551
1552                 const Port& p(*i);
1553
1554                 if (p.name() == str) {
1555                         return const_cast<Port*>(&p);
1556                 }
1557         }
1558
1559         return 0;
1560 }