REGISTER_CALLBACK (serv, "/select/monitor_disk", "i", sel_monitor_disk);
REGISTER_CALLBACK (serv, "/select/gain", "f", sel_gain);
REGISTER_CALLBACK (serv, "/select/fader", "f", sel_fader);
+ REGISTER_CALLBACK (serv, "/select/trimdB", "f", sel_trim);
+ REGISTER_CALLBACK (serv, "/select/pan_stereo_position", "f", sel_pan_position);
/* These commands require the route index in addition to the arg; TouchOSC (et al) can't use these */
REGISTER_CALLBACK (serv, "/strip/mute", "ii", route_mute);
// 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);
+ REGISTER_CALLBACK (serv, "/strip/send/gain", "iif", route_set_send_gain_dB);
+ REGISTER_CALLBACK (serv, "/strip/send/fader", "iif", route_set_send_fader);
/* still not-really-standardized query interface */
//REGISTER_CALLBACK (serv, "/ardour/*/#current_value", "", current_value);
boost::shared_ptr<Stripable> stp = session->get_remote_nth_stripable (n - 1, PresentationInfo::Route);
if (stp) {
- listen_to_route(stp, lo_message_get_source (msg));
+ listen_to_route(stp, lo_message_get_source (msg));
+ if (!s->feedback[10]) {
+ if (stp->is_selected()) {
+ _strip_select (n, lo_message_get_source (msg));
+ }
+ }
}
}
- // put in check for GUI_selects here.
}
return 0;
}
delete sur->sel_obs;
sur->sel_obs = 0;
}
- sur->surface_sel = 0;
+ sur->surface_sel = 0;
if (s) {
sur->surface_sel = ssid;
b_s = sur->nstrips;
}
for (int i = 1; i <= b_s; i++) {
- if (i==(int)sur->surface_sel) {
- string path = "/strip/select";
- lo_message reply = lo_message_new ();
- if (sur->feedback[2]) {
- ostringstream os;
- os << path << "/" << ssid;
- path = os.str();
- } else {
+ string path = "select";
+ if (!sur->feedback[10]) {
+ path = "gui_select";
+ }
+ if (i==(int)sur->surface_sel) {
+ lo_message reply = lo_message_new ();
+ if (sur->feedback[2]) {
+ ostringstream os;
+ os << "/strip/" << path << "/" << ssid;
+ path = os.str();
+ } else {
+ ostringstream os;
+ os << "/strip/" << path;
+ path = os.str();
lo_message_add_int32 (reply, ssid);
- }
+ }
lo_message_add_float (reply, (float) 1);
lo_send_message (addr, path.c_str(), reply);
lo_message_free (reply);
} else {
- route_send_fail ("select", i, 0, addr);
+ route_send_fail (path, i, 0, addr);
}
}
route_send_fail ("gui_select", ssid, 0, lo_message_get_source (msg));
return -1;
}
- int ret = strip_select (ssid, yn, msg);
- if (ret != 0) {
- return ret;
- }
+
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));
-
if (s) {
- //s->set_select();
- //sur->surface_sel = ssid;
+ //SetStripableSelection ((*s)->presentation_info().order());
+ SetStripableSelection (rid); //alt above may end up being better
} else {
route_send_fail ("gui_select", ssid, 0, lo_message_get_source (msg));
}
return route_set_trim_abs(ssid, dB_to_coefficient (dB), msg);
}
+int
+OSC::sel_trim (float val, lo_message msg)
+{
+ OSCSurface *sur = get_surface(lo_message_get_source (msg));
+ if (sur->surface_sel) {
+ return route_set_trim_dB (sur->surface_sel, val, msg);
+ } else {
+ return route_send_fail ("trimdB", 0, 0, lo_message_get_source (msg));
+ }
+}
+
+int
+OSC::sel_pan_position (float val, lo_message msg)
+{
+ OSCSurface *sur = get_surface(lo_message_get_source (msg));
+ if (sur->surface_sel) {
+ return route_set_pan_stereo_position (sur->surface_sel, val, msg);
+ } else {
+ return route_send_fail ("pan_stereo_position", 0, 0, lo_message_get_source (msg));
+ }
+}
int
OSC::route_set_pan_stereo_position (int ssid, float pos, lo_message msg)
return route_set_send_gain_abs (ssid, sid, dB_to_coefficient (val), msg);
}
+int
+OSC::route_set_send_fader (int ssid, int sid, float pos, lo_message msg)
+{
+ if (!session) {
+ return -1;
+ }
+ int ret;
+ if ((pos > 799.5) && (pos < 800.5)) {
+ ret = route_set_send_gain_abs (ssid, sid, 1.0, msg);
+ } else {
+ ret = route_set_send_gain_abs (ssid, sid, slider_position_to_gain_with_max ((pos/1023), 2.0), msg);
+ }
+ return ret;
+}
+
int
OSC::route_plugin_parameter (int ssid, int piid, int par, float val, lo_message msg)
{
PATH_CALLBACK1_MSG(sel_monitor_disk,i);
PATH_CALLBACK1_MSG(sel_gain,f);
PATH_CALLBACK1_MSG(sel_fader,f);
+ PATH_CALLBACK1_MSG(sel_trim,f);
+ PATH_CALLBACK1_MSG(sel_pan_position,f);
#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) { \
PATH_CALLBACK2_MSG(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_CALLBACK3(route_set_send_fader,i,i,f);
PATH_CALLBACK4(route_plugin_parameter,i,i,i,f);
PATH_CALLBACK3(route_plugin_parameter_print,i,i,i);
int route_set_pan_stereo_width (int rid, float percent, lo_message msg);
int route_set_send_gain_abs (int rid, int sid, float val, lo_message msg);
int route_set_send_gain_dB (int rid, int sid, float val, lo_message msg);
+ int route_set_send_fader (int rid, int sid, float val, lo_message msg);
int route_plugin_parameter (int rid, int piid,int par, float val, lo_message msg);
int route_plugin_parameter_print (int rid, int piid,int par, lo_message msg);
int sel_monitor_disk (uint32_t state, lo_message msg);
int sel_gain (float state, lo_message msg);
int sel_fader (float state, lo_message msg);
+ int sel_trim (float val, lo_message msg);
+ int sel_pan_position (float val, lo_message msg);
void listen_to_route (boost::shared_ptr<ARDOUR::Stripable>, lo_address);
void end_listen (boost::shared_ptr<ARDOUR::Stripable>, lo_address);
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[10]) {
+ send_select_status ();
+ }
}
if (feedback[1]) { // level controls
,ssid (ss)
,gainmode (gm)
,feedback (fb)
+ ,nsends (0)
{
addr = lo_address_new (lo_address_get_hostname(a) , lo_address_get_port(a));
pan_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, bind (&OSCSelectObserver::send_change_message, this, X_("/select/pan_stereo_position"), _strip->pan_azimuth_control()), OSC::instance());
send_change_message ("/select/pan_stereo_position", _strip->pan_azimuth_control());
}
+ // detecting processor changes requires cast to route
+ boost::shared_ptr<Route> r = boost::dynamic_pointer_cast<Route>(_strip);
+ r->processors_changed.connect (strip_connections, MISSING_INVALIDATOR, bind (&OSCSelectObserver::send_restart, this, -1), OSC::instance());
+ send_init();
}
tick();
}
}else if (feedback[8]) {
clear_strip ("/select/meter", 0);
}
+ send_end();
lo_address_free (addr);
}
+void
+OSCSelectObserver::send_init()
+{
+ // we don't know how many there are, so find out.
+ bool sends;
+ do {
+ sends = false;
+ if (_strip->send_level_controllable (nsends)) {
+ _strip->send_level_controllable(nsends)->Changed.connect (strip_connections, MISSING_INVALIDATOR, bind (&OSCSelectObserver::send_gain, this, X_("/select/send_gain"), nsends, _strip->send_level_controllable(nsends)), OSC::instance());
+ send_gain ("/select/send_gain", nsends, _strip->send_level_controllable(nsends));
+ sends = true;
+ }
+
+ if (_strip->send_enable_controllable (nsends)) {
+ _strip->send_enable_controllable(nsends)->Changed.connect (strip_connections, MISSING_INVALIDATOR, bind (&OSCSelectObserver::send_enable, this, X_("/select/send_enable"), nsends, _strip->send_enable_controllable(nsends)), OSC::instance());
+ send_enable ("/select/send_enable", nsends, _strip->send_enable_controllable(nsends));
+ sends = true;
+ } else if (sends) {
+ // not used by Ardour, just mixbus so in Ardour always true
+ lo_message msg = lo_message_new ();
+ path = "/select/send_enable";
+ if (feedback[2]) {
+ path = set_path (path, nsends + 1);
+ } else {
+ lo_message_add_int32 (msg, nsends + 1);
+ }
+ lo_message_add_int32 (msg, 1);
+ lo_send_message (addr, path.c_str(), msg);
+ lo_message_free (msg);
+ }
+
+ if (sends) { // if the gain control is there, this is too
+ send_rename ("/select/send_name", nsends, _strip->send_name(nsends));
+ }
+ // Send numbers are 0 based, OSC is 1 based so this gets incremented at the end
+ if (sends) {
+ nsends++;
+ }
+ } while (sends);
+}
+
+void
+OSCSelectObserver::send_end ()
+{
+ send_connections.drop_connections ();
+ for (uint32_t i = 1; i <= nsends; i++) {
+ lo_message msg = lo_message_new ();
+ string path = "/select/send_gain";
+ if (feedback[2]) {
+ path = set_path (path, i);
+ } else {
+ lo_message_add_int32 (msg, i);
+ }
+
+ if (gainmode) {
+ lo_message_add_int32 (msg, 0);
+ } else {
+ lo_message_add_float (msg, -193);
+ }
+ lo_send_message (addr, path.c_str(), msg);
+ lo_message_free (msg);
+ // next enable
+ msg = lo_message_new ();
+ path = "/select/send_enable";
+ if (feedback[2]) {
+ path = set_path (path, i);
+ } else {
+ lo_message_add_int32 (msg, i);
+ }
+ lo_message_add_int32 (msg, 0);
+ lo_send_message (addr, path.c_str(), msg);
+ lo_message_free (msg);
+ // next name
+ msg = lo_message_new ();
+ path = "/select/send_name";
+ if (feedback[2]) {
+ path = set_path (path, i);
+ } else {
+ lo_message_add_int32 (msg, i);
+ }
+ lo_message_add_string (msg, " ");
+ lo_send_message (addr, path.c_str(), msg);
+ lo_message_free (msg);
+ }
+ nsends = 0;
+}
+
+void
+OSCSelectObserver::send_restart(int x)
+{
+ send_end();
+ send_init();
+}
+
void
OSCSelectObserver::tick ()
{
lo_message_free (msg);
}
+void
+OSCSelectObserver::send_gain (std::string path, uint32_t id, boost::shared_ptr<PBD::Controllable> controllable)
+{
+ lo_message msg = lo_message_new ();
+
+ if (feedback[2]) {
+ path = set_path (path, id + 1);
+ } else {
+ lo_message_add_int32 (msg, id + 1);
+ }
+
+ if (gainmode) {
+ if (controllable->get_value() == 1) {
+ lo_message_add_int32 (msg, 800);
+ } else {
+ lo_message_add_int32 (msg, gain_to_slider_position (controllable->get_value()) * 1023);
+ }
+ } else {
+ if (controllable->get_value() < 1e-15) {
+ lo_message_add_float (msg, -200);
+ } else {
+ lo_message_add_float (msg, accurate_coefficient_to_dB (controllable->get_value()));
+ }
+ }
+
+ lo_send_message (addr, path.c_str(), msg);
+ lo_message_free (msg);
+}
+
+void
+OSCSelectObserver::send_enable (string path, uint32_t id, boost::shared_ptr<Controllable> controllable)
+{
+ lo_message msg = lo_message_new ();
+ if (feedback[2]) {
+ path = set_path (path, id + 1);
+ } else {
+ lo_message_add_int32 (msg, id + 1);
+ }
+
+ lo_message_add_float (msg, (float) controllable->get_value());
+
+ lo_send_message (addr, path.c_str(), msg);
+ lo_message_free (msg);
+}
+
+void
+OSCSelectObserver::send_rename (string path, uint32_t id, string name)
+{
+ lo_message msg = lo_message_new ();
+ if (feedback[2]) {
+ path = set_path (path, id + 1);
+ } else {
+ lo_message_add_int32 (msg, id + 1);
+ }
+
+ lo_message_add_string (msg, name.c_str());
+
+ lo_send_message (addr, path.c_str(), msg);
+ lo_message_free (msg);
+}
+
string
-OSCSelectObserver::set_path (string path)
+OSCSelectObserver::set_path (string path, uint32_t id)
{
if (feedback[2]) {
ostringstream os;
- os << path << "/" << ssid;
+ os << path << "/" << id;
path = os.str();
}
return path;
boost::shared_ptr<ARDOUR::Stripable> _strip;
PBD::ScopedConnectionList strip_connections;
+ // sends need their own
+ PBD::ScopedConnectionList send_connections;
lo_address addr;
std::string path;
uint32_t gainmode;
std::bitset<32> feedback;
float _last_meter;
+ uint32_t nsends;
void name_changed (const PBD::PropertyChange& what_changed);
void send_monitor_status (boost::shared_ptr<PBD::Controllable> controllable);
void send_gain_message (std::string path, boost::shared_ptr<PBD::Controllable> controllable);
void send_trim_message (std::string path, boost::shared_ptr<PBD::Controllable> controllable);
- std::string set_path (std::string path);
+ // sends stuff
+ void send_init (void);
+ void send_end (void);
+ void send_restart (int);
+ void send_gain (std::string path, uint32_t id, boost::shared_ptr<PBD::Controllable> controllable);
+ void send_enable (std::string path, uint32_t id, boost::shared_ptr<PBD::Controllable> controllable);
+ void send_rename (std::string path, uint32_t id, std::string name);
+ std::string set_path (std::string path, uint32_t id);
void clear_strip (std::string path, float val);
};