Make exact beat calculation of tempi a bit less cumbersome. Move tempi on an audio...
[ardour.git] / libs / ardour / io.cc
index a274f4995b8c7fee684ce8099edf542bdf5576ab..9f880c5b91c6a849ee4792f0e42e405f181a7659 100644 (file)
@@ -16,7 +16,6 @@
     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */
 
-#include <fstream>
 #include <algorithm>
 #include <cmath>
 #include <vector>
@@ -100,6 +99,9 @@ IO::~IO ()
 void
 IO::disconnect_check (boost::shared_ptr<Port> a, boost::shared_ptr<Port> b)
 {
+       if (_session.state_of_the_state () & Session::Deletion) {
+               return;
+       }
        /* this could be called from within our own ::disconnect() method(s)
           or from somewhere that operates directly on a port. so, we don't
           know for sure if we can take this lock or not. if we fail,
@@ -369,6 +371,7 @@ IO::add_port (string destination, void* src, DataType type)
                }
        }
 
+       apply_pretty_name ();
        setup_bundle ();
        _session.set_dirty ();
 
@@ -527,7 +530,7 @@ IO::state (bool /*full_state*/)
        char buf[64];
        string str;
        int n;
-       LocaleGuard lg (X_("C"));
+       LocaleGuard lg;
        Glib::Threads::Mutex::Lock lm (io_lock);
 
        node->add_property("name", _name);
@@ -536,6 +539,10 @@ IO::state (bool /*full_state*/)
        node->add_property ("direction", enum_2_string (_direction));
        node->add_property ("default-type", _default_type.to_string());
 
+       if (!_pretty_name_prefix.empty ()) {
+               node->add_property("pretty-name", _pretty_name_prefix);
+       }
+
        for (std::vector<UserBundleInfo*>::iterator i = _bundles_connected.begin(); i != _bundles_connected.end(); ++i) {
                XMLNode* n = new XMLNode ("Bundle");
                n->add_property ("name", (*i)->bundle->name ());
@@ -588,9 +595,9 @@ IO::set_state (const XMLNode& node, int version)
         */
        assert (version >= 3000);
 
-       const XMLProperty* prop;
+       XMLProperty const * prop;
        XMLNodeConstIterator iter;
-       LocaleGuard lg (X_("C"));
+       LocaleGuard lg;
 
        /* force use of non-localized representation of decimal point,
           since we use it a lot in XML files and so forth.
@@ -620,6 +627,11 @@ IO::set_state (const XMLNode& node, int version)
                return -1;
        }
 
+       // after create_ports, updates names
+       if ((prop = node.property ("pretty-name")) != 0) {
+               set_pretty_name (prop->value());
+       }
+
        if (connecting_legal) {
 
                if (make_connections (node, version, false)) {
@@ -644,9 +656,9 @@ IO::set_state (const XMLNode& node, int version)
 int
 IO::set_state_2X (const XMLNode& node, int version, bool in)
 {
-       const XMLProperty* prop;
+       XMLProperty const * prop;
        XMLNodeConstIterator iter;
-       LocaleGuard lg (X_("C"));
+       LocaleGuard lg;
 
        /* force use of non-localized representation of decimal point,
           since we use it a lot in XML files and so forth.
@@ -916,7 +928,7 @@ IO::make_connections (const XMLNode& node, int version, bool in)
                return make_connections_2X (node, version, in);
        }
 
-       const XMLProperty* prop;
+       XMLProperty const * prop;
 
        for (XMLNodeConstIterator i = node.children().begin(); i != node.children().end(); ++i) {
 
@@ -977,7 +989,7 @@ IO::prepare_for_reset (XMLNode& node, const std::string& name)
           the name of the thing we're applying it to.
        */
 
-       XMLProperty* prop;
+       XMLProperty * prop;
        XMLNodeList children = node.children();
 
        for (XMLNodeIterator i = children.begin(); i != children.end(); ++i) {
@@ -1008,7 +1020,7 @@ IO::prepare_for_reset (XMLNode& node, const std::string& name)
 int
 IO::make_connections_2X (const XMLNode& node, int /*version*/, bool in)
 {
-       const XMLProperty* prop;
+       XMLProperty const * prop;
 
        /* XXX: bundles ("connections" as was) */
 
@@ -1221,6 +1233,31 @@ IO::set_name (const string& requested_name)
        return r;
 }
 
+void
+IO::set_pretty_name (const std::string& str)
+{
+       if (_pretty_name_prefix == str) {
+               return;
+       }
+       _pretty_name_prefix = str;
+       apply_pretty_name ();
+}
+
+void
+IO::apply_pretty_name ()
+{
+       uint32_t pn = 1;
+       if (_pretty_name_prefix.empty ()) {
+               return;
+       }
+       for (PortSet::iterator i = _ports.begin (); i != _ports.end(); ++i, ++pn) {
+               (*i)->set_pretty_name (string_compose (("%1/%2 %3"),
+                                       _pretty_name_prefix,
+                                       _direction == Output ? _("Out") : _("In"),
+                                       pn));
+       }
+}
+
 framecnt_t
 IO::latency () const
 {
@@ -1559,7 +1596,7 @@ IO::bundle_channel_name (uint32_t c, uint32_t n, DataType t) const
 string
 IO::name_from_state (const XMLNode& node)
 {
-       const XMLProperty* prop;
+       XMLProperty const * prop;
 
        if ((prop = node.property ("name")) != 0) {
                return prop->value();
@@ -1675,7 +1712,7 @@ IO::collect_input (BufferSet& bufs, pframes_t nframes, ChanCount offset)
                }
 
                for ( ; i != _ports.end(*t); ++i, ++b) {
-                       Buffer& bb (i->get_buffer (nframes));
+                       const Buffer& bb (i->get_buffer (nframes));
                        b->read_from (bb, nframes);
                }
        }