fix dialog message shown when a backup of an old session file is made
[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 (rest[0][0] == 'S') {
60                         _top_level_type = SelectionCount;
61                         _banked = true;
62                         _selection_id = atoi (rest[0].substr (1));
63                 } else if (isdigit (rest[0][0])) {
64                         _banked = false;
65                         _rid = atoi (rest[0]);
66                 } else {
67                         return -1;
68                 }
69
70         } else if (path[0] == "bus" || path[0] == "track") {
71
72                 _top_level_type = NamedRoute;
73                 _top_level_name = rest[0];
74         }
75
76         if (path[1] == "gain") {
77                 _subtype = Gain;
78
79         } else if (path[1] == "trim") {
80                 _subtype = Trim;
81
82         } else if (path[1] == "solo") {
83                 _subtype = Solo;
84
85         } else if (path[1] == "mute") {
86                 _subtype = Mute;
87
88         } else if (path[1] == "recenable") {
89                 _subtype = Recenable;
90
91         } else if (path[1] == "balance") {
92                 _subtype = Balance;
93
94         } else if (path[1] == "panwidth") {
95                 _subtype = PanWidth;
96
97         } else if (path[1] == "pandirection") {
98                 _subtype = PanDirection;
99
100         } else if (path[1] == "plugin") {
101                 if (path.size() == 3 && rest.size() == 3) {
102                         if (path[2] == "parameter") {
103                                 _subtype = PluginParameter;
104                                 _target.push_back (atoi (rest[1]));
105                                 _target.push_back (atoi (rest[2]));
106                         } else {
107                                 return -1;
108                         }
109                 } else {
110                         return -1;
111                 }
112         } else if (path[1] == "send") {
113
114                 if (path.size() == 3 && rest.size() == 2) {
115                         if (path[2] == "gain") {
116                                 _subtype = SendGain;
117                                 _target.push_back (atoi (rest[1]));
118                         } else {
119                                 return -1;
120                         }
121                 } else {
122                         return -1;
123                 }
124         }
125
126         return 0;
127 }
128
129 uint32_t
130 ControllableDescriptor::rid () const
131 {
132         if (banked()) {
133                 return _rid + _bank_offset;
134         }
135
136         return _rid;
137 }
138
139 uint32_t
140 ControllableDescriptor::selection_id () const
141 {
142         if (banked()) {
143                 return _selection_id + _bank_offset;
144         }
145
146         return _selection_id;
147 }
148
149 uint32_t
150 ControllableDescriptor::target (uint32_t n) const
151 {
152         if (n < _target.size()) {
153                 return _target[n];
154         }
155
156         return 0;
157 }