From 295562dd52deae1ccf0594f574c44c95677abf27 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Wed, 7 Dec 2016 19:47:04 +0100 Subject: Save/Restore MIDI Automation Controls (current CC, PGM) --- libs/ardour/ardour/midi_track.h | 2 ++ libs/ardour/midi_track.cc | 29 ++++++++++++++++++++++++++++- libs/ardour/route.cc | 9 +++++++++ 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/libs/ardour/ardour/midi_track.h b/libs/ardour/ardour/midi_track.h index f756812e71..dc2d4ec2cf 100644 --- a/libs/ardour/ardour/midi_track.h +++ b/libs/ardour/ardour/midi_track.h @@ -91,6 +91,7 @@ public: {} bool writable() const { return true; } + void restore_value (); MidiTrack* _route; @@ -174,6 +175,7 @@ private: /** Update automation controls to reflect any changes in buffers. */ void update_controls (const BufferSet& bufs); + void restore_controls (); }; } /* namespace ARDOUR*/ diff --git a/libs/ardour/midi_track.cc b/libs/ardour/midi_track.cc index c17bc916d9..c5433347a0 100644 --- a/libs/ardour/midi_track.cc +++ b/libs/ardour/midi_track.cc @@ -69,12 +69,13 @@ using namespace PBD; MidiTrack::MidiTrack (Session& sess, string name, TrackMode mode) : Track (sess, name, PresentationInfo::MidiTrack, mode, DataType::MIDI) - , _immediate_events(1024) // FIXME: size? + , _immediate_events(6096) // FIXME: size? , _step_edit_ring_buffer(64) // FIXME: size? , _note_mode(Sustained) , _step_editing (false) , _input_active (true) { + _session.SessionLoaded.connect_same_thread (*this, boost::bind (&MidiTrack::restore_controls, this)); } MidiTrack::~MidiTrack () @@ -266,6 +267,14 @@ MidiTrack::state(bool full_state) root.add_property ("step-editing", (_step_editing ? "yes" : "no")); root.add_property ("input-active", (_input_active ? "yes" : "no")); + for (Controls::const_iterator c = _controls.begin(); c != _controls.end(); ++c) { + if (boost::dynamic_pointer_cast(c->second)) { + boost::shared_ptr ac = boost::dynamic_pointer_cast (c->second); + assert (ac); + root.add_child_nocopy (ac->get_state ()); + } + } + return root; } @@ -334,6 +343,18 @@ MidiTrack::set_state_part_two () return; } +void +MidiTrack::restore_controls () +{ + // TODO order events (CC before PGM to set banks) + for (Controls::const_iterator c = _controls.begin(); c != _controls.end(); ++c) { + boost::shared_ptr mctrl = boost::dynamic_pointer_cast(c->second); + if (mctrl) { + mctrl->restore_value(); + } + } +} + void MidiTrack::update_controls(const BufferSet& bufs) { @@ -711,6 +732,12 @@ MidiTrack::set_parameter_automation_state (Evoral::Parameter param, AutoState st } } +void +MidiTrack::MidiControl::restore_value () +{ + actually_set_value (get_value(), Controllable::NoGroup); +} + void MidiTrack::MidiControl::actually_set_value (double val, PBD::Controllable::GroupControlDisposition group_override) { diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc index 0772361e6a..6b16867e59 100644 --- a/libs/ardour/route.cc +++ b/libs/ardour/route.cc @@ -46,6 +46,7 @@ #include "ardour/capturing_processor.h" #include "ardour/debug.h" #include "ardour/delivery.h" +#include "ardour/event_type_map.h" #include "ardour/gain_control.h" #include "ardour/internal_return.h" #include "ardour/internal_send.h" @@ -2473,6 +2474,14 @@ Route::set_state (const XMLNode& node, int version) _mute_control->set_state (*child, version); } else if (prop->value() == _phase_control->name()) { _phase_control->set_state (*child, version); + } else { + Evoral::Parameter p = EventTypeMap::instance().from_symbol (prop->value()); + if (p.type () >= MidiCCAutomation && p.type () < MidiSystemExclusiveAutomation) { + boost::shared_ptr ac = automation_control (p, true); + if (ac) { + ac->set_state (*child, version); + } + } } } else if (child->name() == MuteMaster::xml_node_name) { _mute_master->set_state (*child, version); -- cgit v1.2.3