OSC: Bug fix for no monitor, bug fix heart beat on turned global feedback on.
authorLen Ovens <len@ovenwerks.net>
Sat, 4 Jun 2016 14:04:32 +0000 (07:04 -0700)
committerLen Ovens <len@ovenwerks.net>
Sat, 4 Jun 2016 14:04:32 +0000 (07:04 -0700)
Start select code.

libs/surfaces/osc/osc.cc
libs/surfaces/osc/osc.h
libs/surfaces/osc/osc_global_observer.cc
libs/surfaces/osc/osc_route_observer.cc
libs/surfaces/osc/osc_route_observer.h

index 4438c6dba4775b0edeef1d49aeda91e69e92e8b4..19516045dcb699bef9d82430ef0cc5747e3b4e54 100644 (file)
@@ -487,6 +487,8 @@ 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", "i", monitor_set_fader);
+               REGISTER_CALLBACK (serv, "/select/recenable", "i", sel_recenable);
+               REGISTER_CALLBACK (serv, "/select/record_safe", "ii", sel_recsafe);
 
 
                /* These commands require the route index in addition to the arg; TouchOSC (et al) can't use these  */ 
@@ -496,6 +498,8 @@ OSC::register_callbacks()
                REGISTER_CALLBACK (serv, "/strip/record_safe", "ii", route_recsafe);
                REGISTER_CALLBACK (serv, "/strip/monitor_input", "ii", route_monitor_input);
                REGISTER_CALLBACK (serv, "/strip/monitor_disk", "ii", route_monitor_disk);
+               REGISTER_CALLBACK (serv, "/strip/select", "ii", strip_select);
+               REGISTER_CALLBACK (serv, "/strip/gui_select", "ii", strip_gui_select);
                REGISTER_CALLBACK (serv, "/strip/gain", "if", route_set_gain_dB);
                REGISTER_CALLBACK (serv, "/strip/fader", "if", route_set_gain_fader);
                REGISTER_CALLBACK (serv, "/strip/trimabs", "if", route_set_trim_abs);
@@ -503,6 +507,7 @@ OSC::register_callbacks()
                REGISTER_CALLBACK (serv, "/strip/pan_stereo_position", "if", route_set_pan_stereo_position);
                REGISTER_CALLBACK (serv, "/strip/pan_stereo_width", "if", route_set_pan_stereo_width);
                REGISTER_CALLBACK (serv, "/strip/plugin/parameter", "iiif", route_plugin_parameter);
+               // prints to cerr only
                REGISTER_CALLBACK (serv, "/strip/plugin/parameter/print", "iii", route_plugin_parameter_print);
                REGISTER_CALLBACK (serv, "/strip/send/gainabs", "iif", route_set_send_gain_abs);
                REGISTER_CALLBACK (serv, "/strip/send/gaindB", "iif", route_set_send_gain_dB);
@@ -832,6 +837,16 @@ OSC::catchall (const char *path, const char* types, lo_arg **argv, int argc, lo_
                        route_recsafe (ssid, argv[0]->f == 1.0, msg);
                        ret = 0;
                }
+               else if (!strncmp (path, "/strip/select/", 14) && strlen (path) > 14) {
+                       int ssid = atoi (&path[14]);
+                       strip_select (ssid, argv[0]->f == 1.0, msg);
+                       ret = 0;
+               }
+               else if (!strncmp (path, "/strip/gui_select/", 18) && strlen (path) > 18) {
+                       int ssid = atoi (&path[18]);
+                       strip_gui_select (ssid, argv[0]->f == 1.0, msg);
+                       ret = 0;
+               }
        }
 
        if ((ret && _debugmode == Unhandled)) {
@@ -1385,10 +1400,6 @@ OSC::master_set_pan_stereo_position (float position)
                if (s->pan_azimuth_control()) {
                        s->pan_azimuth_control()->set_value (position, PBD::Controllable::NoGroup);
                }
-               /*boost::shared_ptr<PBD::Controllable> panner = s->pan_azimuth_control();
-               if (panner) {
-                       panner->set_value (position, PBD::Controllable::NoGroup);
-               }*/
        }
 
        return 0;
@@ -1470,6 +1481,13 @@ OSC::route_solo (int ssid, int yn, lo_message msg)
        return 0;
 }
 
