From ae5f278202c6a13637644a39c57fe34100cd7f6e Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Sun, 14 Aug 2011 17:11:33 +0000 Subject: [PATCH] make control protocol's SelectByRID signal work, thus enabling MIDI binding maps to use function="select" with an argument; fix minor bug in previous commit git-svn-id: svn://localhost/ardour2/branches/3.0@9991 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/editor.cc | 27 +++++++++++++++++++ gtk2_ardour/editor.h | 1 + gtk2_ardour/editor_ops.cc | 2 +- .../generic_midi_control_protocol.cc | 2 +- libs/surfaces/generic_midi/midifunction.cc | 12 +++++++++ libs/surfaces/generic_midi/midifunction.h | 7 +++++ 6 files changed, 49 insertions(+), 2 deletions(-) diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc index d45d89a96e..cf1619156f 100644 --- a/gtk2_ardour/editor.cc +++ b/gtk2_ardour/editor.cc @@ -704,6 +704,7 @@ Editor::Editor () ControlProtocol::ZoomIn.connect (*this, invalidator (*this), boost::bind (&Editor::temporal_zoom_step, this, false), gui_context()); ControlProtocol::ZoomOut.connect (*this, invalidator (*this), boost::bind (&Editor::temporal_zoom_step, this, true), gui_context()); ControlProtocol::ScrollTimeline.connect (*this, invalidator (*this), ui_bind (&Editor::control_scroll, this, _1), gui_context()); + ControlProtocol::SelectByRID.connect (*this, invalidator (*this), ui_bind (&Editor::control_select, this, _1), gui_context()); BasicUI::AccessAction.connect (*this, invalidator (*this), ui_bind (&Editor::access_action, this, _1, _2), gui_context()); /* problematic: has to return a value and thus cannot be x-thread */ @@ -911,6 +912,32 @@ Editor::zoom_adjustment_changed () temporal_zoom (fpu); } +void +Editor::control_select (uint32_t rid) +{ + /* handles the (static) signal from the ControlProtocol class that + * requests setting the selected track to a given RID + */ + + if (!_session) { + return; + } + + boost::shared_ptr r = _session->route_by_remote_id (rid); + + if (!r) { + return; + } + + TimeAxisView* tav = axis_view_from_route (r); + + if (tav) { + selection->set (tav); + } else { + selection->clear_tracks (); + } +} + void Editor::control_scroll (float fraction) { diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index 55d78238f7..e9960b3938 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -977,6 +977,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD Gtk::HBox edit_controls_hbox; void control_scroll (float); + void control_select (uint32_t rid); void access_action (std::string,std::string); bool deferred_control_scroll (framepos_t); sigc::connection control_scroll_connection; diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc index 29471aa913..07aeda3369 100644 --- a/gtk2_ardour/editor_ops.cc +++ b/gtk2_ardour/editor_ops.cc @@ -4795,7 +4795,7 @@ Editor::toggle_mute () } if (first) { - new_state = !rtav->route()->soloed (); + new_state = !rtav->route()->muted(); first = false; } diff --git a/libs/surfaces/generic_midi/generic_midi_control_protocol.cc b/libs/surfaces/generic_midi/generic_midi_control_protocol.cc index 1a615de424..05a3ef0505 100644 --- a/libs/surfaces/generic_midi/generic_midi_control_protocol.cc +++ b/libs/surfaces/generic_midi/generic_midi_control_protocol.cc @@ -844,7 +844,7 @@ GenericMidiControlProtocol::create_function (const XMLNode& node) } } - if ((prop = node.property (X_("arg"))) != 0) { + if ((prop = node.property (X_("arg"))) != 0 || (prop = node.property (X_("argument"))) != 0 || (prop = node.property (X_("arguments"))) != 0) { argument = prop->value (); } diff --git a/libs/surfaces/generic_midi/midifunction.cc b/libs/surfaces/generic_midi/midifunction.cc index 186858550f..38252326d7 100644 --- a/libs/surfaces/generic_midi/midifunction.cc +++ b/libs/surfaces/generic_midi/midifunction.cc @@ -66,6 +66,16 @@ MIDIFunction::setup (GenericMidiControlProtocol& ui, const std::string& invokabl return -1; } _function = Select; + } else if (strcasecmp (_invokable_name.c_str(), "track-set-solo") == 0) { + if (_argument.empty()) { + return -1; + } + _function = TrackSetSolo; + } else if (strcasecmp (_invokable_name.c_str(), "track-set-mute") == 0) { + if (_argument.empty()) { + return -1; + } + _function = TrackSetMute; } else { return -1; } @@ -123,6 +133,8 @@ MIDIFunction::execute () sscanf (_argument.c_str(), "%d", &rid); _ui->SelectByRID (rid); } + default: + break; } } diff --git a/libs/surfaces/generic_midi/midifunction.h b/libs/surfaces/generic_midi/midifunction.h index aafa739f20..8b3a52df3c 100644 --- a/libs/surfaces/generic_midi/midifunction.h +++ b/libs/surfaces/generic_midi/midifunction.h @@ -53,7 +53,14 @@ class MIDIFunction : public MIDIInvokable TransportLoopToggle, TransportRecordEnable, TransportRecordDisable, + /* 1 argument functions: RID */ Select, + /* 2 argument functions: RID, value */ + TrackSetSolo, + TrackSetMute, + TrackSetGain, + TrackSetRecordEnable, + TrackSetSoloIsolate, }; MIDIFunction (MIDI::Port&);