summaryrefslogtreecommitdiff
path: root/libs/ardour/midi_track.cc
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2016-12-07 19:47:04 +0100
committerRobin Gareus <robin@gareus.org>2016-12-07 19:47:04 +0100
commit295562dd52deae1ccf0594f574c44c95677abf27 (patch)
tree26516723c6f687fae7d8d0cbca9bc2ffc948cc40 /libs/ardour/midi_track.cc
parentd7660957325bdebbb75f21c0d19b9f0aad6e7f37 (diff)
Save/Restore MIDI Automation Controls (current CC, PGM)
Diffstat (limited to 'libs/ardour/midi_track.cc')
-rw-r--r--libs/ardour/midi_track.cc29
1 files changed, 28 insertions, 1 deletions
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<MidiTrack::MidiControl>(c->second)) {
+ boost::shared_ptr<AutomationControl> ac = boost::dynamic_pointer_cast<AutomationControl> (c->second);
+ assert (ac);
+ root.add_child_nocopy (ac->get_state ());
+ }
+ }
+
return root;
}
@@ -335,6 +344,18 @@ MidiTrack::set_state_part_two ()
}
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<MidiTrack::MidiControl> mctrl = boost::dynamic_pointer_cast<MidiTrack::MidiControl>(c->second);
+ if (mctrl) {
+ mctrl->restore_value();
+ }
+ }
+}
+
+void
MidiTrack::update_controls(const BufferSet& bufs)
{
const MidiBuffer& buf = bufs.get_midi(0);
@@ -712,6 +733,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)
{
const Evoral::Parameter &parameter = _list ? _list->parameter() : Control::parameter();