+int
+OSC::sel_recenable (uint32_t yn, lo_message msg)
+{
+       OSCSurface *sur = get_surface(lo_message_get_source (msg));
+       return route_recenable(sur->surface_sel, yn, msg);
+}
+
 int
 OSC::route_recenable (int ssid, int yn, lo_message msg)
 {
@@ -1490,6 +1508,13 @@ OSC::route_recenable (int ssid, int yn, lo_message msg)
        return route_send_fail ("/strip/recenable", ssid, msg);
 }
 
+int
+OSC::sel_recsafe (uint32_t yn, lo_message msg)
+{
+       OSCSurface *sur = get_surface(lo_message_get_source (msg));
+       return route_recsafe(sur->surface_sel, yn, msg);
+}
+
 int
 OSC::route_recsafe (int ssid, int yn, lo_message msg)
 {
@@ -1551,6 +1576,54 @@ OSC::route_monitor_disk (int ssid, int yn, lo_message msg)
        return 0;
 }
 
+int
+OSC::strip_select (int ssid, int yn, lo_message msg)
+{
+       //ignore button release
+       if (!yn) return 0;
+
+       if (!session) {
+               route_send_fail ("/strip/select", ssid, msg);
+               return -1;
+       }
+       int rid = get_rid (ssid, lo_message_get_source (msg));
+       boost::shared_ptr<Stripable> s = session->get_remote_nth_stripable (rid, PresentationInfo::Route);
+       OSCSurface *sur = get_surface(lo_message_get_source (msg));
+       sur->surface_sel = ssid;
+
+       if (s) {
+               sur->sel = s;
+       } else {
+               route_send_fail ("/strip/select", ssid, msg);
+       }
+
+       return 0;
+}
+
+int
+OSC::strip_gui_select (int ssid, int yn, lo_message msg)
+{
+       //ignore button release
+       if (!yn) return 0;
+
+       if (!session) {
+               route_send_fail ("/strip/gui_select", ssid, msg);
+               return -1;
+       }
+       int rid = get_rid (ssid, lo_message_get_source (msg));
+       boost::shared_ptr<Stripable> s = session->get_remote_nth_stripable (rid, PresentationInfo::Route);
+       OSCSurface *sur = get_surface(lo_message_get_source (msg));
+       sur->surface_sel = ssid;
+
+       if (s) {
+               sur->sel = s;
+       } else {
+               route_send_fail ("/strip/gui_select", ssid, msg);
+       }
+
+       return 0;
+}
+
 int
 OSC::route_set_gain_abs (int rid, float level, lo_message msg)
 {
@@ -1741,6 +1814,7 @@ OSC::route_plugin_parameter (int ssid, int piid, int par, float val, lo_message
        return 0;
 }
 
+//prints to cerr only
 int
 OSC::route_plugin_parameter_print (int ssid, int piid, int par, lo_message msg)
 {
index 6d33fabd4e3040a81b7bf7ccd7205b33c9dfff91..f4cd7dcd7f14b9c69d7a1d35db6354b6b5e81968 100644 (file)
@@ -98,17 +98,19 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
 // keep a surface's global setup by remote server url
        struct OSCSurface {
        public:
-               std::string remote_url;                 // the url these setting belong to
-               uint32_t bank;                                  // current bank
-               uint32_t bank_size;                             // size of banks for this surface
-               std::bitset<32> strip_types;    // what strip types are a part of this bank
-               std::bitset<32> feedback;               // What is fed back? strips/meters/timecode/bar_beat/global
-               int gainmode;                                   // what kind of faders do we have Gain db or position 0 to 1023?
-               uint32_t surface_sel;                   // which strip within the bank is locally selected
+               std::string remote_url;                                         // the url these setting belong to
+               uint32_t bank;                                                          // current bank
+               uint32_t bank_size;                                                     // size of banks for this surface
+               std::bitset<32> strip_types;                            // what strip types are a part of this bank
+               std::bitset<32> feedback;                                       // What is fed back? strips/meters/timecode/bar_beat/global
+               int gainmode;                                                           // what kind of faders do we have Gain db or position 0 to 1023?
+               boost::shared_ptr<ARDOUR::Stripable> sel;       //
+               uint32_t surface_sel;                                           // which strip within the bank is locally selected
                //StripableList strips; //list of stripables for the current bank
        };
                /*
                 * Reminder of what strip_types there are
+                * XXX these have changed!!!
                AudioTrack = 0x1,
                MidiTrack = 0x2,
                AudioBus = 0x4,
@@ -132,6 +134,7 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
                 * [7] - Send metering as dB or positional depending on gainmode
                 * [8] - Send metering as 16 bits (led strip)
                 * [9] - Send signal present (signal greater than -20dB)
+                * [10] - Selection is local
                 */
 
 
@@ -322,6 +325,8 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
        PATH_CALLBACK1_MSG(set_surface_strip_types,i);
        PATH_CALLBACK1_MSG(set_surface_feedback,i);
        PATH_CALLBACK1_MSG(set_surface_gainmode,i);
+       PATH_CALLBACK1_MSG(sel_recenable,i);
+       PATH_CALLBACK1_MSG(sel_recsafe,i);
 
 #define PATH_CALLBACK2(name,arg1type,arg2type)                 \
         static int _ ## name (const char *path, const char *types, lo_arg **argv, int argc, void *data, void *user_data) { \
@@ -380,6 +385,8 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
        PATH_CALLBACK2_MSG(route_recsafe,i,i);
        PATH_CALLBACK2_MSG(route_monitor_input,i,i);
        PATH_CALLBACK2_MSG(route_monitor_disk,i,i);
+       PATH_CALLBACK2_MSG(strip_select,i,i);
+       PATH_CALLBACK2_MSG(strip_gui_select,i,i);
        PATH_CALLBACK2_MSG(route_set_gain_abs,i,f);
        PATH_CALLBACK2_MSG(route_set_gain_dB,i,f);
        PATH_CALLBACK2_MSG(route_set_gain_fader,i,f);
@@ -398,6 +405,8 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
        int route_recsafe (int ssid, int yn, lo_message msg);
        int route_monitor_input (int rid, int yn, lo_message msg);
        int route_monitor_disk (int rid, int yn, lo_message msg);
+       int strip_select (int rid, int yn, lo_message msg);
+       int strip_gui_select (int rid, int yn, lo_message msg);
        int route_set_gain_abs (int rid, float level, lo_message msg);
        int route_set_gain_dB (int rid, float dB, lo_message msg);
        int route_set_gain_fader (int rid, float pos, lo_message msg);
@@ -427,6 +436,8 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
        int master_set_mute (uint32_t state);
        int monitor_set_gain (float dB);
        int monitor_set_fader (uint32_t position);
+       int sel_recenable (uint32_t state, lo_message msg);
+       int sel_recsafe (uint32_t state, lo_message msg);
 
        void listen_to_route (boost::shared_ptr<ARDOUR::Stripable>, lo_address);
        void end_listen (boost::shared_ptr<ARDOUR::Stripable>, lo_address);
index 85a758e4dd4bbb8857b8654314e3b08cdde39082..5cbb61d3a42c7e0c7359461169f2e71b5c3d5b6c 100644 (file)
@@ -37,85 +37,89 @@ OSCGlobalObserver::OSCGlobalObserver (Session& s, lo_address a, uint32_t gm, std
        : gainmode (gm)
        ,feedback (fb)
 {
+       if (feedback[4]) {
+               addr = lo_address_new (lo_address_get_hostname(a) , lo_address_get_port(a));
+               session = &s;
+               _last_frame = -1;
 
-       addr = lo_address_new (lo_address_get_hostname(a) , lo_address_get_port(a));
-       session = &s;
-       _last_frame = -1;
-       // connect to all the things we want to send feed back from
+               // connect to all the things we want to send feed back from
 
-       /*
-        *      Master (todo)
-        *              Pan width
-        */
+               /*
+               *       Master (todo)
+               *               Pan width
+               */
 
-       // Master channel first
-       boost::shared_ptr<Stripable> strip = session->master_out();
+               // Master channel first
+               boost::shared_ptr<Stripable> strip = session->master_out();
 
-       boost::shared_ptr<Controllable> mute_controllable = boost::dynamic_pointer_cast<Controllable>(strip->mute_control());
-       mute_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, bind (&OSCGlobalObserver::send_change_message, this, X_("/master/mute"), strip->mute_control()), OSC::instance());
-       send_change_message ("/master/mute", strip->mute_control());
+               boost::shared_ptr<Controllable> mute_controllable = boost::dynamic_pointer_cast<Controllable>(strip->mute_control());
+               mute_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, bind (&OSCGlobalObserver::send_change_message, this, X_("/master/mute"), strip->mute_control()), OSC::instance());
+               send_change_message ("/master/mute", strip->mute_control());
 
-       boost::shared_ptr<Controllable> trim_controllable = boost::dynamic_pointer_cast<Controllable>(strip->trim_control());
+               boost::shared_ptr<Controllable> trim_controllable = boost::dynamic_pointer_cast<Controllable>(strip->trim_control());
                trim_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, bind (&OSCGlobalObserver::send_trim_message, this, X_("/master/trimdB"), strip->trim_control()), OSC::instance());
                send_trim_message ("/master/trimdB", strip->trim_control());
 
-       boost::shared_ptr<Controllable> pan_controllable = boost::dynamic_pointer_cast<Controllable>(strip->pan_azimuth_control());
+               boost::shared_ptr<Controllable> pan_controllable = boost::dynamic_pointer_cast<Controllable>(strip->pan_azimuth_control());
                pan_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, bind (&OSCGlobalObserver::send_change_message, this, X_("/master/pan_stereo_position"), strip->pan_azimuth_control()), OSC::instance());
                send_change_message ("/master/pan_stereo_position", strip->pan_azimuth_control());
 
-       boost::shared_ptr<Controllable> gain_controllable = boost::dynamic_pointer_cast<Controllable>(strip->gain_control());
-       if (gainmode) {
-               gain_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, bind (&OSCGlobalObserver::send_gain_message, this, X_("/master/fader"), strip->gain_control()), OSC::instance());
-               send_gain_message ("/master/fader", strip->gain_control());
-       } else {
-               gain_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, bind (&OSCGlobalObserver::send_gain_message, this, X_("/master/gain"), strip->gain_control()), OSC::instance());
-               send_gain_message ("/master/gain", strip->gain_control());
-       }
+               boost::shared_ptr<Controllable> gain_controllable = boost::dynamic_pointer_cast<Controllable>(strip->gain_control());
+               if (gainmode) {
+                       gain_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, bind (&OSCGlobalObserver::send_gain_message, this, X_("/master/fader"), strip->gain_control()), OSC::instance());
+                       send_gain_message ("/master/fader", strip->gain_control());
+               } else {
+                       gain_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, bind (&OSCGlobalObserver::send_gain_message, this, X_("/master/gain"), strip->gain_control()), OSC::instance());
+                       send_gain_message ("/master/gain", strip->gain_control());
+               }
 
