better more reliable checks on renamed, newly created and imported track/bus names
authorPaul Davis <paul@linuxaudiosystems.com>
Mon, 28 Sep 2015 18:49:49 +0000 (14:49 -0400)
committerPaul Davis <paul@linuxaudiosystems.com>
Mon, 28 Sep 2015 21:42:11 +0000 (17:42 -0400)
libs/ardour/ardour/ardour.h
libs/ardour/globals.cc
libs/ardour/route.cc
libs/ardour/session.cc

index 8be99a4aba86b2adf93b5aef6a18f3c09dcc202e..25e2518c8311a2f7c37062ae57b0ecdf5acdb79b 100644 (file)
@@ -52,6 +52,7 @@ namespace ARDOUR {
        extern LIBARDOUR_API PBD::Signal1<void,int> PluginScanTimeout;
        extern LIBARDOUR_API PBD::Signal0<void> GUIIdle;
        extern LIBARDOUR_API PBD::Signal3<bool,std::string,std::string,int> CopyConfigurationFiles;
+       extern LIBARDOUR_API std::vector<std::string> reserved_io_names;
 
        /**
         * @param with_vst true to enable VST Support
index a76fae4feed8feed1974ffef6f8c1b7353bac6bf..9f512c1ec0d70c8f2682c058aca4b5d01e22361b 100644 (file)
@@ -142,6 +142,8 @@ PBD::Signal1<void,int> ARDOUR::PluginScanTimeout;
 PBD::Signal0<void> ARDOUR::GUIIdle;
 PBD::Signal3<bool,std::string,std::string,int> ARDOUR::CopyConfigurationFiles;
 
+std::vector<std::string> ARDOUR::reserved_io_names;
+
 static bool have_old_configuration_files = false;
 
 namespace ARDOUR {
@@ -506,6 +508,25 @@ ARDOUR::init (bool use_windows_vst, bool try_optimization, const char* localedir
 
        ARDOUR::AudioEngine::create ();
 
+       /* it is unfortunate that we need to include reserved names here that
+          refer to control surfaces. But there's no way to ensure a complete
+          lack of collisions without doing this, since the control surface
+          support may not even be active. Without adding an API to control 
+          surface support that would list their port names, we do have to
+          list them here.
+       */
+
+       char const * reserved[] = {
+               _("Monitor"),
+               _("Master"),
+               _("Control"),
+               _("Click"),
+               _("Mackie"),
+               0
+       };
+
+       reserved_io_names = I18N (reserved);
+       
        libardour_initialized = true;
 
        return true;
index 29aa5b8a6ab9a5cd6dfbba55b8961e93d0cbc588..6b7929bf82e7ff01d94c7c95a380d564f900875d 100644 (file)
@@ -365,7 +365,7 @@ Route::ensure_track_or_route_name(string name, Session &session)
        string newname = name;
 
        while (!session.io_name_is_legal (newname)) {
-               newname = bump_name_once (newname, '.');
+               newname = bump_name_once (newname, ' ');
        }
 
        return newname;
index dfcb8cfd921e31dd3d8d60134d7fd5e8bb962cb6..496afad83b3457470d121c809dcb24f7878b1901 100644 (file)
@@ -2196,30 +2196,13 @@ Session::resort_routes_using (boost::shared_ptr<RouteList> r)
 bool
 Session::find_route_name (string const & base, uint32_t& id, string& name, bool definitely_add_number)
 {
-       /* it is unfortunate that we need to include reserved names here that
-          refer to control surfaces. But there's no way to ensure a complete
-          lack of collisions without doing this, since the control surface
-          support may not even be active. Without adding an API to control 
-          surface support that would list their port names, we do have to
-          list them here.
-       */
-
-       char const * const reserved[] = {
-               _("Monitor"),
-               _("Master"),
-               _("Control"),
-               _("Click"),
-               _("Mackie"),
-               0
-       };
-       
        /* the base may conflict with ports that do not belong to existing
           routes, but hidden objects like the click track. So check port names
           before anything else.
        */
        
-       for (int n = 0; reserved[n]; ++n) {
-               if (base == reserved[n]) {
+       for (vector<string>::const_iterator reserved = reserved_io_names.begin(); reserved != reserved_io_names.end(); ++reserved) {
+               if (base == *reserved) {
                        definitely_add_number = true;
                        if (id < 1) {
                                id = 1;
@@ -3875,6 +3858,12 @@ Session::io_name_is_legal (const std::string& name)
 {
        boost::shared_ptr<RouteList> r = routes.reader ();
 
+       for (vector<string>::const_iterator reserved = reserved_io_names.begin(); reserved != reserved_io_names.end(); ++reserved) {
+               if (name == *reserved) {
+                       return false;
+               }
+       }
+       
        for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
                if ((*i)->name() == name) {
                        return false;