diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2013-06-07 13:18:48 -0400 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2013-06-07 13:18:48 -0400 |
commit | 31d234b48c36bddb4d5228a3abee9c4419403879 (patch) | |
tree | fdc4f5aebd2823a6a8ac64927e08d9919cd07b94 /libs/surfaces/osc | |
parent | ce8731b32d5e91f56396cb5f6ca0798bc7fed48a (diff) | |
parent | 327ec5f58e58224e01004ddfd0252a840a0e84f0 (diff) |
Merge branch 'master' into cairocanvas
Diffstat (limited to 'libs/surfaces/osc')
-rw-r--r-- | libs/surfaces/osc/osc.cc | 87 | ||||
-rw-r--r-- | libs/surfaces/osc/osc.h | 4 |
2 files changed, 87 insertions, 4 deletions
diff --git a/libs/surfaces/osc/osc.cc b/libs/surfaces/osc/osc.cc index 357b82d4d2..d02626f4af 100644 --- a/libs/surfaces/osc/osc.cc +++ b/libs/surfaces/osc/osc.cc @@ -34,6 +34,7 @@ #include <pbd/file_utils.h> #include <pbd/failed_constructor.h> +#include "ardour/amp.h" #include "ardour/session.h" #include "ardour/route.h" #include "ardour/audio_track.h" @@ -42,6 +43,7 @@ #include "ardour/filesystem_paths.h" #include "ardour/panner.h" #include "ardour/plugin.h" +#include "ardour/send.h" #include "osc.h" #include "osc_controllable.h" @@ -164,6 +166,13 @@ OSC::start () _port++; continue; } + + if (!_osc_server) { + return 1; + } + + int fd = lo_server_get_socket_fd (_osc_server); + fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC); #ifdef ARDOUR_OSC_UNIX_SERVER @@ -172,7 +181,7 @@ OSC::start () // attempt to create unix socket server too snprintf(tmpstr, sizeof(tmpstr), "/tmp/sooperlooper_XXXXXX"); - int fd = mkstemp(tmpstr); + fd = mkstemp(tmpstr); if (fd >= 0 ) { unlink (tmpstr); @@ -182,6 +191,8 @@ OSC::start () if (_osc_unix_server) { _osc_unix_socket_path = tmpstr; + fd = lo_server_get_socket_fd (_osc_unix_server) + fcntl(fdx, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC); } } #endif @@ -221,19 +232,23 @@ OSC::thread_init () pthread_set_name (X_("OSC")); if (_osc_unix_server) { + const int fd = lo_server_get_socket_fd (_osc_unix_server); Glib::RefPtr<IOSource> src = IOSource::create (lo_server_get_socket_fd (_osc_unix_server), IO_IN|IO_HUP|IO_ERR); src->connect (sigc::bind (sigc::mem_fun (*this, &OSC::osc_input_handler), _osc_unix_server)); src->attach (_main_loop->get_context()); local_server = src->gobj(); g_source_ref (local_server); + fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC); } if (_osc_server) { - Glib::RefPtr<IOSource> src = IOSource::create (lo_server_get_socket_fd (_osc_server), IO_IN|IO_HUP|IO_ERR); + const int fd = lo_server_get_socket_fd (_osc_server); + Glib::RefPtr<IOSource> src = IOSource::create (fd, IO_IN|IO_HUP|IO_ERR); src->connect (sigc::bind (sigc::mem_fun (*this, &OSC::osc_input_handler), _osc_server)); src->attach (_main_loop->get_context()); remote_server = src->gobj(); g_source_ref (remote_server); + fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC); } PBD::notify_gui_about_thread_creation (X_("gui"), pthread_self(), X_("OSC"), 2048); @@ -356,8 +371,8 @@ OSC::register_callbacks() 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); - - + REGISTER_CALLBACK (serv, "/ardour/routes/send/gainabs", "iif", route_set_send_gain_abs); + REGISTER_CALLBACK (serv, "/ardour/routes/send/gaindB", "iif", route_set_send_gain_dB); /* still not-really-standardized query interface */ //REGISTER_CALLBACK (serv, "/ardour/*/#current_value", "", current_value); @@ -892,6 +907,70 @@ OSC::route_set_pan_stereo_width (int rid, float pos) } int +OSC::route_set_send_gain_abs (int rid, int sid, float val) +{ + if (!session) { + return -1; + } + + boost::shared_ptr<Route> r = session->route_by_remote_id (rid); + + if (!r) { + return -1; + } + + /* revert to zero-based counting */ + + if (sid > 0) { + --sid; + } + + boost::shared_ptr<Processor> p = r->nth_send (sid); + + if (p) { + boost::shared_ptr<Send> s = boost::dynamic_pointer_cast<Send>(p); + boost::shared_ptr<Amp> a = s->amp(); + + if (a) { + a->set_gain (val, this); + } + } + return 0; +} + +int +OSC::route_set_send_gain_dB (int rid, int sid, float val) +{ + if (!session) { + return -1; + } + + boost::shared_ptr<Route> r = session->route_by_remote_id (rid); + + if (!r) { + return -1; + } + + /* revert to zero-based counting */ + + if (sid > 0) { + --sid; + } + + boost::shared_ptr<Processor> p = r->nth_send (sid); + + if (p) { + boost::shared_ptr<Send> s = boost::dynamic_pointer_cast<Send>(p); + boost::shared_ptr<Amp> a = s->amp(); + + if (a) { + a->set_gain (dB_to_coefficient (val), this); + } + } + return 0; +} + +int OSC::route_plugin_parameter (int rid, int piid, int par, float val) { if (!session) { diff --git a/libs/surfaces/osc/osc.h b/libs/surfaces/osc/osc.h index c09792ec64..5c3422799b 100644 --- a/libs/surfaces/osc/osc.h +++ b/libs/surfaces/osc/osc.h @@ -214,6 +214,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_CALLBACK3(route_set_send_gain_abs,i,i,f); + PATH_CALLBACK3(route_set_send_gain_dB,i,i,f); PATH_CALLBACK4(route_plugin_parameter,i,i,i,f); PATH_CALLBACK3(route_plugin_parameter_print,i,i,i); @@ -224,6 +226,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_set_send_gain_abs (int rid, int sid, float val); + int route_set_send_gain_dB (int rid, int sid, float val); int route_plugin_parameter (int rid, int piid,int par, float val); int route_plugin_parameter_print (int rid, int piid,int par); |