-       // monitor stuff next
-       /* 
-        *      Monitor (todo)
-        *              Mute
-        *              Dim
-        *              Mono
-        *              Rude Solo
-        *              etc.
-        */
-       strip = session->monitor_out();
-
-       // Hmm, it seems the monitor mute is not at route->mute_control()
-       /*boost::shared_ptr<Controllable> mute_controllable2 = boost::dynamic_pointer_cast<Controllable>(strip->mute_control());
-       //mute_controllable = boost::dynamic_pointer_cast<Controllable>(r2->mute_control());
-       mute_controllable2->Changed.connect (monitor_mute_connection, MISSING_INVALIDATOR, bind (&OSCGlobalObserver::send_change_message, this, X_("/monitor/mute"), strip->mute_control()), OSC::instance());
-       send_change_message ("/monitor/mute", strip->mute_control());
-       */
-       gain_controllable = boost::dynamic_pointer_cast<Controllable>(strip->gain_control());
-       if (gainmode) {
-               gain_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, bind (&OSCGlobalObserver::send_gain_message, this, X_("/monitor/fader"), strip->gain_control()), OSC::instance());
-               send_gain_message ("/monitor/fader", strip->gain_control());
-       } else {
-               gain_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, bind (&OSCGlobalObserver::send_gain_message, this, X_("/monitor/gain"), strip->gain_control()), OSC::instance());
-               send_gain_message ("/monitor/gain", strip->gain_control());
-       }
+               // monitor stuff next
+               /*
+               *       Monitor (todo)
+               *               Mute
+               *               Dim
+               *               Mono
+               *               Rude Solo
+               *               etc.
+               */
+               strip = session->monitor_out();
+               if (strip) {
+
+                       // Hmm, it seems the monitor mute is not at route->mute_control()
+                       /*boost::shared_ptr<Controllable> mute_controllable2 = boost::dynamic_pointer_cast<Controllable>(strip->mute_control());
+                       //mute_controllable = boost::dynamic_pointer_cast<Controllable>(r2->mute_control());
+                       mute_controllable2->Changed.connect (monitor_mute_connection, MISSING_INVALIDATOR, bind (&OSCGlobalObserver::send_change_message, this, X_("/monitor/mute"), strip->mute_control()), OSC::instance());
+                       send_change_message ("/monitor/mute", strip->mute_control());
+                       */
+                       gain_controllable = boost::dynamic_pointer_cast<Controllable>(strip->gain_control());
+                       if (gainmode) {
+                               gain_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, bind (&OSCGlobalObserver::send_gain_message, this, X_("/monitor/fader"), strip->gain_control()), OSC::instance());
+                               send_gain_message ("/monitor/fader", strip->gain_control());
+                       } else {
+                               gain_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, bind (&OSCGlobalObserver::send_gain_message, this, X_("/monitor/gain"), strip->gain_control()), OSC::instance());
+                               send_gain_message ("/monitor/gain", strip->gain_control());
+                       }
+               }
 
