From 0613ddd1f9b3ccd7de086738aab874c4153a20cc Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Mon, 28 Sep 2015 14:49:49 -0400 Subject: [PATCH] better more reliable checks on renamed, newly created and imported track/bus names --- libs/ardour/ardour/ardour.h | 1 + libs/ardour/globals.cc | 21 +++++++++++++++++++++ libs/ardour/route.cc | 2 +- libs/ardour/session.cc | 27 ++++++++------------------- 4 files changed, 31 insertions(+), 20 deletions(-) diff --git a/libs/ardour/ardour/ardour.h b/libs/ardour/ardour/ardour.h index 8be99a4aba..25e2518c83 100644 --- a/libs/ardour/ardour/ardour.h +++ b/libs/ardour/ardour/ardour.h @@ -52,6 +52,7 @@ namespace ARDOUR { extern LIBARDOUR_API PBD::Signal1 PluginScanTimeout; extern LIBARDOUR_API PBD::Signal0 GUIIdle; extern LIBARDOUR_API PBD::Signal3 CopyConfigurationFiles; + extern LIBARDOUR_API std::vector reserved_io_names; /** * @param with_vst true to enable VST Support diff --git a/libs/ardour/globals.cc b/libs/ardour/globals.cc index a76fae4fee..9f512c1ec0 100644 --- a/libs/ardour/globals.cc +++ b/libs/ardour/globals.cc @@ -142,6 +142,8 @@ PBD::Signal1 ARDOUR::PluginScanTimeout; PBD::Signal0 ARDOUR::GUIIdle; PBD::Signal3 ARDOUR::CopyConfigurationFiles; +std::vector 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; diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc index 29aa5b8a6a..6b7929bf82 100644 --- a/libs/ardour/route.cc +++ b/libs/ardour/route.cc @@ -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; diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index dfcb8cfd92..496afad83b 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -2196,30 +2196,13 @@ Session::resort_routes_using (boost::shared_ptr 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::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 r = routes.reader (); + for (vector::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;