From d5127001bb60a8648a277f77e9ae4e8fd5943c9a Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Mon, 16 May 2016 11:08:32 -0400 Subject: move ControllableDescriptor from libpbd to libardour; add support for describing VCAs --- libs/ardour/controllable_descriptor.cc | 177 +++++++++++++++++++++++++++++++++ 1 file changed, 177 insertions(+) create mode 100644 libs/ardour/controllable_descriptor.cc (limited to 'libs/ardour/controllable_descriptor.cc') diff --git a/libs/ardour/controllable_descriptor.cc b/libs/ardour/controllable_descriptor.cc new file mode 100644 index 0000000000..05aa1845a3 --- /dev/null +++ b/libs/ardour/controllable_descriptor.cc @@ -0,0 +1,177 @@ +/* + 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/strsplit.h" +#include "pbd/convert.h" + +#include "ardour/controllable_descriptor.h" + +using namespace std; +using namespace PBD; +using namespace ARDOUR; + +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 path; + split (front, path, '/'); + + if (path.size() < 2) { + return -1; + } + + vector rest; + split (back, rest, ' '); + + if (rest.size() < 1) { + return -1; + } + + if (path[0] == "route" || path[0] == "rid") { + + _top_level_type = PresentationOrderRoute; + + if (rest[0][0] == 'B') { + _banked = true; + _presentation_order = atoi (rest[0].substr (1)); + } else if (rest[0][0] == 'S') { + _top_level_type = SelectionCount; + _banked = true; + _selection_id = atoi (rest[0].substr (1)); + } else if (isdigit (rest[0][0])) { + _banked = false; + _presentation_order = atoi (rest[0]); + } else { + return -1; + } + + } else if (path[0] == "vca") { + + _top_level_type = PresentationOrderVCA; + + if (rest[0][0] == 'B') { + _banked = true; + _presentation_order = atoi (rest[0].substr (1)); + } else if (rest[0][0] == 'S') { + _top_level_type = SelectionCount; + _banked = true; + _selection_id = atoi (rest[0].substr (1)); + } else if (isdigit (rest[0][0])) { + _banked = false; + _presentation_order = 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] == "trim") { + _subtype = Trim; + + } 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] == "panwidth") { + _subtype = PanWidth; + + } else if (path[1] == "pandirection") { + _subtype = PanDirection; + + } 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::presentation_order () const +{ + if (banked()) { + return _presentation_order + _bank_offset; + } + + return _presentation_order; +} + +uint32_t +ControllableDescriptor::selection_id () const +{ + if (banked()) { + return _selection_id + _bank_offset; + } + + return _selection_id; +} + +uint32_t +ControllableDescriptor::target (uint32_t n) const +{ + if (n < _target.size()) { + return _target[n]; + } + + return 0; +} -- cgit v1.2.3