diff --git a/libs/surfaces/console1/c1_control.h b/libs/surfaces/console1/c1_control.h index e3ec5cb022..36c241fb10 100644 --- a/libs/surfaces/console1/c1_control.h +++ b/libs/surfaces/console1/c1_control.h @@ -6,8 +6,6 @@ namespace ArdourSurface { -using namespace PBD; - using ControllerID = Console1::ControllerID; class Controller @@ -22,7 +20,7 @@ class Controller METER }; - Controller (Console1& console1, ControllerID id) + Controller (Console1* console1, ControllerID id) : console1 (console1) , _id (id) { @@ -30,7 +28,7 @@ class Controller virtual ~Controller () {} - Console1& console1; + Console1* console1; ControllerID id () const { return _id; } virtual ControllerType get_type () { return CONTROLLER; } @@ -42,22 +40,23 @@ class Controller class ControllerButton : public Controller { public: - ControllerButton (Console1& console1, + ControllerButton (Console1* console1, ControllerID id, boost::function action, boost::function shift_action = 0, - boost::function plugin_action = 0 - ) + boost::function plugin_action = 0) : Controller (console1, id) , action (action) , shift_action (shift_action) - , plugin_action (plugin_action) + , plugin_action (plugin_action) { - console1.buttons.insert (std::make_pair (id, *this)); + console1->buttons.insert (std::make_pair (id, this)); } ControllerType get_type () { return CONTROLLER_BUTTON; } + void set_plugin_action (boost::function action) { plugin_action = action; } + virtual void set_led_state (bool onoff) { // DEBUG_TRACE(DEBUG::Console1, "ControllerButton::set_led_state ...\n"); @@ -66,7 +65,7 @@ class ControllerButton : public Controller buf[1] = _id; buf[2] = onoff ? 127 : 0; - console1.write (buf, 3); + console1->write (buf, 3); } virtual void set_led_value (uint32_t val) @@ -77,7 +76,7 @@ class ControllerButton : public Controller buf[1] = _id; buf[2] = val; - console1.write (buf, 3); + console1->write (buf, 3); } boost::function action; boost::function shift_action; @@ -87,7 +86,7 @@ class ControllerButton : public Controller class MultiStateButton : public Controller { public: - MultiStateButton (Console1& console1, + MultiStateButton (Console1* console1, ControllerID id, std::vector state_values, boost::function action, @@ -97,7 +96,7 @@ class MultiStateButton : public Controller , shift_action (shift_action) , state_values (state_values) { - console1.multi_buttons.insert (std::make_pair (id, *this)); + console1->multi_buttons.insert (std::make_pair (id, this)); } ControllerType get_type () { return MULTISTATE_BUTTON; } @@ -111,7 +110,7 @@ class MultiStateButton : public Controller buf[1] = _id; buf[2] = state_values[state]; - console1.write (buf, 3); + console1->write (buf, 3); } uint32_t state_count () { return state_values.size (); } @@ -126,7 +125,7 @@ class MultiStateButton : public Controller class Meter : public Controller { public: - Meter (Console1& console1, + Meter (Console1* console1, ControllerID id, boost::function action, boost::function shift_action = 0) @@ -134,7 +133,7 @@ class Meter : public Controller , action (action) , shift_action (shift_action) { - console1.meters.insert (std::make_pair (id, *this)); + console1->meters.insert (std::make_pair (id, this)); } ControllerType get_type () { return METER; } @@ -146,7 +145,7 @@ class Meter : public Controller buf[1] = _id; buf[2] = value; - console1.write (buf, 3); + console1->write (buf, 3); } boost::function action; boost::function shift_action; @@ -155,19 +154,23 @@ class Meter : public Controller class Encoder : public Controller { public: - Encoder (Console1& console1, + Encoder (Console1* console1, ControllerID id, boost::function action, - boost::function shift_action = 0) + boost::function shift_action = 0, + boost::function plugin_action = 0) : Controller (console1, id) , action (action) , shift_action (shift_action) + , plugin_action (plugin_action) { - console1.encoders.insert (std::make_pair (id, *this)); + console1->encoders.insert (std::make_pair (id, this)); } ControllerType get_type () { return ENCODER; } + void set_plugin_action (boost::function action) { plugin_action = action; } + virtual void set_value (uint32_t value) { MIDI::byte buf[3]; @@ -175,10 +178,13 @@ class Encoder : public Controller buf[1] = _id; buf[2] = value; - console1.write (buf, 3); + console1->write (buf, 3); } boost::function action; boost::function shift_action; + boost::function plugin_action; + + PBD::Signal1* plugin_signal; }; } diff --git a/libs/surfaces/console1/c1_operations.cc b/libs/surfaces/console1/c1_operations.cc index d65a45cc65..9f374be9e9 100644 --- a/libs/surfaces/console1/c1_operations.cc +++ b/libs/surfaces/console1/c1_operations.cc @@ -123,7 +123,7 @@ Console1::rude_solo (const uint32_t value) session->cancel_all_solo (); } else { try { - get_button (ControllerID::DISPLAY_ON).set_led_state (false); + get_button (ControllerID::DISPLAY_ON)->set_led_state (false); } catch (ControlNotFoundException& e) { DEBUG_TRACE (DEBUG::Console1, "Button not found\n"); } @@ -547,8 +547,8 @@ Console1::map_bank () { uint32_t list_size = strip_inventory.size (); try { - get_button (PAGE_UP).set_led_state (list_size > (current_bank + 1) * bank_size); - get_button (PAGE_DOWN).set_led_state (current_bank > 0); + get_button (PAGE_UP)->set_led_state (list_size > (current_bank + 1) * bank_size); + get_button (PAGE_DOWN)->set_led_state (current_bank > 0); } catch (ControlNotFoundException& e) { DEBUG_TRACE (DEBUG::Console1, "Button not found\n"); } @@ -581,7 +581,7 @@ Console1::map_mute () DEBUG_TRACE (DEBUG::Console1, "Console1::map_mute ...\n"); if (_current_stripable) { if (_current_stripable->mute_control ()->muted ()) { - get_button (MUTE).set_led_state (true); + get_button (MUTE)->set_led_state (true); } else if (_current_stripable->mute_control ()->muted_by_others_soloing () || _current_stripable->mute_control ()->muted_by_masters ()) { @@ -611,7 +611,7 @@ void Console1::map_phase () { DEBUG_TRACE (DEBUG::Console1, "map_phase \n"); - ControllerButton& controllerButton = static_cast (get_button (PHASE_INV)); + ControllerButton* controllerButton = get_button (PHASE_INV); if (_current_stripable) { uint32_t channels = _current_stripable->phase_control ()->size (); uint32_t inverted = 0; @@ -621,14 +621,14 @@ Console1::map_phase () } if (inverted == 0) { stop_blinking (PHASE_INV); - controllerButton.set_led_state (false); + controllerButton->set_led_state (false); } else if (inverted == channels) { stop_blinking (PHASE_INV); - controllerButton.set_led_state (true); + controllerButton->set_led_state (true); } else start_blinking (PHASE_INV); } else { - controllerButton.set_led_state (false); + controllerButton->set_led_state (false); } } @@ -648,7 +648,7 @@ Console1::map_select () { DEBUG_TRACE (DEBUG::Console1, "map_select())\n"); for (uint32_t i = 0; i < bank_size; ++i) { - get_button (ControllerID (FOCUS1 + i)).set_led_state (i == current_strippable_index); + get_button (ControllerID (FOCUS1 + i))->set_led_state (i == current_strippable_index); } } @@ -657,8 +657,8 @@ Console1::map_shift (bool shift) { DEBUG_TRACE (DEBUG::Console1, "map_shift()\n"); try { - ControllerButton& controllerButton = static_cast (get_button (PRESET)); - controllerButton.set_led_state (shift); + ControllerButton* controllerButton = get_button (PRESET); + controllerButton->set_led_state (shift); map_stripable_state (); } catch (ControlNotFoundException& e) { DEBUG_TRACE (DEBUG::Console1, "Button not found\n"); @@ -670,8 +670,8 @@ Console1::map_plugin_state (bool plugin_state) { DEBUG_TRACE (DEBUG::Console1, "map_plugin_state()\n"); try { - ControllerButton& controllerButton = static_cast (get_button (TRACK_GROUP)); - controllerButton.set_led_state (in_plugin_state); + ControllerButton* controllerButton = get_button (TRACK_GROUP); + controllerButton->set_led_state (in_plugin_state); } catch (ControlNotFoundException& e) { DEBUG_TRACE (DEBUG::Console1, "Button not found\n"); } @@ -692,11 +692,11 @@ Console1::map_solo () { DEBUG_TRACE (DEBUG::Console1, "map_solo()\n"); try { - ControllerButton& controllerButton = static_cast (get_button (SOLO)); + ControllerButton* controllerButton = get_button (SOLO); if (_current_stripable) { - controllerButton.set_led_state (_current_stripable->solo_control ()->soloed ()); + controllerButton->set_led_state (_current_stripable->solo_control ()->soloed ()); } else { - controllerButton.set_led_state (false); + controllerButton->set_led_state (false); } } catch (ControlNotFoundException& e) { DEBUG_TRACE (DEBUG::Console1, "Button not found\n"); @@ -722,7 +722,7 @@ Console1::map_filter () } try { get_button (ControllerID::FILTER_TO_COMPRESSORS) - .set_led_state (_current_stripable->filter_enable_controllable (true) + ->set_led_state (_current_stripable->filter_enable_controllable (true) ? _current_stripable->filter_enable_controllable (true)->get_value () : false); } catch (ControlNotFoundException& e) { @@ -758,7 +758,7 @@ Console1::map_gate () return; try { get_button (ControllerID::SHAPE) - .set_led_state (_current_stripable->gate_enable_controllable () + ->set_led_state (_current_stripable->gate_enable_controllable () ? _current_stripable->gate_enable_controllable ()->get_value () : false); } catch (ControlNotFoundException& e) { @@ -774,7 +774,7 @@ Console1::map_gate_scf () try { DEBUG_TRACE (DEBUG::Console1, string_compose ("map_gate_scf() - shift: %1\n", shift_state)); get_button (ControllerID::HARD_GATE) - .set_led_state (_current_stripable->gate_key_filter_enable_controllable () + ->set_led_state (_current_stripable->gate_key_filter_enable_controllable () ? _current_stripable->gate_key_filter_enable_controllable ()->get_value () : false); } catch (ControlNotFoundException& e) { @@ -790,7 +790,7 @@ Console1::map_gate_listen () try { DEBUG_TRACE (DEBUG::Console1, string_compose ("map_gate_listen() - shift: %1\n", shift_state)); get_button (ControllerID::HARD_GATE) - .set_led_state (_current_stripable->gate_key_listen_controllable () + ->set_led_state (_current_stripable->gate_key_listen_controllable () ? _current_stripable->gate_key_listen_controllable ()->get_value () : false); } catch (ControlNotFoundException& e) { @@ -893,7 +893,7 @@ Console1::map_eq () if (!_current_stripable) return; try { - get_button (EQ).set_led_state (_current_stripable->eq_enable_controllable () + get_button (EQ)->set_led_state (_current_stripable->eq_enable_controllable () ? _current_stripable->eq_enable_controllable ()->get_value () : false); } catch (ControlNotFoundException& e) { @@ -936,7 +936,7 @@ Console1::map_eq_low_shape () uint32_t led_value = _current_stripable->eq_shape_controllable (0) ? _current_stripable->eq_shape_controllable (0)->get_value () == 0 ? 0 : 63 : 0; - get_button (ControllerID::LOW_SHAPE).set_led_state (led_value); + get_button (ControllerID::LOW_SHAPE)->set_led_state (led_value); } catch (ControlNotFoundException& e) { DEBUG_TRACE (DEBUG::Console1, "Button not found\n"); } @@ -951,7 +951,7 @@ Console1::map_eq_high_shape () uint32_t led_value = _current_stripable->eq_shape_controllable (3) ? _current_stripable->eq_shape_controllable (3)->get_value () == 0 ? 0 : 63 : 0; - get_button (ControllerID::HIGH_SHAPE).set_led_state (led_value); + get_button (ControllerID::HIGH_SHAPE)->set_led_state (led_value); } catch (ControlNotFoundException& e) { DEBUG_TRACE (DEBUG::Console1, "Button not found\n"); } @@ -969,7 +969,7 @@ Console1::map_drive () double val = control->get_value (); DEBUG_TRACE (DEBUG::Console1, string_compose ("map_drive audio track %1\n", val)); try { - get_encoder (controllerID).set_value (val == 1 ? 127 : 0); + get_encoder (controllerID)->set_value (val == 1 ? 127 : 0); } catch (ControlNotFoundException& e) { DEBUG_TRACE (DEBUG::Console1, "Encoder not found\n"); } @@ -1011,7 +1011,7 @@ Console1::map_comp () return; try { get_button (ControllerID::COMP) - .set_led_state (_current_stripable->comp_enable_controllable () + ->set_led_state (_current_stripable->comp_enable_controllable () ? _current_stripable->comp_enable_controllable ()->get_value () : false); } catch (ControlNotFoundException& e) { @@ -1029,7 +1029,7 @@ Console1::map_comp_mode () ? _current_stripable->comp_mode_controllable ()->get_value () : false; DEBUG_TRACE (DEBUG::Console1, string_compose ("****value from comp-type %1\n", value)); - get_mbutton (ControllerID::ORDER).set_led_state (value); + get_mbutton (ControllerID::ORDER)->set_led_state (value); } catch (ControlNotFoundException& e) { DEBUG_TRACE (DEBUG::Console1, "Button not found\n"); } @@ -1100,7 +1100,7 @@ Console1::map_encoder (ControllerID controllerID) { if (!_current_stripable) { try { - get_encoder (controllerID).set_value (0); + get_encoder (controllerID)->set_value (0); } catch (ControlNotFoundException& e) { DEBUG_TRACE (DEBUG::Console1, "Encoder not found\n"); return false; @@ -1116,7 +1116,7 @@ Console1::map_encoder (ControllerID controllerID, std::shared_ptrset_value (0); } catch (ControlNotFoundException& e) { DEBUG_TRACE (DEBUG::Console1, "Encoder not found\n"); } @@ -1133,7 +1133,7 @@ Console1::map_encoder (ControllerID controllerID, std::shared_ptrset_value (gain); } catch (ControlNotFoundException& e) { DEBUG_TRACE (DEBUG::Console1, "Encoder not found\n"); } diff --git a/libs/surfaces/console1/c1_plugin_operations.cc b/libs/surfaces/console1/c1_plugin_operations.cc index fdbd03dc3f..14e11eb998 100644 --- a/libs/surfaces/console1/c1_plugin_operations.cc +++ b/libs/surfaces/console1/c1_plugin_operations.cc @@ -130,6 +130,24 @@ void Console1::select_plugin (uint32_t plugin_index) { DEBUG_TRACE (DEBUG::Console1, "Console1::select_plugin\n"); + if (current_plugin_index == plugin_index) { + std::shared_ptr r = std::dynamic_pointer_cast (_current_stripable); + if (!r) { + return; + } + std::shared_ptr proc = r->nth_plugin (plugin_index); + if (!proc) { + return; + } + if (!proc->display_to_user ()) { + return; + } + std::shared_ptr plugin_insert = std::dynamic_pointer_cast (proc); + if (!plugin_insert) + return; + plugin_insert->ToggleUI (); + return; + } current_plugin_index = plugin_index; map_select_plugin (); } @@ -157,21 +175,22 @@ Console1::spill_plugins (uint32_t plugin_index) return false; } - // drop_ctrl_connections (); + plugin_connections.drop_connections (); - // switching to "Mode Track" -> calls FaderPort8::notify_fader_mode_changed() - // which drops the references, disconnects the signal and re-spills tracks - /*r->DropReferences.connect ( - processor_connections, MISSING_INVALIDATOR, boost::bind (&FP8Controls::set_fader_mode, &_ctrls, ModeTrack), this); + for (auto& e : encoders) { + e.second->set_plugin_action (0); + e.second->set_value (0); + } + for (auto& c : buttons) { + if( c.first == ControllerID::TRACK_GROUP ) + continue; + if( c.first >= ControllerID::FOCUS1 && c.first <= ControllerID::FOCUS20 ) + continue; + c.second->set_plugin_action (0); + c.second->set_led_state (false); + } - // update when processor change - r->processors_changed.connect ( - processor_connections, MISSING_INVALIDATOR, boost::bind (&FaderPort8::spill_plugins, this), this);*/ - - // count available - std::shared_ptr proc; - - proc = r->nth_plugin (plugin_index); + std::shared_ptr proc = r->nth_plugin (plugin_index); if (!proc) { return false; } @@ -186,7 +205,7 @@ Console1::spill_plugins (uint32_t plugin_index) } #endif - int n_controls = 0; + int32_t n_controls = -1; DEBUG_TRACE (DEBUG::Console1, string_compose ("Found plugin %1\n", proc->name ())); std::shared_ptr plugin_insert = std::dynamic_pointer_cast (proc); if (!plugin_insert) @@ -200,7 +219,7 @@ Console1::spill_plugins (uint32_t plugin_index) PluginMappingMap::iterator pmmit = pluginMappingMap.find (plugin->unique_id ()); if (pmmit == pluginMappingMap.end ()) { - return false; + return true; } PluginMapping pluginMapping = pmmit->second; @@ -209,7 +228,27 @@ Console1::spill_plugins (uint32_t plugin_index) set p = proc->what_can_be_automated (); + PluginParameterMapping enableMapping = pluginMapping.parameters[-1]; + if (enableMapping.controllerId != 0) { + try { + ControllerButton* cb = get_button (enableMapping.controllerId); + boost::function plugin_mapping = [=] () -> void { cb->set_led_state (plugin_insert->enabled ()); }; + cb->set_plugin_action ([=] (uint32_t val) { + plugin_insert->enable (val == 127); + DEBUG_TRACE (DEBUG::Console1, + string_compose ("ControllerButton Plugin parameter %1: %2 \n", n_controls, val)); + }); + + plugin_insert->ActiveChanged.connect ( + plugin_connections, MISSING_INVALIDATOR, boost::bind (plugin_mapping), this); + plugin_insert->ActiveChanged (); + } catch (ControlNotFoundException&) { + DEBUG_TRACE (DEBUG::Console1, string_compose ("No ControllerButton found %1\n", n_controls)); + } + } + for (set::iterator j = p.begin (); j != p.end (); ++j) { + ++n_controls; std::string n = proc->describe_parameter (*j); DEBUG_TRACE (DEBUG::Console1, string_compose ("Plugin parameter %1: %2\n", n_controls, n)); if (n == "hidden") { @@ -217,6 +256,15 @@ Console1::spill_plugins (uint32_t plugin_index) } ParameterDescriptor parameterDescriptor; plugin->get_parameter_descriptor (n_controls, parameterDescriptor); + if (plugin->parameter_is_control (n_controls)) { + DEBUG_TRACE (DEBUG::Console1, "parameter is control\n"); + } + if (plugin->parameter_is_output (n_controls)) { + DEBUG_TRACE (DEBUG::Console1, "parameter is output\n"); + } + if (plugin->parameter_is_audio (n_controls)) { + DEBUG_TRACE (DEBUG::Console1, "parameter is audio\n"); + } if (plugin->parameter_is_input (n_controls)) { std::shared_ptr c = plugin_insert->automation_control (Evoral::Parameter (PluginAutomation, 0, n_controls)); @@ -226,15 +274,60 @@ Console1::spill_plugins (uint32_t plugin_index) swtch = true; } PluginParameterMapping ppm = pluginMapping.parameters[n_controls]; - ppm.controllerId; - // c->Changed.connect (plugin_connections, MISSING_INVALIDATOR, boost::bind - // (&OSCSelectObserver::plugin_parameter_changed, this, pid, swtch, c), OSC::instance()); - // plugin_parameter_changed (pid, swtch, c); + try { + Encoder* e = get_encoder (ppm.controllerId); + boost::function plugin_mapping = + [=] (bool b, PBD::Controllable::GroupControlDisposition d) -> void { + double v = parameterDescriptor.to_interface (c->get_value (), true); + e->set_value (v * 127); + }; + e->set_plugin_action ([=] (uint32_t val) { + double v = val / 127.f; + c->set_value (parameterDescriptor.from_interface (v, true), + PBD::Controllable::GroupControlDisposition::UseGroup); + DEBUG_TRACE (DEBUG::Console1, + string_compose ("Encoder Plugin parameter %1: %2 - %3\n", n_controls, val, v)); + }); + c->Changed.connect ( + plugin_connections, MISSING_INVALIDATOR, boost::bind (plugin_mapping, _1, _2), this); + c->Changed (true, PBD::Controllable::GroupControlDisposition::UseGroup); + continue; + } catch (ControlNotFoundException&) { + DEBUG_TRACE (DEBUG::Console1, string_compose ("No Encoder found %1\n", n_controls)); + } + try { + ControllerButton* cb = get_button (ppm.controllerId); + boost::function plugin_mapping = + [=] (bool b, PBD::Controllable::GroupControlDisposition d) -> void { + // double v = parameterDescriptor.to_interface (c->get_value (), true); + // e->set_value (v * 127); + cb->set_led_state (c->get_value ()); + }; + cb->set_plugin_action ([=] (uint32_t val) { + double v = val / 127.f; + c->set_value (parameterDescriptor.from_interface (v, true), + PBD::Controllable::GroupControlDisposition::UseGroup); + DEBUG_TRACE ( + DEBUG::Console1, + string_compose ("ControllerButton Plugin parameter %1: %2 - %3\n", n_controls, val, v)); + }); + + c->Changed.connect ( + plugin_connections, MISSING_INVALIDATOR, boost::bind (plugin_mapping, _1, _2), this); + c->Changed (true, PBD::Controllable::GroupControlDisposition::UseGroup); + continue; + } catch (ControlNotFoundException&) { + DEBUG_TRACE (DEBUG::Console1, string_compose ("No ControllerButton found %1\n", n_controls)); + } } } - - ++n_controls; } return true; } + +void +Console1::map_p () +{ + DEBUG_TRACE (DEBUG::Console1, "Console1::map_p"); +} } \ No newline at end of file diff --git a/libs/surfaces/console1/console1.cc b/libs/surfaces/console1/console1.cc index 5b0bb818d7..77fa3cbca5 100644 --- a/libs/surfaces/console1/console1.cc +++ b/libs/surfaces/console1/console1.cc @@ -63,6 +63,19 @@ Console1::~Console1 () tear_down_gui (); + for( const auto &[a, b] : buttons ){ + delete b; + } + for( const auto &[a, b] : encoders ){ + delete b; + } + for( const auto &[a, b] : meters ){ + delete b; + } + for( const auto &[a, b] : multi_buttons ){ + delete b; + } + /* stop event loop */ DEBUG_TRACE (DEBUG::Console1, "BaseUI::quit ()\n"); @@ -73,7 +86,7 @@ void Console1::all_lights_out () { for (ButtonMap::iterator b = buttons.begin (); b != buttons.end (); ++b) { - b->second.set_led_state (false); + b->second->set_led_state (false); } } @@ -94,7 +107,7 @@ Console1::set_active (bool yn) BaseUI::run (); - connect_session_signals (); + // connect_session_signals (); } else { /* Control Protocol Manager never calls us with false, but @@ -227,161 +240,150 @@ Console1::setup_controls () { for (uint32_t i = 0; i < 20; ++i) { - ControllerButton track_select_button ( - *this, - ControllerID (FOCUS1 + i), - boost::function (boost::bind (&Console1::select, this, i)), - 0, - boost::function (boost::bind (&Console1::select_plugin, this, i))); + new ControllerButton (this, + ControllerID (FOCUS1 + i), + boost::function (boost::bind (&Console1::select, this, i)), + 0, + boost::function (boost::bind (&Console1::select_plugin, this, i))); } - ControllerButton shift_button ( - *this, ControllerID::PRESET, boost::function (boost::bind (&Console1::shift, this, _1))); + new ControllerButton ( + this, ControllerID::PRESET, boost::function (boost::bind (&Console1::shift, this, _1))); - ControllerButton plugin_state_button ( - *this, - ControllerID::TRACK_GROUP, - boost::function (boost::bind (&Console1::plugin_state, this, _1))); + new ControllerButton (this, + ControllerID::TRACK_GROUP, + boost::function (boost::bind (&Console1::plugin_state, this, _1))); - ControllerButton rude_solo ( - *this, ControllerID::DISPLAY_ON, boost::function (boost::bind (&Console1::rude_solo, this, _1))); - ControllerButton zoom_button ( - *this, ControllerID::MODE, boost::function (boost::bind (&Console1::zoom, this, _1))); - MultiStateButton view (*this, - ControllerID::EXTERNAL_SIDECHAIN, - std::vector{ 0, 63, 127 }, - boost::function (boost::bind (&Console1::window, this, _1))); + new ControllerButton ( + this, ControllerID::DISPLAY_ON, boost::function (boost::bind (&Console1::rude_solo, this, _1))); + new ControllerButton ( + this, ControllerID::MODE, boost::function (boost::bind (&Console1::zoom, this, _1))); + new MultiStateButton (this, + ControllerID::EXTERNAL_SIDECHAIN, + std::vector{ 0, 63, 127 }, + boost::function (boost::bind (&Console1::window, this, _1))); - ControllerButton bank_up_button ( - *this, ControllerID::PAGE_UP, boost::function (boost::bind (&Console1::bank, this, true))); - ControllerButton bank_down_button ( - *this, ControllerID::PAGE_DOWN, boost::function (boost::bind (&Console1::bank, this, false))); + new ControllerButton ( + this, ControllerID::PAGE_UP, boost::function (boost::bind (&Console1::bank, this, true))); + new ControllerButton ( + this, ControllerID::PAGE_DOWN, boost::function (boost::bind (&Console1::bank, this, false))); - ControllerButton mute_button ( - *this, ControllerID::MUTE, boost::function (boost::bind (&Console1::mute, this, _1))); - ControllerButton solo_button ( - *this, ControllerID::SOLO, boost::function (boost::bind (&Console1::solo, this, _1))); - ControllerButton phase_button ( - *this, ControllerID::PHASE_INV, boost::function (boost::bind (&Console1::phase, this, _1))); + new ControllerButton ( + this, ControllerID::MUTE, boost::function (boost::bind (&Console1::mute, this, _1))); + new ControllerButton ( + this, ControllerID::SOLO, boost::function (boost::bind (&Console1::solo, this, _1))); + new ControllerButton ( + this, ControllerID::PHASE_INV, boost::function (boost::bind (&Console1::phase, this, _1))); /* Console 1: Input Gain - Ardour / Mixbus: Trim */ - Encoder trim_encoder ( - *this, ControllerID::GAIN, boost::function (boost::bind (&Console1::trim, this, _1))); + new Encoder (this, ControllerID::GAIN, boost::function (boost::bind (&Console1::trim, this, _1))); /* Console 1: Volume - Ardour / Mixbus: Gain */ - Encoder gain_encoder ( - *this, ControllerID::VOLUME, boost::function (boost::bind (&Console1::gain, this, _1))); + new Encoder ( + this, ControllerID::VOLUME, boost::function (boost::bind (&Console1::gain, this, _1))); - Encoder pan_encoder ( - *this, ControllerID::PAN, boost::function (boost::bind (&Console1::pan, this, _1))); + new Encoder (this, ControllerID::PAN, boost::function (boost::bind (&Console1::pan, this, _1))); /* Filter Section*/ - ControllerButton filter_button (*this, - ControllerID::FILTER_TO_COMPRESSORS, - boost::function (boost::bind (&Console1::filter, this, _1))); - Encoder low_cut_encoder ( - *this, ControllerID::LOW_CUT, boost::function (boost::bind (&Console1::low_cut, this, _1))); - Encoder high_cut_encoder ( - *this, ControllerID::HIGH_CUT, boost::function (boost::bind (&Console1::high_cut, this, _1))); + new ControllerButton (this, + ControllerID::FILTER_TO_COMPRESSORS, + boost::function (boost::bind (&Console1::filter, this, _1))); + new Encoder ( + this, ControllerID::LOW_CUT, boost::function (boost::bind (&Console1::low_cut, this, _1))); + new Encoder ( + this, ControllerID::HIGH_CUT, boost::function (boost::bind (&Console1::high_cut, this, _1))); /* Gate Section */ - ControllerButton gate_on_off ( - *this, ControllerID::SHAPE, boost::function (boost::bind (&Console1::gate, this, _1))); - ControllerButton gate_scf_listen ( - *this, - ControllerID::HARD_GATE, - boost::function (boost::bind (&Console1::gate_scf, this, _1)), - boost::function (boost::bind (&Console1::gate_listen, this, _1))); - Encoder gate_thresh_encoder (*this, - ControllerID::SHAPE_GATE, - boost::function (boost::bind (&Console1::gate_thresh, this, _1))); - Encoder gate_release_encoder (*this, - ControllerID::SHAPE_RELEASE, - boost::function (boost::bind (&Console1::gate_release, this, _1)), - boost::function (boost::bind (&Console1::gate_hyst, this, _1))); - Encoder gate_attack_encoder (*this, - ControllerID::SHAPE_SUSTAIN, - boost::function (boost::bind (&Console1::gate_attack, this, _1)), - boost::function (boost::bind (&Console1::gate_hold, this, _1))); - Encoder gate_depth_encoder (*this, - ControllerID::SHAPE_PUNCH, - boost::function (boost::bind (&Console1::gate_depth, this, _1)), - boost::function (boost::bind (&Console1::gate_filter_freq, this, _1))); + new ControllerButton ( + this, ControllerID::SHAPE, boost::function (boost::bind (&Console1::gate, this, _1))); + new ControllerButton (this, + ControllerID::HARD_GATE, + boost::function (boost::bind (&Console1::gate_scf, this, _1)), + boost::function (boost::bind (&Console1::gate_listen, this, _1))); + new Encoder (this, + ControllerID::SHAPE_GATE, + boost::function (boost::bind (&Console1::gate_thresh, this, _1))); + new Encoder (this, + ControllerID::SHAPE_RELEASE, + boost::function (boost::bind (&Console1::gate_release, this, _1)), + boost::function (boost::bind (&Console1::gate_hyst, this, _1))); + new Encoder (this, + ControllerID::SHAPE_SUSTAIN, + boost::function (boost::bind (&Console1::gate_attack, this, _1)), + boost::function (boost::bind (&Console1::gate_hold, this, _1))); + new Encoder (this, + ControllerID::SHAPE_PUNCH, + boost::function (boost::bind (&Console1::gate_depth, this, _1)), + boost::function (boost::bind (&Console1::gate_filter_freq, this, _1))); - Meter gate_meter (*this, ControllerID::SHAPE_METER, boost::function ([] () {})); + new Meter (this, ControllerID::SHAPE_METER, boost::function ([] () {})); /* EQ Section */ - ControllerButton eq_on_off ( - *this, ControllerID::EQ, boost::function (boost::bind (&Console1::eq, this, _1))); + new ControllerButton ( + this, ControllerID::EQ, boost::function (boost::bind (&Console1::eq, this, _1))); for (uint32_t i = 0; i < 4; ++i) { - Encoder low_freq_encoder ( - *this, - eq_freq_controller_for_band (i), - boost::function (boost::bind (&Console1::eq_freq, this, i, _1)), - boost::function (boost::bind (&Console1::mb_send_level, this, i, _1))); - Encoder low_gain_encoder ( - *this, - eq_gain_controller_for_band (i), - boost::function (boost::bind (&Console1::eq_gain, this, i, _1)), - boost::function (boost::bind (&Console1::mb_send_level, this, i + 4, _1))); + new Encoder (this, + eq_freq_controller_for_band (i), + boost::function (boost::bind (&Console1::eq_freq, this, i, _1)), + boost::function (boost::bind (&Console1::mb_send_level, this, i, _1))); + new Encoder (this, + eq_gain_controller_for_band (i), + boost::function (boost::bind (&Console1::eq_gain, this, i, _1)), + boost::function (boost::bind (&Console1::mb_send_level, this, i + 4, _1))); } - Encoder low_mid_shape_encoder ( - *this, - ControllerID::LOW_MID_SHAPE, - boost::function (boost::bind (&Console1::mb_send_level, this, 10, _1)), - boost::function (boost::bind (&Console1::mb_send_level, this, 8, _1))); - Encoder high_mid_shape_encoder ( - *this, - ControllerID::HIGH_MID_SHAPE, - boost::function (boost::bind (&Console1::mb_send_level, this, 11, _1)), - boost::function (boost::bind (&Console1::mb_send_level, this, 9, _1))); + new Encoder (this, + ControllerID::LOW_MID_SHAPE, + boost::function (boost::bind (&Console1::mb_send_level, this, 10, _1)), + boost::function (boost::bind (&Console1::mb_send_level, this, 8, _1))); + new Encoder (this, + ControllerID::HIGH_MID_SHAPE, + boost::function (boost::bind (&Console1::mb_send_level, this, 11, _1)), + boost::function (boost::bind (&Console1::mb_send_level, this, 9, _1))); - ControllerButton eq_low_shape (*this, - ControllerID::LOW_SHAPE, - boost::function (boost::bind (&Console1::eq_low_shape, this, _1))); - ControllerButton eq_high_shape ( - *this, - ControllerID::HIGH_SHAPE, - boost::function (boost::bind (&Console1::eq_high_shape, this, _1))); + new ControllerButton (this, + ControllerID::LOW_SHAPE, + boost::function (boost::bind (&Console1::eq_low_shape, this, _1))); + new ControllerButton (this, + ControllerID::HIGH_SHAPE, + boost::function (boost::bind (&Console1::eq_high_shape, this, _1))); - Encoder drive_encoder ( - *this, ControllerID::CHARACTER, boost::function (boost::bind (&Console1::drive, this, _1))); + new Encoder ( + this, ControllerID::CHARACTER, boost::function (boost::bind (&Console1::drive, this, _1))); /* Compressor Section */ - ControllerButton comp_on_off ( - *this, ControllerID::COMP, boost::function (boost::bind (&Console1::comp, this, _1))); - MultiStateButton comp_mode (*this, - ControllerID::ORDER, - std::vector{ 0, 63, 127 }, - boost::function (boost::bind (&Console1::comp_mode, this, _1))); + new ControllerButton ( + this, ControllerID::COMP, boost::function (boost::bind (&Console1::comp, this, _1))); + new MultiStateButton (this, + ControllerID::ORDER, + std::vector{ 0, 63, 127 }, + boost::function (boost::bind (&Console1::comp_mode, this, _1))); - Encoder comp_thresh_encoder (*this, - ControllerID::COMP_THRESH, - boost::function (boost::bind (&Console1::comp_thresh, this, _1))); - Encoder comp_attack_encoder (*this, - ControllerID::COMP_ATTACK, - boost::function (boost::bind (&Console1::comp_attack, this, _1))); - Encoder comp_release_encoder (*this, - ControllerID::COMP_RELEASE, - boost::function (boost::bind (&Console1::comp_release, this, _1))); - Encoder comp_ratio_encoder (*this, - ControllerID::COMP_RATIO, - boost::function (boost::bind (&Console1::comp_ratio, this, _1))); - Encoder comp_makeup_encoder ( - *this, ControllerID::COMP_PAR, boost::function (boost::bind (&Console1::comp_makeup, this, _1))); - Encoder comp_emph_encoder ( - *this, ControllerID::DRIVE, boost::function (boost::bind (&Console1::comp_emph, this, _1))); + new Encoder (this, + ControllerID::COMP_THRESH, + boost::function (boost::bind (&Console1::comp_thresh, this, _1))); + new Encoder (this, + ControllerID::COMP_ATTACK, + boost::function (boost::bind (&Console1::comp_attack, this, _1))); + new Encoder (this, + ControllerID::COMP_RELEASE, + boost::function (boost::bind (&Console1::comp_release, this, _1))); + new Encoder ( + this, ControllerID::COMP_RATIO, boost::function (boost::bind (&Console1::comp_ratio, this, _1))); + new Encoder ( + this, ControllerID::COMP_PAR, boost::function (boost::bind (&Console1::comp_makeup, this, _1))); + new Encoder ( + this, ControllerID::DRIVE, boost::function (boost::bind (&Console1::comp_emph, this, _1))); - Meter compressor_meter (*this, ControllerID::COMP_METER, boost::function ([] () {})); + new Meter (this, ControllerID::COMP_METER, boost::function ([] () {})); /* Output Section */ - Meter output_meter_l (*this, ControllerID::OUTPUT_METER_L, boost::function ([] () {})); - Meter output_meter_r (*this, ControllerID::OUTPUT_METER_R, boost::function ([] () {})); + new Meter (this, ControllerID::OUTPUT_METER_L, boost::function ([] () {})); + new Meter (this, ControllerID::OUTPUT_METER_R, boost::function ([] () {})); } int @@ -404,11 +406,13 @@ Console1::handle_midi_controller_message (MIDI::Parser&, MIDI::EventTwoBytes* tb DEBUG_TRACE (DEBUG::Console1, string_compose ("handle_midi_controller_message cn: '%1' val: '%2'\n", controller_number, value)); try { - Encoder e = get_encoder (ControllerID (controller_number)); - if (shift_state && e.shift_action) { - e.shift_action (value); + Encoder* e = get_encoder (ControllerID (controller_number)); + if (in_plugin_state && e->plugin_action) { + e->plugin_action (value); + } else if (shift_state && e->shift_action) { + e->shift_action (value); } else { - e.action (value); + e->action (value); } return; } catch (ControlNotFoundException& e) { @@ -420,16 +424,16 @@ Console1::handle_midi_controller_message (MIDI::Parser&, MIDI::EventTwoBytes* tb } try { - ControllerButton& b = get_button (ControllerID (controller_number)); - if (in_plugin_state && b.plugin_action) { + ControllerButton* b = get_button (ControllerID (controller_number)); + if (in_plugin_state && b->plugin_action) { DEBUG_TRACE (DEBUG::Console1, "Executing plugin_action\n"); - b.plugin_action (value); - } else if (shift_state && b.shift_action) { + b->plugin_action (value); + } else if (shift_state && b->shift_action) { DEBUG_TRACE (DEBUG::Console1, "Executing shift_action\n"); - b.shift_action (value); + b->shift_action (value); } else { DEBUG_TRACE (DEBUG::Console1, "Executing action\n"); - b.action (value); + b->action (value); } return; } catch (ControlNotFoundException& e) { @@ -441,11 +445,11 @@ Console1::handle_midi_controller_message (MIDI::Parser&, MIDI::EventTwoBytes* tb } try { - MultiStateButton mb = get_mbutton (ControllerID (controller_number)); - if (shift_state && mb.shift_action) { - mb.shift_action (value); + MultiStateButton* mb = get_mbutton (ControllerID (controller_number)); + if (shift_state && mb->shift_action) { + mb->shift_action (value); } else { - mb.action (value); + mb->action (value); } return; @@ -469,7 +473,7 @@ Console1::notify_solo_active_changed (bool state) { DEBUG_TRACE (DEBUG::Console1, "notify_active_solo_changed() \n"); try { - get_button (ControllerID::DISPLAY_ON).set_led_value (state ? 127 : 0); + get_button (ControllerID::DISPLAY_ON)->set_led_value (state ? 127 : 0); } catch (ControlNotFoundException& e) { DEBUG_TRACE (DEBUG::Console1, "button not found"); } @@ -518,6 +522,8 @@ Console1::set_current_stripable (std::shared_ptr r) if (_current_stripable) { DEBUG_TRACE (DEBUG::Console1, "current_stripable found: \n"); + current_plugin_index = -1; + PresentationInfo pi = _current_stripable->presentation_info (); DEBUG_TRACE (DEBUG::Console1, string_compose ("current_stripable %1 - %2\n", pi.order (), pi.flags ())); @@ -835,14 +841,14 @@ void Console1::stop_blinking (ControllerID id) { blinkers.remove (id); - get_button (id).set_led_state (false); + get_button (id)->set_led_state (false); } void Console1::start_blinking (ControllerID id) { blinkers.push_back (id); - get_button (id).set_led_state (true); + get_button (id)->set_led_state (true); } bool @@ -852,7 +858,7 @@ Console1::blinker () for (Blinkers::iterator b = blinkers.begin (); b != blinkers.end (); b++) { try { - get_button (*b).set_led_state (blink_state); + get_button (*b)->set_led_state (blink_state); } catch (ControlNotFoundException& e) { DEBUG_TRACE (DEBUG::Console1, "Blinking Button not found ...\n"); } @@ -861,40 +867,40 @@ Console1::blinker () return true; } -ControllerButton& +ControllerButton* Console1::get_button (ControllerID id) const { ButtonMap::const_iterator b = buttons.find (id); if (b == buttons.end ()) throw (ControlNotFoundException ()); - return const_cast (b->second); + return const_cast (b->second); } -Meter& +Meter* Console1::get_meter (ControllerID id) const { MeterMap::const_iterator m = meters.find (id); if (m == meters.end ()) throw (ControlNotFoundException ()); - return const_cast (m->second); + return const_cast (m->second); } -Encoder& +Encoder* Console1::get_encoder (ControllerID id) const { EncoderMap::const_iterator m = encoders.find (id); if (m == encoders.end ()) throw (ControlNotFoundException ()); - return const_cast (m->second); + return const_cast (m->second); } -MultiStateButton& +MultiStateButton* Console1::get_mbutton (ControllerID id) const { MultiStateButtonMap::const_iterator m = multi_buttons.find (id); if (m == multi_buttons.end ()) throw (ControlNotFoundException ()); - return const_cast (m->second); + return const_cast (m->second); } ControllerID @@ -934,11 +940,11 @@ Console1::periodic_update_meter () } try { if (val_l != last_output_meter_l) { - get_meter (OUTPUT_METER_L).set_value (val_l); + get_meter (OUTPUT_METER_L)->set_value (val_l); last_output_meter_l = val_l; } if (val_r != last_output_meter_r) { - get_meter (OUTPUT_METER_R).set_value (val_r); + get_meter (OUTPUT_METER_R)->set_value (val_r); last_output_meter_r = val_r; } } catch (ControlNotFoundException& e) { @@ -955,7 +961,7 @@ Console1::periodic_update_meter () } try { if (val != last_gate_meter) { - get_meter (SHAPE_METER).set_value (val); + get_meter (SHAPE_METER)->set_value (val); last_gate_meter = val; } } catch (ControlNotFoundException& e) { @@ -975,7 +981,7 @@ Console1::periodic_update_meter () if (val != last_comp_redux) { last_comp_redux = val; val = val * 0.6 + last_comp_redux * 0.4; - get_meter (COMP_METER).set_value (val); + get_meter (COMP_METER)->set_value (val); } } catch (ControlNotFoundException& e) { DEBUG_TRACE (DEBUG::Console1, "Meter not found ...\n"); diff --git a/libs/surfaces/console1/console1.h b/libs/surfaces/console1/console1.h index 52fc25da4d..8c08a44a8d 100644 --- a/libs/surfaces/console1/console1.h +++ b/libs/surfaces/console1/console1.h @@ -93,6 +93,8 @@ class Console1 : public MIDISurface public: Console1 (ARDOUR::Session&); virtual ~Console1 (); + void map_p(); + int set_active (bool yn); @@ -295,6 +297,10 @@ class Console1 : public MIDISurface std::weak_ptr pre_master_stripable; std::weak_ptr pre_monitor_stripable; + void create_encoder (ControllerID id, + boost::function action, + boost::function shift_action = 0); + void setup_controls (); bool strip_recenabled = false; @@ -327,22 +333,22 @@ class Console1 : public MIDISurface void select_rid_by_index (const uint32_t index); /* Controller Maps*/ - typedef std::map ButtonMap; - typedef std::map MultiStateButtonMap; - typedef std::map MeterMap; - typedef std::map EncoderMap; + typedef std::map ButtonMap; + typedef std::map MultiStateButtonMap; + typedef std::map MeterMap; + typedef std::map EncoderMap; ButtonMap buttons; - ControllerButton& get_button (ControllerID) const; + ControllerButton* get_button (ControllerID) const; MultiStateButtonMap multi_buttons; - MultiStateButton& get_mbutton (ControllerID id) const; + MultiStateButton* get_mbutton (ControllerID id) const; MeterMap meters; - Meter& get_meter (ControllerID) const; + Meter* get_meter (ControllerID) const; EncoderMap encoders; - Encoder& get_encoder (ControllerID) const; + Encoder* get_encoder (ControllerID) const; typedef std::map SendControllerMap; SendControllerMap send_controllers{ { 0, LOW_FREQ }, { 1, LOW_MID_FREQ }, { 2, HIGH_MID_FREQ }, @@ -389,6 +395,7 @@ class Console1 : public MIDISurface /*PBD::ScopedConnection selection_connection;*/ PBD::ScopedConnectionList stripable_connections; PBD::ScopedConnectionList console1_connections; + PBD::ScopedConnectionList plugin_connections; void map_stripable_state ();