summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2018-10-04 02:30:21 +0200
committerRobin Gareus <robin@gareus.org>2018-10-04 02:30:21 +0200
commitb6b353d4528bbb7f352f9947015a3b7168825a9c (patch)
tree21d5f6a3fe04c18ee26165e3d2f4fdb53e1c41b3
parent9df6e334fc01ce024702c51e84a80193bea36bff (diff)
Handle generic-midi bindings per session.
This allows to special-cases session-specific control-surface state. e.g. midi-learn. Only restore midi-learned, session-specific, bindings when loading a session with generic-midi enabled. Also dis/re-enable generic-midi resets midi-learned, but no other session-independent settings. This also handles the edge case: 1) load global config, generic-midi = ON, w/ bindings. state is remembered as cpi->state 2) load session-condig, generic-midi = OFF, cpi->state is retained 3) user enables the surface, cpi->state from (1) is applied. -> invalid bindings applied -> fail
-rw-r--r--libs/ardour/control_protocol_manager.cc4
-rw-r--r--libs/ardour/globals.cc2
-rw-r--r--libs/ardour/session_state.cc2
-rw-r--r--libs/surfaces/generic_midi/generic_midi_control_protocol.cc5
4 files changed, 9 insertions, 4 deletions
diff --git a/libs/ardour/control_protocol_manager.cc b/libs/ardour/control_protocol_manager.cc
index c1c595ebb2..048ff3f7d5 100644
--- a/libs/ardour/control_protocol_manager.cc
+++ b/libs/ardour/control_protocol_manager.cc
@@ -452,7 +452,7 @@ ControlProtocolManager::cpi_by_name (string name)
}
int
-ControlProtocolManager::set_state (const XMLNode& node, int /*version*/)
+ControlProtocolManager::set_state (const XMLNode& node, int session_specific_state /* here: not version */)
{
XMLNodeList clist;
XMLNodeConstIterator citer;
@@ -483,6 +483,7 @@ ControlProtocolManager::set_state (const XMLNode& node, int /*version*/)
if (active) {
delete cpi->state;
cpi->state = new XMLNode (**citer);
+ cpi->state->set_property (X_("session-state"), session_specific_state ? true : false);
if (_session) {
instantiate (*cpi);
} else {
@@ -492,6 +493,7 @@ ControlProtocolManager::set_state (const XMLNode& node, int /*version*/)
if (!cpi->state) {
cpi->state = new XMLNode (**citer);
cpi->state->set_property (X_("active"), false);
+ cpi->state->set_property (X_("session-state"), session_specific_state ? true : false);
}
cpi->requested = false;
if (_session) {
diff --git a/libs/ardour/globals.cc b/libs/ardour/globals.cc
index fc17b3a5e9..eab0b93a41 100644
--- a/libs/ardour/globals.cc
+++ b/libs/ardour/globals.cc
@@ -599,7 +599,7 @@ ARDOUR::init_post_engine ()
XMLNode* node;
if ((node = Config->control_protocol_state()) != 0) {
- ControlProtocolManager::instance().set_state (*node, Stateful::loading_state_version);
+ ControlProtocolManager::instance().set_state (*node, 0 /* here: global-config state */);
}
if ((node = Config->transport_master_state()) != 0) {
diff --git a/libs/ardour/session_state.cc b/libs/ardour/session_state.cc
index 1335c554cb..0c974fcc84 100644
--- a/libs/ardour/session_state.cc
+++ b/libs/ardour/session_state.cc
@@ -1729,7 +1729,7 @@ Session::set_state (const XMLNode& node, int version)
}
if ((child = find_named_node (node, ControlProtocolManager::state_node_name)) != 0) {
- ControlProtocolManager::instance().set_state (*child, version);
+ ControlProtocolManager::instance().set_state (*child, 1 /* here: session-specific state */);
}
if ((child = find_named_node (node, "Script"))) {
diff --git a/libs/surfaces/generic_midi/generic_midi_control_protocol.cc b/libs/surfaces/generic_midi/generic_midi_control_protocol.cc
index 4d931b8fe0..214c9fede7 100644
--- a/libs/surfaces/generic_midi/generic_midi_control_protocol.cc
+++ b/libs/surfaces/generic_midi/generic_midi_control_protocol.cc
@@ -669,7 +669,10 @@ GenericMidiControlProtocol::set_state (const XMLNode& node, int version)
* <Controls><MidiControllable>...</MidiControllable><Controls> section
*/
- {
+ bool load_dynamic_bindings = false;
+ node.get_property ("session-state", load_dynamic_bindings);
+
+ if (load_dynamic_bindings) {
Glib::Threads::Mutex::Lock lm2 (controllables_lock);
nlist = node.children(); // "Controls"