ardour
controllable_descriptor.cc
Go to the documentation of this file.
1 /*
2  Copyright (C) 2009 Paul Davis
3 
4  This program is free software; you can redistribute it and/or modify
5  it under the terms of the GNU General Public License as published by
6  the Free Software Foundation; either version 2 of the License, or
7  (at your option) any later version.
8 
9  This program is distributed in the hope that it will be useful,
10  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  GNU General Public License for more details.
13 
14  You should have received a copy of the GNU General Public License
15  along with this program; if not, write to the Free Software
16  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17 */
18 
20 #include "pbd/strsplit.h"
21 #include "pbd/convert.h"
22 
23 using namespace std;
24 using namespace PBD;
25 
26 int
27 ControllableDescriptor::set (const std::string& str)
28 {
29  string::size_type first_space = str.find_first_of (" ");
30 
31  if (first_space == string::npos) {
32  return -1;
33  }
34 
35  string front = str.substr (0, first_space);
36  string back = str.substr (first_space);
37 
38  vector<string> path;
39  split (front, path, '/');
40 
41  if (path.size() < 2) {
42  return -1;
43  }
44 
45  vector<string> rest;
46  split (back, rest, ' ');
47 
48  if (rest.size() < 1) {
49  return -1;
50  }
51 
52  if (path[0] == "route" || path[0] == "rid") {
53 
54  _top_level_type = RemoteControlID;
55 
56  if (rest[0][0] == 'B') {
57  _banked = true;
58  _rid = atoi (rest[0].substr (1));
59  } else if (isdigit (rest[0][0])) {
60  _banked = false;
61  _rid = atoi (rest[0]);
62  } else {
63  return -1;
64  }
65 
66  } else if (path[0] == "bus" || path[0] == "track") {
67 
68  _top_level_type = NamedRoute;
69  _top_level_name = rest[0];
70  }
71 
72  if (path[1] == "gain") {
73  _subtype = Gain;
74 
75  } else if (path[1] == "trim") {
76  _subtype = Trim;
77 
78  } else if (path[1] == "solo") {
79  _subtype = Solo;
80 
81  } else if (path[1] == "mute") {
82  _subtype = Mute;
83 
84  } else if (path[1] == "recenable") {
85  _subtype = Recenable;
86 
87  } else if (path[1] == "balance") {
88  _subtype = Balance;
89 
90  } else if (path[1] == "panwidth") {
91  _subtype = PanWidth;
92 
93  } else if (path[1] == "pandirection") {
94  _subtype = PanDirection;
95 
96  } else if (path[1] == "plugin") {
97  if (path.size() == 3 && rest.size() == 3) {
98  if (path[2] == "parameter") {
99  _subtype = PluginParameter;
100  _target.push_back (atoi (rest[1]));
101  _target.push_back (atoi (rest[2]));
102  } else {
103  return -1;
104  }
105  } else {
106  return -1;
107  }
108  } else if (path[1] == "send") {
109 
110  if (path.size() == 3 && rest.size() == 2) {
111  if (path[2] == "gain") {
112  _subtype = SendGain;
113  _target.push_back (atoi (rest[1]));
114  } else {
115  return -1;
116  }
117  } else {
118  return -1;
119  }
120  }
121 
122  return 0;
123 }
124 
125 uint32_t
126 ControllableDescriptor::rid() const
127 {
128  if (banked()) {
129  return _rid + _bank_offset;
130  }
131 
132  return _rid;
133 }
134 
135 uint32_t
136 ControllableDescriptor::target (uint32_t n) const
137 {
138  if (n < _target.size()) {
139  return _target[n];
140  }
141 
142  return 0;
143 }
int atoi(const string &s)
Definition: convert.cc:140
LIBPBD_API void split(std::string, std::vector< std::string > &, char)
Definition: Beats.hpp:239
static void rest(PianoKeyboard *pk)
LIBARDOUR_API uint64_t Solo
Definition: debug.cc:48
Definition: debug.h:30