summaryrefslogtreecommitdiff
path: root/libs/surfaces/osc/osc_route_observer.cc
diff options
context:
space:
mode:
authorCarl Hetherington <carl@carlh.net>2011-01-19 22:05:38 +0000
committerCarl Hetherington <carl@carlh.net>2011-01-19 22:05:38 +0000
commitf8d3b1f7a77cbe7bdb04bbc27f4a85ea0ca3e4e5 (patch)
treec450ed698cc2632025cb4b34cf22d82104359788 /libs/surfaces/osc/osc_route_observer.cc
parentb621ce7306f10803a941a9f1313c96eb5e033899 (diff)
Lincoln's OSC clean-ups (#3716).
git-svn-id: svn://localhost/ardour2/branches/3.0@8552 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/surfaces/osc/osc_route_observer.cc')
-rw-r--r--libs/surfaces/osc/osc_route_observer.cc55
1 files changed, 46 insertions, 9 deletions
diff --git a/libs/surfaces/osc/osc_route_observer.cc b/libs/surfaces/osc/osc_route_observer.cc
index 3a5a835b5e..1433cd146b 100644
--- a/libs/surfaces/osc/osc_route_observer.cc
+++ b/libs/surfaces/osc/osc_route_observer.cc
@@ -17,36 +17,57 @@
*/
-#include <cstdio> /* for sprintf, sigh */
-#include <climits>
-
#include "boost/lambda/lambda.hpp"
-#include "pbd/error.h"
-#include "pbd/xml++.h"
-
#include "ardour/route.h"
+#include "ardour/audio_track.h"
+#include "ardour/midi_track.h"
#include "osc.h"
#include "osc_route_observer.h"
#define ui_bind(f, ...) boost::protect (boost::bind (f, __VA_ARGS__))
+using namespace std;
using namespace sigc;
using namespace PBD;
using namespace ARDOUR;
+using namespace boost;
-OSCRouteObserver::OSCRouteObserver (lo_address a, const std::string& p, boost::shared_ptr<Route> r)
+OSCRouteObserver::OSCRouteObserver (shared_ptr<Route> r, lo_address a)
: _route (r)
{
addr = lo_address_new (lo_address_get_hostname(a) , lo_address_get_port(a));
- _route->PropertyChanged.connect (changed_connection, MISSING_INVALIDATOR, ui_bind (&OSCRouteObserver::name_changed, this, boost::lambda::_1), OSC::instance());
+
+ _route->PropertyChanged.connect (name_changed_connection, MISSING_INVALIDATOR, ui_bind (&OSCRouteObserver::name_changed, this, boost::lambda::_1), OSC::instance());
+
+ if (dynamic_pointer_cast<AudioTrack>(_route) || dynamic_pointer_cast<MidiTrack>(_route)) {
+
+ shared_ptr<Track> track = dynamic_pointer_cast<Track>(r);
+ shared_ptr<Controllable> rec_controllable = dynamic_pointer_cast<Controllable>(track->rec_enable_control());
+
+ rec_controllable->Changed.connect (rec_changed_connection, MISSING_INVALIDATOR, bind (&OSCRouteObserver::send_change_message, this, X_("/route/rec"), track->rec_enable_control()), OSC::instance());
+ }
+
+ shared_ptr<Controllable> mute_controllable = dynamic_pointer_cast<Controllable>(_route->mute_control());
+ mute_controllable->Changed.connect (mute_changed_connection, MISSING_INVALIDATOR, bind (&OSCRouteObserver::send_change_message, this, X_("/route/mute"), _route->mute_control()), OSC::instance());
+
+ shared_ptr<Controllable> solo_controllable = dynamic_pointer_cast<Controllable>(_route->solo_control());
+ solo_controllable->Changed.connect (solo_changed_connection, MISSING_INVALIDATOR, bind (&OSCRouteObserver::send_change_message, this, X_("/route/solo"), _route->solo_control()), OSC::instance());
+
+ shared_ptr<Controllable> gain_controllable = dynamic_pointer_cast<Controllable>(_route->gain_control());
+ gain_controllable->Changed.connect (gain_changed_connection, MISSING_INVALIDATOR, bind (&OSCRouteObserver::send_change_message, this, X_("/route/gain"), _route->gain_control()), OSC::instance());
}
OSCRouteObserver::~OSCRouteObserver ()
{
- changed_connection.disconnect();
+ name_changed_connection.disconnect();
+ rec_changed_connection.disconnect();
+ mute_changed_connection.disconnect();
+ solo_changed_connection.disconnect();
+ gain_changed_connection.disconnect();
+
lo_address_free (addr);
}
@@ -69,3 +90,19 @@ OSCRouteObserver::name_changed (const PBD::PropertyChange& what_changed)
lo_send_message (addr, "/route/name", msg);
lo_message_free (msg);
}
+
+void
+OSCRouteObserver::send_change_message (string path, shared_ptr<Controllable> controllable)
+{
+ lo_message msg = lo_message_new ();
+
+ lo_message_add_int32 (msg, _route->remote_control_id());
+ lo_message_add_float (msg, (float) controllable->get_value());
+
+ /* XXX thread issues */
+
+ //std::cerr << "ORC: send " << path << " = " << controllable->get_value() << std::endl;
+
+ lo_send_message (addr, path.c_str(), msg);
+ lo_message_free (msg);
+}