+lo_address
+OSC::get_address (lo_message msg)
+{
+ if (address_only) {
+ lo_address addr = lo_message_get_source (msg);
+ string host = lo_address_get_hostname (addr);
+ int protocol = lo_address_get_protocol (addr);
+ return lo_address_new_with_proto (protocol, host.c_str(), remote_port.c_str());
+ } else {
+ return lo_message_get_source (msg);
+ }
+}
+
+int
+OSC::refresh_surface (lo_message msg)
+{
+ if (address_only) {
+ // get rid of all surfaces and observers.
+ for (RouteObservers::iterator x = route_observers.begin(); x != route_observers.end();) {
+
+ OSCRouteObserver* rc;
+
+ if ((rc = dynamic_cast<OSCRouteObserver*>(*x)) != 0) {
+ delete *x;
+ x = route_observers.erase (x);
+ } else {
+ ++x;
+ }
+ }
+ // Should maybe do global_observers too
+ for (GlobalObservers::iterator x = global_observers.begin(); x != global_observers.end();) {
+
+ OSCGlobalObserver* gc;
+
+ if ((gc = dynamic_cast<OSCGlobalObserver*>(*x)) != 0) {
+ delete *x;
+ x = global_observers.erase (x);
+ } else {
+ ++x;
+ }
+ }
+ // delete select observers
+ for (uint32_t it = 0; it < _surface.size(); ++it) {
+ OSCSurface* sur = &_surface[it];
+ OSCSelectObserver* so;
+ if ((so = dynamic_cast<OSCSelectObserver*>(sur->sel_obs)) != 0) {
+ delete so;
+ }
+ }
+ // add one from msg + port - Nope get_surface will do that for us
+ // but we do want to clear out surfaces
+ _surface.clear();
+ }
+ OSCSurface *s = get_surface(get_address (msg));
+ // restart all observers
+ set_surface (s->bank_size, (uint32_t) s->strip_types.to_ulong(), (uint32_t) s->feedback.to_ulong(), (uint32_t) s->gainmode, msg);
+ return 0;
+}
+
+