fix typos in d442190b
[ardour.git] / libs / pbd / controllable_descriptor.cc
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
19 #include "pbd/controllable_descriptor.h"
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 }