OSC: tell surfaces using /strip/list they need to rebuild after strip add/remove
[ardour.git] / libs / surfaces / osc / osc.cc
index 3f5721b0d38809989408db95aa71aba920d594c6..e5bcb4ed0a804f5a48b125dd0b070c3dfefbf47d 100644 (file)
@@ -478,7 +478,6 @@ OSC::register_callbacks()
                REGISTER_CALLBACK (serv, "/set_loop_range", "f", set_loop_range);
                REGISTER_CALLBACK (serv, "/set_session_range", "", set_session_range);
                REGISTER_CALLBACK (serv, "/set_session_range", "f", set_session_range);
-               // /toggle_monitor_* not working (comented out)
                REGISTER_CALLBACK (serv, "/toggle_monitor_mute", "", toggle_monitor_mute);
                REGISTER_CALLBACK (serv, "/toggle_monitor_mute", "f", toggle_monitor_mute);
                REGISTER_CALLBACK (serv, "/toggle_monitor_dim", "", toggle_monitor_dim);
@@ -542,6 +541,9 @@ OSC::register_callbacks()
                REGISTER_CALLBACK (serv, "/master/pan_stereo_position", "f", master_set_pan_stereo_position);
                REGISTER_CALLBACK (serv, "/monitor/gain", "f", monitor_set_gain);
                REGISTER_CALLBACK (serv, "/monitor/fader", "f", monitor_set_fader);
+               REGISTER_CALLBACK (serv, "/monitor/mute", "i", monitor_set_mute);
+               REGISTER_CALLBACK (serv, "/monitor/dim", "i", monitor_set_dim);
+               REGISTER_CALLBACK (serv, "/monitor/mono", "i", monitor_set_mono);
 
                // Controls for the Selected strip
                REGISTER_CALLBACK (serv, "/select/recenable", "i", sel_recenable);
@@ -1172,37 +1174,61 @@ OSC::routes_list (lo_message msg)
        if (!session) {
                return;
        }
