View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0007176 | ardour | features | public | 2016-12-13 09:09 | 2020-04-19 20:18 |
Reporter | .onkel. | Assigned To | ovenwerks | ||
Priority | normal | Severity | minor | Reproducibility | always |
Status | closed | Resolution | fixed | ||
Product Version | 5.5 | ||||
Summary | 0007176: OSC support for plugins needs improvment | ||||
Description | As discussed in former issue 7137, we should modify the function OSC::route_plugin_descriptor(...) for some reason. - remove redundant plugin name from response. It's already part of the plugin list. - add boolean value which indicates the bypass state (enable/disable). - the flags value owns a new bit which indicates if a parameter is input or output (0x80). - mark "hidden" parameters with another flag bit (0x100). - notify the parameter data type as an enumerated string instead of an obscures integer. Please find a corresponding patch file attached. Sorry for the delay, I wasn't able to report this before release of 5.5 | ||||
Tags | No tags attached. | ||||
Users sponsoring this issue | ||
Sponsors List |
Total Sponsorship = US$ 5 2017-01-12 07:05: .onkel. (US$ 5) |
---|
|
plugin_descriptor.patch (4,854 bytes)
--- 5.5/ardour/libs/surfaces/osc/osc.cc 2016-12-13 09:06:39.572145483 +0100 +++ 5.5.3/ardour/libs/surfaces/osc/osc.cc 2016-12-02 09:38:54.189879363 +0100 @@ -2877,54 +2877,90 @@ lo_message reply = lo_message_new(); lo_message_add_int32 (reply, ssid); lo_message_add_int32 (reply, piid); - lo_message_add_string (reply, pip->name()); + lo_message_add_int32(reply, redi->enabled() ? 1 : 0); + for ( uint32_t ppi = 0; ppi < pip->parameter_count(); ppi++) { uint32_t controlid = pip->nth_parameter(ppi, ok); if (!ok) { continue; } - if ( pip->parameter_is_input(controlid) || pip->parameter_is_control(controlid) ) { - boost::shared_ptr<AutomationControl> c = pi->automation_control(Evoral::Parameter(PluginAutomation, 0, controlid)); + boost::shared_ptr<AutomationControl> c = pi->automation_control(Evoral::Parameter(PluginAutomation, 0, controlid)); - lo_message_add_int32 (reply, ppi + 1); - ParameterDescriptor pd; - pi->plugin()->get_parameter_descriptor(controlid, pd); - lo_message_add_string (reply, pd.label.c_str()); - - // I've combined those binary descriptor parts in a bit-field to reduce lilo message elements - int flags = 0; - flags |= pd.enumeration ? 1 : 0; - flags |= pd.integer_step ? 2 : 0; - flags |= pd.logarithmic ? 4 : 0; - flags |= pd.max_unbound ? 8 : 0; - flags |= pd.min_unbound ? 16 : 0; - flags |= pd.sr_dependent ? 32 : 0; - flags |= pd.toggled ? 64 : 0; - flags |= c != NULL ? 128 : 0; // bit 7 indicates in input control - lo_message_add_int32 (reply, flags); - - lo_message_add_int32 (reply, pd.datatype); - lo_message_add_float (reply, pd.lower); - lo_message_add_float (reply, pd.upper); - lo_message_add_string (reply, pd.print_fmt.c_str()); - if ( pd.scale_points ) { - lo_message_add_int32 (reply, pd.scale_points->size()); - for ( ARDOUR::ScalePoints::const_iterator i = pd.scale_points->begin(); i != pd.scale_points->end(); ++i) { - lo_message_add_int32 (reply, i->second); - lo_message_add_string (reply, ((std::string)i->first).c_str()); - } - } - else { - lo_message_add_int32 (reply, 0); - } - if ( c ) { - lo_message_add_double (reply, c->get_value()); - } - else { - lo_message_add_double (reply, 0); + lo_message_add_int32 (reply, ppi + 1); + ParameterDescriptor pd; + pi->plugin()->get_parameter_descriptor(controlid, pd); + lo_message_add_string (reply, pd.label.c_str()); + + // I've combined those binary descriptor parts in a bit-field to reduce lilo message elements + int flags = 0; + flags |= pd.enumeration ? 1 : 0; + flags |= pd.integer_step ? 2 : 0; + flags |= pd.logarithmic ? 4 : 0; + flags |= pd.max_unbound ? 8 : 0; + flags |= pd.min_unbound ? 16 : 0; + flags |= pd.sr_dependent ? 32 : 0; + flags |= pd.toggled ? 64 : 0; + flags |= pip->parameter_is_input(controlid) ? 0x80 : 0; + + std::string param_desc = pi->plugin()->describe_parameter(Evoral::Parameter(PluginAutomation, 0, controlid)); + flags |= (param_desc == X_("hidden")) ? 0x100 : 0; + lo_message_add_int32 (reply, flags); + + switch(pd.datatype) { + case ARDOUR::Variant::BEATS: + lo_message_add_string(reply, _("BEATS")); + break; + case ARDOUR::Variant::BOOL: + lo_message_add_string(reply, _("BOOL")); + break; + case ARDOUR::Variant::DOUBLE: + lo_message_add_string(reply, _("DOUBLE")); + break; + case ARDOUR::Variant::FLOAT: + lo_message_add_string(reply, _("FLOAT")); + break; + case ARDOUR::Variant::INT: + lo_message_add_string(reply, _("INT")); + break; + case ARDOUR::Variant::LONG: + lo_message_add_string(reply, _("LONG")); + break; + case ARDOUR::Variant::NOTHING: + lo_message_add_string(reply, _("NOTHING")); + break; + case ARDOUR::Variant::PATH: + lo_message_add_string(reply, _("PATH")); + break; + case ARDOUR::Variant::STRING: + lo_message_add_string(reply, _("STRING")); + break; + case ARDOUR::Variant::URI: + lo_message_add_string(reply, _("URI")); + break; + default: + lo_message_add_string(reply, _("UNKNOWN")); + break; + } + lo_message_add_float (reply, pd.lower); + lo_message_add_float (reply, pd.upper); + lo_message_add_string (reply, pd.print_fmt.c_str()); + if ( pd.scale_points ) { + lo_message_add_int32 (reply, pd.scale_points->size()); + for ( ARDOUR::ScalePoints::const_iterator i = pd.scale_points->begin(); i != pd.scale_points->end(); ++i) { + lo_message_add_float (reply, i->second); + lo_message_add_string (reply, ((std::string)i->first).c_str()); } } + else { + lo_message_add_int32 (reply, 0); + } + if ( c ) { + lo_message_add_double (reply, c->get_value()); + } + else { + lo_message_add_double (reply, 0); + } } lo_send_message (get_address (msg), "/strip/plugin/descriptor", reply); |
|
How will this extensive change affect those who have already created a surface based on current behavior? It seems it will break current surfaces using this code. |
|
Sorry, looking back at the code added earlier I see it is your's anyway and you are likely the only one using it. I didn't see this earlier. Your patch will not apply cleanly as the file has changed too much since. (there are about 1000 lines of new code above this) applying manually. |
|
Ok, I have added this to the code base. One concern I have is that with the plugins I have tested with, the pd.datatype is always "NOTHING". They are all LV2s, so maybe a different type of plugin does something else. Also, as pd.max_unbound and pd.min_unbound have already been removed from the code as per RG, I have not added them back in as your patch would suggest. |
|
Issue has been closed automatically, by Trigger Close Plugin. Feel free to re-open with additional information if you think the issue is not resolved. |
Date Modified | Username | Field | Change |
---|---|---|---|
2016-12-13 09:09 | .onkel. | New Issue | |
2016-12-13 09:09 | .onkel. | File Added: plugin_descriptor.patch | |
2017-01-12 07:05 | .onkel. | Sponsorship Added | .onkel.: US$ 5 |
2017-01-12 07:05 | .onkel. | Sponsorship Total | 0 => 5 |
2017-07-01 15:35 | ovenwerks | Note Added: 0019851 | |
2017-07-01 19:30 | ovenwerks | Note Added: 0019858 | |
2017-07-01 20:20 | ovenwerks | Note Added: 0019860 | |
2017-07-01 20:20 | ovenwerks | Status | new => resolved |
2017-07-01 20:20 | ovenwerks | Resolution | open => fixed |
2017-07-01 20:20 | ovenwerks | Assigned To | => ovenwerks |
2020-04-19 20:18 | system | Note Added: 0023695 | |
2020-04-19 20:18 | system | Status | resolved => closed |