2 Copyright (C) 2006 Paul Davis
4 This program is free software; you can redistribute it
5 and/or modify it under the terms of the GNU Lesser
6 General Public License as published by the Free Software
7 Foundation; either version 2 of the License, or (at your
8 option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 #include "pbd/error.h"
23 #include "ardour/session.h"
24 #include "ardour/route.h"
25 #include "ardour/audio_track.h"
26 #include "ardour/meter.h"
27 #include "ardour/amp.h"
28 #include "control_protocol/control_protocol.h"
30 using namespace ARDOUR
;
34 Signal0
<void> ControlProtocol::ZoomToSession
;
35 Signal0
<void> ControlProtocol::ZoomOut
;
36 Signal0
<void> ControlProtocol::ZoomIn
;
37 Signal0
<void> ControlProtocol::Enter
;
38 Signal1
<void,float> ControlProtocol::ScrollTimeline
;
39 Signal1
<void,uint32_t> ControlProtocol::SelectByRID
;
41 ControlProtocol::ControlProtocol (Session
& s
, string str
, EventLoop
* evloop
)
46 _own_event_loop
= false;
49 _own_event_loop
= true;
50 fatal
<< "programming error: cannot create control protocols without an existing event loop (yet)" << endmsg
;
56 session
->RouteAdded
.connect (*this, MISSING_INVALIDATOR
, boost::protect (boost::bind (&ControlProtocol::add_strip
, this, _1
)), _event_loop
);
59 ControlProtocol::~ControlProtocol ()
64 ControlProtocol::add_strip (ARDOUR::RouteList
&)
70 ControlProtocol::next_track (uint32_t initial_id
)
72 uint32_t limit
= session
->nroutes();
73 boost::shared_ptr
<Route
> cr
= route_table
[0];
77 id
= cr
->remote_control_id ();
89 if ((cr
= session
->route_by_remote_id (id
)) != 0) {
97 while (id
!= initial_id
) {
98 if ((cr
= session
->route_by_remote_id (id
)) != 0) {
109 ControlProtocol::prev_track (uint32_t initial_id
)
111 uint32_t limit
= session
->nroutes();
112 boost::shared_ptr
<Route
> cr
= route_table
[0];
116 id
= cr
->remote_control_id ();
128 if ((cr
= session
->route_by_remote_id (id
)) != 0) {
136 while (i
> initial_id
) {
137 if ((cr
= session
->route_by_remote_id (i
)) != 0) {
149 ControlProtocol::set_route_table_size (uint32_t size
)
151 while (route_table
.size() < size
) {
152 route_table
.push_back (boost::shared_ptr
<Route
> ((Route
*) 0));
157 ControlProtocol::set_route_table (uint32_t table_index
, boost::shared_ptr
<ARDOUR::Route
> r
)
159 if (table_index
>= route_table
.size()) {
163 route_table
[table_index
] = r
;
165 // XXX SHAREDPTR need to handle r->GoingAway
169 ControlProtocol::set_route_table (uint32_t table_index
, uint32_t remote_control_id
)
171 boost::shared_ptr
<Route
> r
= session
->route_by_remote_id (remote_control_id
);
177 set_route_table (table_index
, r
);
183 ControlProtocol::route_set_rec_enable (uint32_t table_index
, bool yn
)
185 if (table_index
> route_table
.size()) {
189 boost::shared_ptr
<Route
> r
= route_table
[table_index
];
191 boost::shared_ptr
<AudioTrack
> at
= boost::dynamic_pointer_cast
<AudioTrack
>(r
);
194 at
->set_record_enabled (yn
, this);
199 ControlProtocol::route_get_rec_enable (uint32_t table_index
)
201 if (table_index
> route_table
.size()) {
205 boost::shared_ptr
<Route
> r
= route_table
[table_index
];
207 boost::shared_ptr
<AudioTrack
> at
= boost::dynamic_pointer_cast
<AudioTrack
>(r
);
210 return at
->record_enabled ();
218 ControlProtocol::route_get_gain (uint32_t table_index
)
220 if (table_index
> route_table
.size()) {
224 boost::shared_ptr
<Route
> r
= route_table
[table_index
];
230 return r
->amp()->gain ();
234 ControlProtocol::route_set_gain (uint32_t table_index
, float gain
)
236 if (table_index
> route_table
.size()) {
240 boost::shared_ptr
<Route
> r
= route_table
[table_index
];
243 r
->set_gain (gain
, this);
248 ControlProtocol::route_get_effective_gain (uint32_t table_index
)
250 if (table_index
> route_table
.size()) {
254 boost::shared_ptr
<Route
> r
= route_table
[table_index
];
260 return r
->amp()->gain_control()->get_value();
265 ControlProtocol::route_get_peak_input_power (uint32_t table_index
, uint32_t which_input
)
267 if (table_index
> route_table
.size()) {
271 boost::shared_ptr
<Route
> r
= route_table
[table_index
];
277 return r
->peak_meter().peak_power (which_input
);
282 ControlProtocol::route_get_muted (uint32_t table_index
)
284 if (table_index
> route_table
.size()) {
288 boost::shared_ptr
<Route
> r
= route_table
[table_index
];
298 ControlProtocol::route_set_muted (uint32_t table_index
, bool yn
)
300 if (table_index
> route_table
.size()) {
304 boost::shared_ptr
<Route
> r
= route_table
[table_index
];
307 r
->set_mute (yn
, this);
313 ControlProtocol::route_get_soloed (uint32_t table_index
)
315 if (table_index
> route_table
.size()) {
319 boost::shared_ptr
<Route
> r
= route_table
[table_index
];
329 ControlProtocol::route_set_soloed (uint32_t table_index
, bool yn
)
331 if (table_index
> route_table
.size()) {
335 boost::shared_ptr
<Route
> r
= route_table
[table_index
];
338 r
->set_solo (yn
, this);
343 ControlProtocol:: route_get_name (uint32_t table_index
)
345 if (table_index
> route_table
.size()) {
349 boost::shared_ptr
<Route
> r
= route_table
[table_index
];
358 list
<boost::shared_ptr
<Bundle
> >
359 ControlProtocol::bundles ()
361 return list
<boost::shared_ptr
<Bundle
> > ();