X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fsurfaces%2Fosc%2Fosc.cc;h=0565e24f609bab1f0be43f75f9a0ea86e2940e1d;hb=136f705af97021969408d37ed5c313ff0b778ec4;hp=8ce796930758d153388ff0cec45c9bc29a2f47ee;hpb=b4560603882e2a5c6652cf086bee34ab7127131b;p=ardour.git diff --git a/libs/surfaces/osc/osc.cc b/libs/surfaces/osc/osc.cc index 8ce7969307..0565e24f60 100644 --- a/libs/surfaces/osc/osc.cc +++ b/libs/surfaces/osc/osc.cc @@ -83,10 +83,11 @@ OSC::OSC (Session& s, uint32_t port) , _osc_unix_server (0) , _namespace_root ("/ardour") , _send_route_changes (true) + , _debugmode (Off) + , gui (0) { _instance = this; - session_loaded (s); session->Exported.connect (*this, MISSING_INVALIDATOR, boost::bind (&OSC::session_exported, this, _1, _2), this); } @@ -225,6 +226,8 @@ OSC::start () register_callbacks(); + session_loaded (@session); + // lo_server_thread_add_method(_sthread, NULL, NULL, OSC::_dummy_handler, this); /* startup the event loop thread */ @@ -329,9 +332,6 @@ OSC::register_callbacks() serv = srvs[i]; - /* this is a special catchall handler */ - - lo_server_add_method (serv, 0, 0, _catchall, this); #define REGISTER_CALLBACK(serv,path,types, function) lo_server_add_method (serv, path, types, OSC::_ ## function, this) @@ -360,6 +360,46 @@ OSC::register_callbacks() REGISTER_CALLBACK (serv, "/ardour/toggle_punch_out", "", toggle_punch_out); REGISTER_CALLBACK (serv, "/ardour/rec_enable_toggle", "", rec_enable_toggle); REGISTER_CALLBACK (serv, "/ardour/toggle_all_rec_enables", "", toggle_all_rec_enables); + REGISTER_CALLBACK (serv, "/ardour/all_tracks_rec_in", "f", all_tracks_rec_in); + REGISTER_CALLBACK (serv, "/ardour/all_tracks_rec_out", "f", all_tracks_rec_out); + REGISTER_CALLBACK (serv, "/ardour/remove_marker", "", remove_marker_at_playhead); + REGISTER_CALLBACK (serv, "/ardour/jump_bars", "f", jump_by_bars); + REGISTER_CALLBACK (serv, "/ardour/jump_seconds", "f", jump_by_seconds); + REGISTER_CALLBACK (serv, "/ardour/mark_in", "", mark_in); + REGISTER_CALLBACK (serv, "/ardour/mark_out", "", mark_out); + REGISTER_CALLBACK (serv, "/ardour/toggle_click", "", toggle_click); + REGISTER_CALLBACK (serv, "/ardour/midi_panic", "", midi_panic); + REGISTER_CALLBACK (serv, "/ardour/toggle_roll", "", toggle_roll); + REGISTER_CALLBACK (serv, "/ardour/stop_forget", "", stop_forget); + REGISTER_CALLBACK (serv, "/ardour/set_punch_range", "", set_punch_range); + REGISTER_CALLBACK (serv, "/ardour/set_loop_range", "", set_loop_range); + REGISTER_CALLBACK (serv, "/ardour/set_session_range", "", set_session_range); + REGISTER_CALLBACK (serv, "/ardour/toggle_monitor_mute", "", toggle_monitor_mute); + REGISTER_CALLBACK (serv, "/ardour/toggle_monitor_dim", "", toggle_monitor_dim); + REGISTER_CALLBACK (serv, "/ardour/toggle_monitor_mono", "", toggle_monitor_mono); + REGISTER_CALLBACK (serv, "/ardour/quick_snapshot_switch", "", quick_snapshot_switch); + REGISTER_CALLBACK (serv, "/ardour/quick_snapshot_stay", "", quick_snapshot_stay); + REGISTER_CALLBACK (serv, "/ardour/fit_1_track", "", fit_1_track); + REGISTER_CALLBACK (serv, "/ardour/fit_2_tracks", "", fit_2_tracks); + REGISTER_CALLBACK (serv, "/ardour/fit_4_tracks", "", fit_4_tracks); + REGISTER_CALLBACK (serv, "/ardour/fit_8_tracks", "", fit_8_tracks); + REGISTER_CALLBACK (serv, "/ardour/fit_16_tracks", "", fit_16_tracks); + REGISTER_CALLBACK (serv, "/ardour/fit_32_tracks", "", fit_32_tracks); + REGISTER_CALLBACK (serv, "/ardour/fit_all_tracks", "", fit_all_tracks); + REGISTER_CALLBACK (serv, "/ardour/zoom_100_ms", "", zoom_100_ms); + REGISTER_CALLBACK (serv, "/ardour/zoom_1_sec", "", zoom_1_sec); + REGISTER_CALLBACK (serv, "/ardour/zoom_10_sec", "", zoom_10_sec); + REGISTER_CALLBACK (serv, "/ardour/zoom_1_min", "", zoom_1_min); + REGISTER_CALLBACK (serv, "/ardour/zoom_5_min", "", zoom_5_min); + REGISTER_CALLBACK (serv, "/ardour/zoom_10_min", "", zoom_10_min); + REGISTER_CALLBACK (serv, "/ardour/zoom_to_session", "", zoom_to_session); + REGISTER_CALLBACK (serv, "/ardour/temporal_zoom_in", "f", temporal_zoom_in); + REGISTER_CALLBACK (serv, "/ardour/temporal_zoom_out", "f", temporal_zoom_out); + REGISTER_CALLBACK (serv, "/ardour/scroll_up_1_track", "f", scroll_up_1_track); + REGISTER_CALLBACK (serv, "/ardour/scroll_dn_1_track", "f", scroll_dn_1_track); + REGISTER_CALLBACK (serv, "/ardour/scroll_up_1_page", "f", scroll_up_1_page); + REGISTER_CALLBACK (serv, "/ardour/scroll_dn_1_page", "f", scroll_dn_1_page); + /* * NOTE: these messages are provided for (arguably broken) apps @@ -388,7 +428,45 @@ OSC::register_callbacks() REGISTER_CALLBACK (serv, "/ardour/pushbutton/toggle_punch_out", "f", toggle_punch_out); REGISTER_CALLBACK (serv, "/ardour/pushbutton/rec_enable_toggle", "f", rec_enable_toggle); REGISTER_CALLBACK (serv, "/ardour/pushbutton/toggle_all_rec_enables", "f", toggle_all_rec_enables); - + REGISTER_CALLBACK (serv, "/ardour/pushbutton/all_tracks_rec_in", "f", all_tracks_rec_in); + REGISTER_CALLBACK (serv, "/ardour/pushbutton/all_tracks_rec_out", "f", all_tracks_rec_out); + REGISTER_CALLBACK (serv, "/ardour/pushbutton/remove_marker", "f", remove_marker_at_playhead); + REGISTER_CALLBACK (serv, "/ardour/pushbutton/mark_in", "f", mark_in); + REGISTER_CALLBACK (serv, "/ardour/pushbutton/mark_out", "f", mark_out); + REGISTER_CALLBACK (serv, "/ardour/pushbutton/toggle_click", "f", toggle_click); + REGISTER_CALLBACK (serv, "/ardour/pushbutton/midi_panic", "f", midi_panic); + REGISTER_CALLBACK (serv, "/ardour/pushbutton/toggle_roll", "f", toggle_roll); + REGISTER_CALLBACK (serv, "/ardour/pushbutton/stop_forget", "f", stop_forget); + REGISTER_CALLBACK (serv, "/ardour/pushbutton/set_punch_range", "f", set_punch_range); + REGISTER_CALLBACK (serv, "/ardour/pushbutton/set_loop_range", "f", set_loop_range); + REGISTER_CALLBACK (serv, "/ardour/pushbutton/set_session_range", "f", set_session_range); + REGISTER_CALLBACK (serv, "/ardour/pushbutton/toggle_monitor_mute", "f", toggle_monitor_mute); + REGISTER_CALLBACK (serv, "/ardour/pushbutton/toggle_monitor_dim", "f", toggle_monitor_dim); + REGISTER_CALLBACK (serv, "/ardour/pushbutton/toggle_monitor_mono", "f", toggle_monitor_mono); + REGISTER_CALLBACK (serv, "/ardour/pushbutton/quick_snapshot_switch", "f", quick_snapshot_switch); + REGISTER_CALLBACK (serv, "/ardour/pushbutton/quick_snapshot_stay", "f", quick_snapshot_stay); + REGISTER_CALLBACK (serv, "/ardour/pushbutton/fit_1_track", "f", fit_1_track); + REGISTER_CALLBACK (serv, "/ardour/pushbutton/fit_2_tracks", "f", fit_2_tracks); + REGISTER_CALLBACK (serv, "/ardour/pushbutton/fit_4_tracks", "f", fit_4_tracks); + REGISTER_CALLBACK (serv, "/ardour/pushbutton/fit_8_tracks", "f", fit_8_tracks); + REGISTER_CALLBACK (serv, "/ardour/pushbutton/fit_16_tracks", "f", fit_16_tracks); + REGISTER_CALLBACK (serv, "/ardour/pushbutton/fit_32_tracks", "f", fit_32_tracks); + REGISTER_CALLBACK (serv, "/ardour/pushbutton/fit_all_tracks", "f", fit_all_tracks); + REGISTER_CALLBACK (serv, "/ardour/pushbutton/zoom_100_ms", "f", zoom_100_ms); + REGISTER_CALLBACK (serv, "/ardour/pushbutton/zoom_1_sec", "f", zoom_1_sec); + REGISTER_CALLBACK (serv, "/ardour/pushbutton/zoom_10_sec", "f", zoom_10_sec); + REGISTER_CALLBACK (serv, "/ardour/pushbutton/zoom_1_min", "f", zoom_1_min); + REGISTER_CALLBACK (serv, "/ardour/pushbutton/zoom_5_min", "f", zoom_5_min); + REGISTER_CALLBACK (serv, "/ardour/pushbutton/zoom_10_min", "f", zoom_10_min); + REGISTER_CALLBACK (serv, "/ardour/pushbutton/zoom_to_session", "f", zoom_to_session); + REGISTER_CALLBACK (serv, "/ardour/pushbutton/temporal_zoom_in", "f", temporal_zoom_in); + REGISTER_CALLBACK (serv, "/ardour/pushbutton/temporal_zoom_out", "f", temporal_zoom_out); + REGISTER_CALLBACK (serv, "/ardour/pushbutton/scroll_up_1_track", "f", scroll_up_1_track); + REGISTER_CALLBACK (serv, "/ardour/pushbutton/scroll_dn_1_track", "f", scroll_dn_1_track); + REGISTER_CALLBACK (serv, "/ardour/pushbutton/scroll_up_1_page", "f", scroll_up_1_page); + REGISTER_CALLBACK (serv, "/ardour/pushbutton/scroll_dn_1_page", "f", scroll_dn_1_page); + + /* These commands require the route index in addition to the arg; TouchOSC (et al) can't use these */ REGISTER_CALLBACK (serv, "/ardour/routes/mute", "ii", route_mute); REGISTER_CALLBACK (serv, "/ardour/routes/solo", "ii", route_solo); REGISTER_CALLBACK (serv, "/ardour/routes/recenable", "ii", route_recenable); @@ -413,6 +491,10 @@ OSC::register_callbacks() //lo_server_add_method(serv, "/register_auto_update", "siss", OSC::global_register_auto_update_handler, this); //lo_server_add_method(serv, "/unregister_auto_update", "sss", OSC::_global_unregister_auto_update_handler, this); + /* this is a special catchall handler, + * register at the end so this is only called if no + * other handler matches (used for debug) */ + lo_server_add_method (serv, 0, 0, _catchall, this); } } @@ -615,7 +697,7 @@ OSC::_catchall (const char *path, const char *types, lo_arg **argv, int argc, vo } int -OSC::catchall (const char *path, const char* /*types*/, lo_arg **argv, int argc, lo_message msg) +OSC::catchall (const char *path, const char* types, lo_arg **argv, int argc, lo_message msg) { size_t len; int ret = 1; /* unhandled */ @@ -673,11 +755,101 @@ OSC::catchall (const char *path, const char* /*types*/, lo_arg **argv, int argc, } ret = 0; + } else if (argc == 1 && types[0] == 'f') { // single float -- probably TouchOSC + if (!strncmp (path, "/ardour/routes/gainabs/", 23) && strlen (path) > 23) { + int rid = atoi (&path[23]); + // use some power-scale mapping?? + route_set_gain_abs (rid, argv[0]->f); + ret = 0; + } + else if (!strncmp (path, "/ardour/routes/trimabs/", 23) && strlen (path) > 23) { + int rid = atoi (&path[23]); + // normalize 0..1 ? + route_set_trim_abs (rid, argv[0]->f); + ret = 0; + } + else if (!strncmp (path, "/ardour/routes/mute/", 20) && strlen (path) > 20) { + int rid = atoi (&path[20]); + route_mute (rid, argv[0]->f == 1.0); + ret = 0; + } + else if (!strncmp (path, "/ardour/routes/solo/", 20) && strlen (path) > 20) { + int rid = atoi (&path[20]); + route_solo (rid, argv[0]->f == 1.0); + ret = 0; + } + else if (!strncmp (path, "/ardour/routes/recenable/", 25) && strlen (path) > 25) { + int rid = atoi (&path[25]); + route_recenable (rid, argv[0]->f == 1.0); + ret = 0; + } + } + + if ((ret && _debugmode == Unhandled)) { + debugmsg (_("Unhandled OSC message"), path, types, argv, argc); } return ret; } +void +OSC::debugmsg (const char *prefix, const char *path, const char* types, lo_arg **argv, int argc) +{ + std::stringstream ss; + for (int i = 0; i < argc; ++i) { + lo_type type = (lo_type)types[i]; + ss << " "; + switch (type) { + case LO_INT32: + ss << "i:" << argv[i]->i; + break; + case LO_FLOAT: + ss << "f:" << argv[i]->f; + break; + case LO_DOUBLE: + ss << "d:" << argv[i]->d; + break; + case LO_STRING: + ss << "s:" << &argv[i]->s; + break; + case LO_INT64: + ss << "h:" << argv[i]->h; + break; + case LO_CHAR: + ss << "c:" << argv[i]->s; + break; + case LO_TIMETAG: + ss << ""; + break; + case LO_BLOB: + ss << ""; + break; + case LO_TRUE: + ss << "#T"; + break; + case LO_FALSE: + ss << "#F"; + break; + case LO_NIL: + ss << "NIL"; + break; + case LO_INFINITUM: + ss << "#inf"; + break; + case LO_MIDI: + ss << ""; + break; + case LO_SYMBOL: + ss << ""; + break; + default: + ss << "< ?? >"; + break; + } + } + PBD::info << prefix << ": " << path << ss.str() << endmsg; +} + void OSC::update_clock () { @@ -876,7 +1048,7 @@ OSC::route_mute (int rid, int yn) boost::shared_ptr r = session->route_by_remote_id (rid); if (r) { - r->set_mute (yn, this); + r->set_mute (yn, PBD::Controllable::NoGroup); } return 0; @@ -892,7 +1064,7 @@ OSC::route_solo (int rid, int yn) if (r) { boost::shared_ptr rl (new RouteList); rl->push_back (r); - session->set_solo (rl, yn); + session->set_solo (rl, yn, Session::rt_cleanup, PBD::Controllable::NoGroup); } return 0; @@ -906,7 +1078,7 @@ OSC::route_recenable (int rid, int yn) boost::shared_ptr r = session->route_by_remote_id (rid); if (r) { - r->set_record_enabled (yn, this); + r->set_record_enabled (yn, PBD::Controllable::NoGroup); } return 0; @@ -920,7 +1092,7 @@ OSC::route_set_gain_abs (int rid, float level) boost::shared_ptr r = session->route_by_remote_id (rid); if (r) { - r->set_gain (level, this); + r->set_gain (level, PBD::Controllable::NoGroup); } return 0; @@ -941,7 +1113,7 @@ OSC::route_set_trim_abs (int rid, float level) boost::shared_ptr r = session->route_by_remote_id (rid); if (r) { - r->set_trim (level, this); + r->set_trim (level, PBD::Controllable::NoGroup); } return 0; @@ -1016,7 +1188,7 @@ OSC::route_set_send_gain_abs (int rid, int sid, float val) boost::shared_ptr a = s->amp(); if (a) { - a->set_gain (val, this); + a->gain_control()->set_value (val, PBD::Controllable::NoGroup); } } return 0; @@ -1048,7 +1220,7 @@ OSC::route_set_send_gain_dB (int rid, int sid, float val) boost::shared_ptr a = s->amp(); if (a) { - a->set_gain (dB_to_coefficient (val), this); + a->gain_control()->set_value (dB_to_coefficient (val), PBD::Controllable::NoGroup); } } return 0; @@ -1163,7 +1335,9 @@ OSC::route_plugin_parameter_print (int rid, int piid, int par) XMLNode& OSC::get_state () { - return ControlProtocol::get_state(); + XMLNode& node (ControlProtocol::get_state()); + node.add_property("debugmode", (int) _debugmode); // TODO: enum2str + return node; } int @@ -1172,6 +1346,10 @@ OSC::set_state (const XMLNode& node, int version) if (ControlProtocol::set_state (node, version)) { return -1; } + XMLProperty const * p = node.property (X_("debugmode")); + if (p) { + _debugmode = OSCDebugMode (PBD::atoi(p->value ())); + } return 0; }