cout << "remote id " << route->remote_control_id() << " connecting " << route->name() << " to " << strip.name() << " with port " << port_for_id(i) << endl;
#endif
route_table[i] = route;
- RouteSignal * rs = new RouteSignal( *route, *this, strip, port_for_id(i) );
+ RouteSignal * rs = new RouteSignal (route, *this, strip, port_for_id(i) );
route_signals.push_back( rs );
// update strip from route
rs->notify_all();
shared_ptr<Route> MackieControlProtocol::master_route()
{
- return session->master_out ();
+ boost::shared_ptr<IO> mo = session->master_out ();
+ return boost::dynamic_pointer_cast<Route>(mo);
}
Strip & MackieControlProtocol::master_strip()
try
{
Button & button = route_signal->strip().solo();
- route_signal->port().write( builder.build_led( button, route_signal->route().soloed() ) );
+ route_signal->port().write( builder.build_led( button, route_signal->route()->soloed() ) );
}
catch( exception & e )
{
try
{
Button & button = route_signal->strip().mute();
- route_signal->port().write( builder.build_led( button, route_signal->route().muted() ) );
+ route_signal->port().write( builder.build_led( button, route_signal->route()->muted() ) );
}
catch( exception & e )
{
try
{
Button & button = route_signal->strip().recenable();
- route_signal->port().write( builder.build_led( button, route_signal->route().record_enabled() ) );
+ route_signal->port().write( builder.build_led( button, route_signal->route()->record_enabled() ) );
}
catch( exception & e )
{
Fader & fader = route_signal->strip().gain();
if ( !fader.in_use() )
{
- float gain_value = route_signal->route().gain_control().get_value();
+ float gain_value = route_signal->route()->gain_control().get_value();
// check that something has actually changed
if ( force_update || gain_value != route_signal->last_gain_written() )
{
if ( !strip.is_master() )
{
string line1;
- string fullname = route_signal->route().name();
+ string fullname = route_signal->route()->name();
if ( fullname.length() <= 6 )
{
try
{
Pot & pot = route_signal->strip().vpot();
- const Panner & panner = route_signal->route().panner();
+ const Panner & panner = route_signal->route()->panner();
if ( panner.size() == 1 || ( panner.size() == 2 && panner.linked() ) )
{
float pos;
- route_signal->route().panner()[0]->get_effective_position( pos );
+ route_signal->route()->panner()[0]->get_effective_position( pos );
// cache the MidiByteArray here, because the mackie led control is much lower
// resolution than the panner control. So we save lots of byte
// TODO handle plugin automation polling
void MackieControlProtocol::update_automation( RouteSignal & rs )
{
- ARDOUR::AutoState gain_state = rs.route().gain_automation_state();
+ ARDOUR::AutoState gain_state = rs.route()->gain_automation_state();
if ( gain_state == Touch || gain_state == Play )
{
notify_gain_changed( &rs, false );
}
- ARDOUR::AutoState panner_state = rs.route().panner().automation_state();
+ ARDOUR::AutoState panner_state = rs.route()->panner().automation_state();
if ( panner_state == Touch || panner_state == Play )
{
notify_panner_changed( &rs, false );
#include <stdexcept>
+using namespace ARDOUR;
using namespace Mackie;
using namespace std;
back_insert_iterator<Connections> cins = back_inserter( _connections );
if ( _strip.has_solo() )
- cins = _route.solo_control().Changed.connect( sigc::bind ( mem_fun ( _mcp, &MackieControlProtocol::notify_solo_changed ), this ) );
+ cins = _route->solo_control().Changed.connect( sigc::bind ( mem_fun ( _mcp, &MackieControlProtocol::notify_solo_changed ), this ) );
if ( _strip.has_mute() )
- cins = _route.mute_control().Changed.connect( sigc::bind ( mem_fun ( _mcp, &MackieControlProtocol::notify_mute_changed ), this ) );
+ cins = _route->mute_control().Changed.connect( sigc::bind ( mem_fun ( _mcp, &MackieControlProtocol::notify_mute_changed ), this ) );
if ( _strip.has_gain() )
- cins = _route.gain_control().Changed.connect( sigc::bind ( mem_fun ( _mcp, &MackieControlProtocol::notify_gain_changed ), this, true ) );
+ cins = _route->gain_control().Changed.connect( sigc::bind ( mem_fun ( _mcp, &MackieControlProtocol::notify_gain_changed ), this, true ) );
- cins = _route.name_changed.connect( sigc::bind ( mem_fun ( _mcp, &MackieControlProtocol::notify_name_changed ), this ) );
+ cins = _route->name_changed.connect( sigc::bind ( mem_fun ( _mcp, &MackieControlProtocol::notify_name_changed ), this ) );
- cins = _route.panner().Changed.connect( sigc::bind ( mem_fun ( _mcp, &MackieControlProtocol::notify_panner_changed ), this, true ) );
- for ( unsigned int i = 0; i < _route.panner().size(); ++i )
+ cins = _route->panner().Changed.connect( sigc::bind ( mem_fun ( _mcp, &MackieControlProtocol::notify_panner_changed ), this, true ) );
+ for ( unsigned int i = 0; i < _route->panner().size(); ++i )
{
- cins = _route.panner()[i]->Changed.connect( sigc::bind ( mem_fun ( _mcp, &MackieControlProtocol::notify_panner_changed ), this, true ) );
+ cins = _route->panner()[i]->Changed.connect( sigc::bind ( mem_fun ( _mcp, &MackieControlProtocol::notify_panner_changed ), this, true ) );
}
- try
- {
- cins = dynamic_cast<ARDOUR::Track&>( _route )
- .rec_enable_control()
- .Changed
- .connect( sigc::bind ( mem_fun ( _mcp, &MackieControlProtocol::notify_record_enable_changed ), this ) )
- ;
- }
- catch ( std::bad_cast & )
- {
- // this should catch the dynamic_cast to Track, if what we're working
- // with can't be record-enabled
+ boost::shared_ptr<Track> trk = boost::dynamic_pointer_cast<ARDOUR::Track>(_route);
+ if (trk) {
+ cins = trk->rec_enable_control() .Changed .connect( sigc::bind ( mem_fun ( _mcp, &MackieControlProtocol::notify_record_enable_changed ), this));
}
-
+
// TODO this works when a currently-banked route is made inactive, but not
// when a route is activated which should be currently banked.
- cins = _route.active_changed.connect( sigc::bind ( mem_fun ( _mcp, &MackieControlProtocol::notify_active_changed ), this ) );
+ cins = _route->active_changed.connect( sigc::bind ( mem_fun ( _mcp, &MackieControlProtocol::notify_active_changed ), this ) );
// TODO
// SelectedChanged
#define route_signal_h
#include <sigc++/sigc++.h>
+#include <boost/shared_ptr.hpp>
#include <vector>
class RouteSignal
{
public:
- RouteSignal( ARDOUR::Route & route, MackieControlProtocol & mcp, Strip & strip, SurfacePort & port )
+ RouteSignal(boost::shared_ptr<ARDOUR::Route> route, MackieControlProtocol & mcp, Strip & strip, SurfacePort & port )
: _route( route ), _mcp( mcp ), _strip( strip ), _port( port ), _last_gain_written(0.0)
{
connect();
// call all signal handlers manually
void notify_all();
- const ARDOUR::Route & route() const { return _route; }
+ boost::shared_ptr<const ARDOUR::Route> route() const { return _route; }
Strip & strip() { return _strip; }
SurfacePort & port() { return _port; }
void last_pan_written( const MidiByteArray & other ) { _last_pan_written = other; }
private:
- ARDOUR::Route & _route;
+ boost::shared_ptr<ARDOUR::Route> _route;
MackieControlProtocol & _mcp;
Strip & _strip;
SurfacePort & _port;