-       /*
-        *      Transport (todo)
-        *              punchin/out
-        */
-        //Transport feedback
-       session->TransportStateChange.connect(session_connections, MISSING_INVALIDATOR, boost::bind (&OSCGlobalObserver::send_transport_state_changed, this), OSC::instance());
-       send_transport_state_changed ();
-       session->TransportLooped.connect(session_connections, MISSING_INVALIDATOR, boost::bind (&OSCGlobalObserver::send_transport_state_changed, this), OSC::instance());
-       session->RecordStateChanged.connect(session_connections, MISSING_INVALIDATOR, boost::bind (&OSCGlobalObserver::send_record_state_changed, this), OSC::instance());
-       send_record_state_changed ();
-
-       // 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());
-
-       /*
-        *      Maybe (many) more
-        */
+               /*
+               *       Transport (todo)
+               *               punchin/out
+               */
+               //Transport feedback
+               session->TransportStateChange.connect(session_connections, MISSING_INVALIDATOR, boost::bind (&OSCGlobalObserver::send_transport_state_changed, this), OSC::instance());
+               send_transport_state_changed ();
+               session->TransportLooped.connect(session_connections, MISSING_INVALIDATOR, boost::bind (&OSCGlobalObserver::send_transport_state_changed, this), OSC::instance());
+               session->RecordStateChanged.connect(session_connections, MISSING_INVALIDATOR, boost::bind (&OSCGlobalObserver::send_record_state_changed, this), OSC::instance());
+               send_record_state_changed ();
+
+               // 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());
+
+               /*
+               *       Maybe (many) more
+               */
+       }
 }
 
 OSCGlobalObserver::~OSCGlobalObserver ()
