diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2009-12-31 23:43:47 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2009-12-31 23:43:47 +0000 |
commit | 6c717a56e28ebc67bcf041a1ee9887d46700a0e7 (patch) | |
tree | fea823393486d493841d899345cf619ad2f31ca9 /libs/pbd/controllable_descriptor.cc | |
parent | e00506b0ad7a40f8e876542e40ac85ab1979adb5 (diff) |
new PBD::ControllableDescriptor class to encapsulate parsing of binding URIs and speed up lookup at runtime
git-svn-id: svn://localhost/ardour2/branches/3.0@6427 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/pbd/controllable_descriptor.cc')
-rw-r--r-- | libs/pbd/controllable_descriptor.cc | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/libs/pbd/controllable_descriptor.cc b/libs/pbd/controllable_descriptor.cc new file mode 100644 index 0000000000..2f84d706b4 --- /dev/null +++ b/libs/pbd/controllable_descriptor.cc @@ -0,0 +1,150 @@ +/* + Copyright (C) 2009 Paul Davis + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include "pbd/controllable_descriptor.h" +#include "pbd/strsplit.h" +#include "pbd/convert.h" + +using namespace std; +using namespace PBD; + +int +ControllableDescriptor::set (const std::string& str) +{ + string::size_type first_space = str.find_first_of (" "); + + if (first_space == string::npos) { + return -1; + } + + string front = str.substr (0, first_space); + string back = str.substr (first_space); + + vector<string> path; + split (front, path, '/'); + + if (path.size() < 2) { + return -1; + } + + vector<string> rest; + split (back, rest, ' '); + + if (rest.size() < 1) { + return -1; + } + + cerr << "Path: " << endl; + for (vector<string>::iterator x = path.begin(); x != path.end(); ++x) { + cerr << '[' << (*x) << "] "; + } + cerr << endl; + + cerr << "Rest: " << endl; + for (vector<string>::iterator x = rest.begin(); x != rest.end(); ++x) { + cerr << '[' << (*x) << "] "; + } + cerr << endl; + + if (path[0] == "route" || path[0] == "rid") { + + _top_level_type = RemoteControlID; + + if (rest[0][0] == 'B') { + _banked = true; + _rid = atoi (rest[0].substr (1)); + } else if (isdigit (rest[0][0])) { + _banked = false; + _rid = atoi (rest[0]); + } else { + return -1; + } + + } else if (path[0] == "bus" || path[0] == "track") { + + _top_level_type = NamedRoute; + _top_level_name = rest[0]; + } + + if (path[1] == "gain") { + _subtype = Gain; + + } else if (path[1] == "solo") { + _subtype = Solo; + + } else if (path[1] == "mute") { + _subtype = Mute; + + } else if (path[1] == "recenable") { + _subtype = Recenable; + + } else if (path[1] == "balance") { + _subtype = Balance; + + } else if (path[1] == "pan") { + _subtype = Pan; + _target.push_back (atoi (rest[1])); + + } else if (path[1] == "plugin") { + if (path.size() == 3 && rest.size() == 3) { + if (path[2] == "parameter") { + _subtype = PluginParameter; + _target.push_back (atoi (rest[1])); + _target.push_back (atoi (rest[2])); + } else { + return -1; + } + } else { + return -1; + } + } else if (path[1] == "send") { + + if (path.size() == 3 && rest.size() == 2) { + if (path[2] == "gain") { + _subtype = SendGain; + _target.push_back (atoi (rest[1])); + } else { + return -1; + } + } else { + return -1; + } + } + + return 0; +} + +uint32_t +ControllableDescriptor::rid() const +{ + if (banked()) { + return _rid + _bank_offset; + } + + return _rid; +} + +uint32_t +ControllableDescriptor::target (uint32_t n) const +{ + if (n < _target.size()) { + return _target[n]; + } + + return 0; +} |