provide access to plugin parameters from OSC. not tested. from olaf
authorPaul Davis <paul@linuxaudiosystems.com>
Fri, 3 Dec 2010 22:29:58 +0000 (22:29 +0000)
committerPaul Davis <paul@linuxaudiosystems.com>
Fri, 3 Dec 2010 22:29:58 +0000 (22:29 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@8170 d708f5d6-7413-0410-9779-e7cbd77b26cf

libs/surfaces/osc/osc.cc
libs/surfaces/osc/osc.h

index 264d4eee136b5e9596ab5c9dad267e9fda3b6d25..6fcfc308c9e5f57fad0817c8d1a13a16363c6f67 100644 (file)
@@ -43,6 +43,7 @@
 #include "ardour/dB.h"
 #include "ardour/filesystem_paths.h"
 #include "ardour/panner.h"
+#include "ardour/plugin.h"
 
 #include "osc.h"
 #include "osc_controllable.h"
@@ -338,6 +339,10 @@ OSC::register_callbacks()
                REGISTER_CALLBACK (serv, "/ardour/routes/recenable", "ii", route_recenable);
                REGISTER_CALLBACK (serv, "/ardour/routes/gainabs", "if", route_set_gain_abs);
                REGISTER_CALLBACK (serv, "/ardour/routes/gaindB", "if", route_set_gain_dB);
+               REGISTER_CALLBACK (serv, "/ardour/routes/pan_stereo_position", "if", route_set_pan_stereo_position);
+               REGISTER_CALLBACK (serv, "/ardour/routes/pan_stereo_width", "if", route_set_pan_stereo_width);
+               REGISTER_CALLBACK (serv, "/ardour/routes/plugin/parameter", "iiif", route_plugin_parameter);
+               REGISTER_CALLBACK (serv, "/ardour/routes/plugin/parameter/print", "iii", route_plugin_parameter_print);
 
                
 #if 0
@@ -818,6 +823,100 @@ OSC::route_set_pan_stereo_width (int rid, float pos)
 
 }
 
+int
+OSC::route_plugin_parameter (int rid,int piid,int par, float val)
+{
+        if (!session) { 
+                return -1;
+        }
+
+        boost::shared_ptr<Route> r = session->route_by_remote_id (rid);  
+
+        if (!r) {
+                return -1;
+        }
+
+        boost::shared_ptr<Processor> redi=r->nth_processor (piid);
+        
+        if (!redi) {
+                return -1;
+        }
+
+        boost::shared_ptr<PluginInsert> pi;
+        
+        if (!(pi = boost::dynamic_pointer_cast<PluginInsert>(redi))) {
+                return -1;
+        }
+
+        boost::shared_ptr<ARDOUR::Plugin> pip = pi->plugin();
+        bool ok=false;
+        
+        uint32_t controlid = pip->nth_parameter (par,ok);
+        
+        if (!ok) {
+                return -1;
+        }
+
+        Plugin::ParameterDescriptor pd;
+        pi->plugin()->get_parameter_descriptor (controlid,pd);
+
+        if (val >= pd.lower && val < pd.upper) {
+                
+                boost::shared_ptr<AutomationControl> c = pi->automation_control (Evoral::Parameter(PluginAutomation, 0, controlid));;
+                cerr << "parameter:" << redi->describe_parameter(controlid) << " val:" << val << "\n";
+                c->set_value (val);
+        }  
+
+        return 0;
+}
+
+int
+OSC::route_plugin_parameter_print (int rid,int piid,int par)
+{
+        if (!session) { 
+                return -1;
+        }
+
+        boost::shared_ptr<Route> r = session->route_by_remote_id (rid);  
+
+        if (!r) {
+                return -1;
+        }
+
+        boost::shared_ptr<Processor> redi=r->nth_processor (piid);
+        
+        if (!redi) {
+                return -1;
+        }
+
+        boost::shared_ptr<PluginInsert> pi;
+        
+        if (!(pi = boost::dynamic_pointer_cast<PluginInsert>(redi))) {
+                return -1;
+        }
+        boost::shared_ptr<ARDOUR::Plugin> pip=pi->plugin();
+        bool ok=false;
+        
+        uint32_t controlid = pip->nth_parameter (par,ok);
+        
+        if (!ok) {
+                return -1;
+        }
+
+        Plugin::ParameterDescriptor pd;
+
+        if (pi->plugin()->get_parameter_descriptor (controlid, pd) == 0) {
+                boost::shared_ptr<AutomationControl> c = pi->automation_control (Evoral::Parameter(PluginAutomation, 0, controlid));
+                
+                cerr << "parameter:     " << redi->describe_parameter(controlid)  << "\n";
+                cerr << "current value: " << c->get_value ();
+                cerr << "lower value:   " << pd.lower << "\n";
+                cerr << "upper value:   " << pd.upper << "\n";
+        }
+
+        return 0;
+}
+
 XMLNode& 
 OSC::get_state () 
 {
index de73bdb913a13887bbee23548a66836fdc8c58e9..804c8a5fbd46888c48137ebc50b8b9e8a8ddb20c 100644 (file)
@@ -167,6 +167,28 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
                return 0;                                               \
        }
 
+#define PATH_CALLBACK3(name,arg1type,arg2type,arg3type)                \
+        static int _ ## name (const char *path, const char *types, lo_arg **argv, int argc, void *data, void *user_data) { \
+               return static_cast<OSC*>(user_data)->cb_ ## name (path, types, argv, argc, data); \
+        } \
+        int cb_ ## name (const char *path, const char *types, lo_arg **argv, int argc, void *data) { \
+                if (argc > 1) {                                                \
+                 name (argv[0]->arg1type, argv[1]->arg2type,argv[2]->arg3type); \
+                }                                                      \
+               return 0;                                               \
+       }
+
+#define PATH_CALLBACK4(name,arg1type,arg2type,arg3type,arg4type)               \
+        static int _ ## name (const char *path, const char *types, lo_arg **argv, int argc, void *data, void *user_data) { \
+               return static_cast<OSC*>(user_data)->cb_ ## name (path, types, argv, argc, data); \
+        } \
+        int cb_ ## name (const char *path, const char *types, lo_arg **argv, int argc, void *data) { \
+                if (argc > 1) {                                                \
+                 name (argv[0]->arg1type, argv[1]->arg2type,argv[2]->arg3type,argv[3]->arg4type); \
+                }                                                      \
+               return 0;                                               \
+       } 
+
         PATH_CALLBACK2(locate,i,i);
        PATH_CALLBACK2(route_mute,i,i);
        PATH_CALLBACK2(route_solo,i,i);
@@ -175,6 +197,8 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
        PATH_CALLBACK2(route_set_gain_dB,i,f);
        PATH_CALLBACK2(route_set_pan_stereo_position,i,f);
        PATH_CALLBACK2(route_set_pan_stereo_width,i,f);
+        PATH_CALLBACK4(route_plugin_parameter,i,i,i,f);
+        PATH_CALLBACK3(route_plugin_parameter_print,i,i,i); 
 
        int route_mute (int rid, int yn);
        int route_solo (int rid, int yn);
@@ -183,6 +207,8 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
        int route_set_gain_dB (int rid, float dB);
        int route_set_pan_stereo_position (int rid, float left_right_fraction);
        int route_set_pan_stereo_width (int rid, float percent);
+       int route_plugin_parameter (int rid, int piid,int par, float val);
+       int route_plugin_parameter_print (int rid, int piid,int par);
 
        void listen_to_route (boost::shared_ptr<ARDOUR::Route>, lo_address);
        void end_listen (boost::shared_ptr<ARDOUR::Route>, lo_address);