-       for (int n = 0; n < (int) session->nroutes(); ++n) {
+       OSCSurface *sur = get_surface(get_address (msg));
+       sur->no_clear = true;
 
-               boost::shared_ptr<Route> r = session->get_remote_nth_route (n);
+       for (int n = 0; n < (int) sur->nstrips; ++n) {
 
-               if (r) {
+               boost::shared_ptr<Stripable> s = get_strip (n + 1, get_address (msg));
+
+               if (s) {
+                       // some things need the route
+                       boost::shared_ptr<Route> r = boost::dynamic_pointer_cast<Route> (s);
 
                        lo_message reply = lo_message_new ();
 
-                       if (boost::dynamic_pointer_cast<AudioTrack>(r)) {
+                       if (s->presentation_info().flags() & PresentationInfo::AudioTrack) {
                                lo_message_add_string (reply, "AT");
-                       } else if (boost::dynamic_pointer_cast<MidiTrack>(r)) {
+                       } else if (s->presentation_info().flags() & PresentationInfo::MidiTrack) {
                                lo_message_add_string (reply, "MT");
-                       } else {
-                               lo_message_add_string (reply, "B");
+                       } else if (s->presentation_info().flags() & PresentationInfo::AudioBus) {
+                               // r->feeds (session->master_out()) may make more sense
+                               if (r->direct_feeds_according_to_reality (session->master_out())) {
+                                       // this is a bus
+                                       lo_message_add_string (reply, "B");
+                               } else {
+                                       // this is an Aux out
+                                       lo_message_add_string (reply, "AX");
+                               }
+                       } else if (s->presentation_info().flags() & PresentationInfo::MidiBus) {
+                               lo_message_add_string (reply, "MB");
+                       } else if (s->presentation_info().flags() & PresentationInfo::VCA) {
+                               lo_message_add_string (reply, "V");
                        }
 
-                       lo_message_add_string (reply, r->name().c_str());
-                       lo_message_add_int32 (reply, r->n_inputs().n_audio());
-                       lo_message_add_int32 (reply, r->n_outputs().n_audio());
-                       lo_message_add_int32 (reply, r->muted());
-                       lo_message_add_int32 (reply, r->soloed());
-                       /* XXX Can only use order at this point */
-                       //lo_message_add_int32 (reply, r->presentation_info().order());
-                       // try this instead.
-                       lo_message_add_int32 (reply, get_sid (r, get_address (msg)));
-
-                       if (boost::dynamic_pointer_cast<AudioTrack>(r)
-                                       || boost::dynamic_pointer_cast<MidiTrack>(r)) {
-
-                               boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track>(r);
-                               lo_message_add_int32 (reply, (int32_t) t->rec_enable_control()->get_value());
+                       lo_message_add_string (reply, s->name().c_str());
+                       if (r) {
+                               // routes have inputs and outputs
+                               lo_message_add_int32 (reply, r->n_inputs().n_audio());
+                               lo_message_add_int32 (reply, r->n_outputs().n_audio());
+                       } else {
+                               // non-routes like VCAs don't
+                               lo_message_add_int32 (reply, 0);
+                               lo_message_add_int32 (reply, 0);
+                       }
+                       if (s->mute_control()) {
+                               lo_message_add_int32 (reply, s->mute_control()->get_value());
+                       } else {
+                               lo_message_add_int32 (reply, 0);
+                       }
+                       if (s->solo_control()) {
+                               lo_message_add_int32 (reply, s->solo_control()->get_value());
+                       } else {
+                               lo_message_add_int32 (reply, 0);
+                       }
+                       lo_message_add_int32 (reply, n + 1);
+                       if (s->rec_enable_control()) {
+                               lo_message_add_int32 (reply, s->rec_enable_control()->get_value());
                        }
 
                        //Automatically listen to routes listed
@@ -1219,6 +1245,12 @@ OSC::routes_list (lo_message msg)
        lo_message_add_string (reply, "end_route_list");
        lo_message_add_int64 (reply, session->frame_rate());
        lo_message_add_int64 (reply, session->current_end_frame());
+       if (session->monitor_out()) {
+               // this session has a monitor section
+               lo_message_add_int32 (reply, 1);
+       } else {
+               lo_message_add_int32 (reply, 0);
+       }
 
        lo_send_message (get_address (msg), "#reply", reply);
 
@@ -1474,6 +1506,13 @@ OSC::_recalcbanks ()
                } else {
                        _set_bank (sur->bank, addr);
                }
+               if (sur->no_clear) {
+                       // This surface uses /strip/list tell it routes have changed
+                       lo_message reply;
+                       reply = lo_message_new ();
+                       lo_send_message (addr, "/strip/list", reply);
+                       lo_message_free (reply);
+               }
        }
 }
 
@@ -1808,6 +1847,42 @@ OSC::monitor_set_fader (float position)
        return 0;
 }
 
+int
+OSC::monitor_set_mute (uint32_t state)
+{
+       if (!session) return -1;
+
+       if (session->monitor_out()) {
+               boost::shared_ptr<MonitorProcessor> mon = session->monitor_out()->monitor_control();
+               mon->set_cut_all (state);
+       }
+       return 0;
+}
+
+int
+OSC::monitor_set_dim (uint32_t state)
+{
+       if (!session) return -1;
+
+       if (session->monitor_out()) {
+               boost::shared_ptr<MonitorProcessor> mon = session->monitor_out()->monitor_control();
+               mon->set_dim_all (state);
+       }
+       return 0;
+}
+
+int
+OSC::monitor_set_mono (uint32_t state)
+{
+       if (!session) return -1;
+
+       if (session->monitor_out()) {
+               boost::shared_ptr<MonitorProcessor> mon = session->monitor_out()->monitor_control();
+               mon->set_mono (state);
+       }
+       return 0;
+}
+
 int
 OSC::route_get_sends(lo_message msg) {
        if (!session) {
@@ -2589,6 +2664,7 @@ OSC::route_set_pan_stereo_position (int ssid, float pos, lo_message msg)
        if (s) {
                if(s->pan_azimuth_control()) {
                        s->pan_azimuth_control()->set_value (s->pan_azimuth_control()->interface_to_internal (pos), PBD::Controllable::NoGroup);
+                       return 0;
                }
        }