OSC: Add global soloing indicator/cancel
authorLen Ovens <len@ovenwerks.net>
Wed, 13 Jul 2016 16:56:35 +0000 (09:56 -0700)
committerLen Ovens <len@ovenwerks.net>
Wed, 13 Jul 2016 16:56:35 +0000 (09:56 -0700)
libs/surfaces/osc/osc.cc
libs/surfaces/osc/osc.h
libs/surfaces/osc/osc_global_observer.cc
libs/surfaces/osc/osc_global_observer.h

index 77a222d2c4bc1713476b9202e24609aa61e10e2a..0f2dee2893d9d593723b1f19ef2a728944024525 100644 (file)
@@ -443,6 +443,7 @@ OSC::register_callbacks()
                REGISTER_CALLBACK (serv, "/toggle_all_rec_enables", "f", toggle_all_rec_enables);
                REGISTER_CALLBACK (serv, "/all_tracks_rec_in", "f", all_tracks_rec_in);
                REGISTER_CALLBACK (serv, "/all_tracks_rec_out", "f", all_tracks_rec_out);
+               REGISTER_CALLBACK (serv, "/cancel_all_solos", "f", cancel_all_solos);
                REGISTER_CALLBACK (serv, "/remove_marker", "", remove_marker_at_playhead);
                REGISTER_CALLBACK (serv, "/remove_marker", "f", remove_marker_at_playhead);
                REGISTER_CALLBACK (serv, "/jump_bars", "f", jump_by_bars);
@@ -1176,6 +1177,13 @@ OSC::routes_list (lo_message msg)
        lo_message_free (reply);
 }
 
+int
+OSC::cancel_all_solos ()
+{
+       session->clear_all_solo_state (session->get_routes());
+       return 0;
+}
+
 int
 OSC::set_surface (uint32_t b_size, uint32_t strips, uint32_t fb, uint32_t gm, lo_message msg)
 {
index 2bbac56a78bf867c0c1b46e8b23e0b9c53dc02d7..a5f2bee291aa45b6ac0842db772b9ee980a4394e 100644 (file)
@@ -245,6 +245,7 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
        PATH_CALLBACK(toggle_all_rec_enables);
        PATH_CALLBACK(all_tracks_rec_in);
        PATH_CALLBACK(all_tracks_rec_out);
+       PATH_CALLBACK(cancel_all_solos);
        PATH_CALLBACK(remove_marker_at_playhead);
        PATH_CALLBACK(mark_in);
        PATH_CALLBACK(mark_out);
@@ -523,6 +524,7 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
        void notify_vca_added (ARDOUR::VCAList &);
 
        void update_clock ();
+       int cancel_all_solos ();
        bool periodic (void);
        sigc::connection periodic_connection;
        PBD::ScopedConnectionList session_connections;
index 68e18d5141f33108c0a0f09cb6f444cae6c84a66..fef3a92619b4f052cd2573ad0d5c09bc0c602e65 100644 (file)
@@ -115,6 +115,8 @@ OSCGlobalObserver::OSCGlobalObserver (Session& s, lo_address a, uint32_t gm, std
                // session feedback
                session->StateSaved.connect(session_connections, MISSING_INVALIDATOR, boost::bind (&OSCGlobalObserver::send_session_saved, this, _1), OSC::instance());
                send_session_saved (session->snap_name());
+               session->SoloActive.connect(session_connections, MISSING_INVALIDATOR, boost::bind (&OSCGlobalObserver::solo_active, this, _1), OSC::instance());
+               solo_active (session->soloing() || session->listening());
 
                /*
                *       Maybe (many) more
@@ -372,3 +374,11 @@ OSCGlobalObserver::send_session_saved (std::string name)
 
 }
 
+void
+OSCGlobalObserver::solo_active (bool active)
+{
+       lo_message msg = lo_message_new ();
+       lo_message_add_float (msg, (float) active);
+       lo_send_message (addr, "/cancel_all_solos", msg);
+       lo_message_free (msg);
+}
index 3b1e53b98df0ea3b44f763e25b707c0066543542..845b9b981e1cc1339764026ae2772f1ae3ebd341 100644 (file)
@@ -60,6 +60,7 @@ class OSCGlobalObserver
        void send_transport_state_changed(void);
        void send_record_state_changed (void);
        void send_session_saved (std::string name);
+       void solo_active (bool active);
 };
 
 #endif /* __osc_oscglobalobserver_h__ */