index ff80dbe781063e206a3e45c82c43311682dd8fc2..8f7abe2991557e3c4803ef70d8d4c6cbe1d0f8e9 100644 (file)
@@ -69,6 +69,7 @@ OSCRouteObserver::OSCRouteObserver (boost::shared_ptr<Stripable> s, lo_address a
                        recsafe_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, bind (&OSCRouteObserver::send_change_message, this, X_("/strip/record_safe"), _strip->rec_safe_control()), OSC::instance());
                        send_change_message ("/strip/record_safe", _strip->rec_safe_control());
                }
+               send_select_status ();
        }
 
        if (feedback[1]) { // level controls
@@ -119,6 +120,7 @@ OSCRouteObserver::~OSCRouteObserver ()
                clear_strip ("/strip/record_safe", 0);
                clear_strip ("/strip/monitor_input", 0);
                clear_strip ("/strip/monitor_disk", 0);
+               clear_strip ("/strip/gui_select", 0);
        }
        if (feedback[1]) { // level controls
                if (gainmode) {
@@ -359,3 +361,23 @@ OSCRouteObserver::clear_strip (string path, float val)
        lo_message_free (msg);
 
 }
+
+void
+OSCRouteObserver::send_select_status ()
+{
+       // waiting for _strip->is_selected to start working
+       if (_strip) {
+               string path = "/strip/gui_select";
+
+               lo_message msg = lo_message_new ();
+               if (feedback[2]) {
+                       path = set_path (path);
+               } else {
+                       lo_message_add_int32 (msg, ssid);
+               }
+               //std::cout << "strip: " << ssid << " strip name: " << _strip->name() << " select: " << _strip->is_selected() << "\n";
+               lo_message_add_float (msg, _strip->is_selected());
+               lo_send_message (addr, path.c_str(), msg);
+               lo_message_free (msg);
+       }
+}
index 220eb176ffd54c5c93d69632f628983e8625b9ed..cef044a58216b5dfaf1a96b95706c3e1bbe7caf2 100644 (file)
@@ -40,6 +40,7 @@ class OSCRouteObserver
        boost::shared_ptr<ARDOUR::Stripable> strip () const { return _strip; }
        lo_address address() const { return addr; };
        void tick (void);
+       void send_select_status (void);
 
   private:
        boost::shared_ptr<ARDOUR::Stripable> _strip;