provide limited momentary note on/off MIDI binding option; remove some debugging...
[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] == "solo") {
76                 _subtype = Solo;
77
78         } else if (path[1] == "mute") {
79                 _subtype = Mute;
80
81         } else if (path[1] == "recenable") {
82                 _subtype = Recenable;
83
84         } else if (path[1] == "balance") {
85                 _subtype = Balance;
86
87         } else if (path[1] == "pan") {
88                 _subtype = Pan;
89                 _target.push_back (atoi (rest[1]));
90
91         } else if (path[1] == "plugin") {
92                 if (path.size() == 3 && rest.size() == 3) {
93                         if (path[2] == "parameter") {
94                                 _subtype = PluginParameter;
95                                 _target.push_back (atoi (rest[1]));
96                                 _target.push_back (atoi (rest[2]));
97                         } else {
98                                 return -1;
99                         }
100                 } else {
101                         return -1;
102                 }
103         } else if (path[1] == "send") {
104                 
105                 if (path.size() == 3 && rest.size() == 2) {
106                         if (path[2] == "gain") {
107                                 _subtype = SendGain;
108                                 _target.push_back (atoi (rest[1]));
109                         } else {
110                                 return -1;
111                         }
112                 } else {
113                         return -1;
114                 }
115         }
116         
117         return 0;
118 }
119
120 uint32_t
121 ControllableDescriptor::rid() const
122 {
123         if (banked()) {
124                 return _rid + _bank_offset;
125         }               
126
127         return _rid;
128 }
129
130 uint32_t
131 ControllableDescriptor::target (uint32_t n) const
132 {
133         if (n < _target.size()) {
134                 return _target[n];
135         } 
136         
137         return 0;
138 }