From 93180ceea90e597828ea7473b8e181950df66427 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Sat, 14 Dec 2019 15:00:34 +0100 Subject: [PATCH] Add Inline Control Port Property This allows to indicate that a control should by default be displayed inline in the mixer-strip. Previously that was hard-coded for and enabled for send-level controls only. --- libs/ardour/ardour/parameter_descriptor.h | 1 + libs/ardour/lv2_plugin.cc | 8 ++++++++ libs/ardour/parameter_descriptor.cc | 5 ++++- libs/ardour/plugin_insert.cc | 5 ++++- libs/ardour/send.cc | 1 + libs/pbd/pbd/controllable.h | 9 +++++---- 6 files changed, 23 insertions(+), 6 deletions(-) diff --git a/libs/ardour/ardour/parameter_descriptor.h b/libs/ardour/ardour/parameter_descriptor.h index b9c0417ce6..1218448985 100644 --- a/libs/ardour/ardour/parameter_descriptor.h +++ b/libs/ardour/ardour/parameter_descriptor.h @@ -112,6 +112,7 @@ struct LIBARDOUR_API ParameterDescriptor : public Evoral::ParameterDescriptor bool integer_step; bool sr_dependent; bool enumeration; + bool inline_ctrl; }; } // namespace ARDOUR diff --git a/libs/ardour/lv2_plugin.cc b/libs/ardour/lv2_plugin.cc index c3ce6026ed..453c454714 100644 --- a/libs/ardour/lv2_plugin.cc +++ b/libs/ardour/lv2_plugin.cc @@ -213,6 +213,7 @@ public: LilvNode* auto_automation_controlled; // lv2:portProperty LilvNode* auto_automation_controller; // lv2:portProperty LilvNode* inline_display_in_gui; // lv2:optionalFeature + LilvNode* inline_mixer_control; // lv2:PortProperty #endif private: @@ -2279,6 +2280,10 @@ LV2Plugin::get_parameter_descriptor(uint32_t which, ParameterDescriptor& desc) c desc.enumeration = lilv_port_has_property(_impl->plugin, port, _world.lv2_enumeration); desc.scale_points = get_scale_points(which); +#ifdef LV2_EXTENDED + desc.inline_ctrl = lilv_port_has_property(_impl->plugin, port, _world.inline_mixer_control); +#endif + if (steps) { desc.rangesteps = lilv_node_as_float (steps); } @@ -3323,6 +3328,7 @@ LV2World::LV2World() auto_automation_controlled = lilv_new_uri(world, LV2_AUTOMATE_URI__controlled); auto_automation_controller = lilv_new_uri(world, LV2_AUTOMATE_URI__controller); inline_display_in_gui = lilv_new_uri(world, LV2_INLINEDISPLAY__in_gui); + inline_mixer_control = lilv_new_uri(world, "http://ardour.org/lv2/ext#inlineMixerControl"); #endif bufz_powerOf2BlockLength = lilv_new_uri(world, LV2_BUF_SIZE__powerOf2BlockLength); bufz_fixedBlockLength = lilv_new_uri(world, LV2_BUF_SIZE__fixedBlockLength); @@ -3346,6 +3352,8 @@ LV2World::~LV2World() lilv_node_free(auto_automation_control); lilv_node_free(auto_automation_controlled); lilv_node_free(auto_automation_controller); + lilv_node_free(inline_display_in_gui); + lilv_node_free(inline_mixer_control); #endif lilv_node_free(patch_Message); lilv_node_free(opts_requiredOptions); diff --git a/libs/ardour/parameter_descriptor.cc b/libs/ardour/parameter_descriptor.cc index d959072fb5..0559927d21 100644 --- a/libs/ardour/parameter_descriptor.cc +++ b/libs/ardour/parameter_descriptor.cc @@ -53,8 +53,10 @@ ParameterDescriptor::ParameterDescriptor(const Evoral::Parameter& parameter) /* Note: defaults in Evoral::ParameterDescriptor */ switch((AutomationType)parameter.type()) { - case GainAutomation: case BusSendLevel: + inline_ctrl = true; + /* fallthrough */ + case GainAutomation: upper = Config->get_max_gain(); normal = 1.0f; break; @@ -150,6 +152,7 @@ ParameterDescriptor::ParameterDescriptor() , integer_step(false) , sr_dependent(false) , enumeration(false) + , inline_ctrl(false) {} void diff --git a/libs/ardour/plugin_insert.cc b/libs/ardour/plugin_insert.cc index 9b4aa17b0c..22e40e4b63 100644 --- a/libs/ardour/plugin_insert.cc +++ b/libs/ardour/plugin_insert.cc @@ -486,9 +486,12 @@ PluginInsert::create_automatable_parameters () boost::shared_ptr list(new AutomationList(param, desc)); boost::shared_ptr c (new PluginControl(this, param, desc, list)); - if (!automatable || (limit_automatables > 0 && i > limit_automatables)) { + if (!automatable || (limit_automatables > 0 && what_can_be_automated ().size() > limit_automatables)) { c->set_flags (Controllable::Flag ((int)c->flags() | Controllable::NotAutomatable)); } + if (desc.inline_ctrl) { + c->set_flags (Controllable::Flag ((int)c->flags() | Controllable::InlineControl)); + } add_control (c); plugin->set_automation_control (i, c); } diff --git a/libs/ardour/send.cc b/libs/ardour/send.cc index 78246eca82..d913693909 100644 --- a/libs/ardour/send.cc +++ b/libs/ardour/send.cc @@ -102,6 +102,7 @@ Send::Send (Session& s, boost::shared_ptr p, boost::shared_ptr gl (new AutomationList (Evoral::Parameter (GainAutomation))); _gain_control = boost::shared_ptr (new GainControl (_session, Evoral::Parameter(BusSendLevel), gl)); + _gain_control->set_flags (Controllable::Flag ((int)_gain_control->flags() | Controllable::InlineControl)); add_control (_gain_control); _amp.reset (new Amp (_session, _("Fader"), _gain_control, true)); diff --git a/libs/pbd/pbd/controllable.h b/libs/pbd/pbd/controllable.h index a83a42bcb3..3d5dd5fc65 100644 --- a/libs/pbd/pbd/controllable.h +++ b/libs/pbd/pbd/controllable.h @@ -73,10 +73,11 @@ class LIBPBD_API Controllable : public PBD::StatefulDestructible, public boost:: { public: enum Flag { - Toggle = 0x1, - GainLike = 0x2, - RealTime = 0x4, - NotAutomatable = 0x8, + Toggle = 0x01, + GainLike = 0x02, + RealTime = 0x04, + NotAutomatable = 0x08, + InlineControl = 0x10, }; Controllable (const std::string& name, Flag f = Flag (0));