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/midi_track.cc | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) (limited to 'libs/ardour/midi_track.cc') 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) { -- cgit v1.2.3