diff options
Diffstat (limited to 'libs/ardour')
-rw-r--r-- | libs/ardour/ardour/midi_track.h | 2 | ||||
-rw-r--r-- | libs/ardour/automatable.cc | 15 | ||||
-rw-r--r-- | libs/ardour/automation_control.cc | 2 | ||||
-rw-r--r-- | libs/ardour/midi_track.cc | 18 |
4 files changed, 31 insertions, 6 deletions
diff --git a/libs/ardour/ardour/midi_track.h b/libs/ardour/ardour/midi_track.h index 1acec0346e..cea3af5aed 100644 --- a/libs/ardour/ardour/midi_track.h +++ b/libs/ardour/ardour/midi_track.h @@ -93,6 +93,8 @@ public: MidiTrack* _route; }; + virtual void set_parameter_automation_state (Evoral::Parameter param, AutoState); + NoteMode note_mode() const { return _note_mode; } void set_note_mode (NoteMode m); diff --git a/libs/ardour/automatable.cc b/libs/ardour/automatable.cc index 7669f22df1..8629722889 100644 --- a/libs/ardour/automatable.cc +++ b/libs/ardour/automatable.cc @@ -137,16 +137,20 @@ Automatable::add_control(boost::shared_ptr<Evoral::Control> ac) Evoral::Parameter param = ac->parameter(); boost::shared_ptr<AutomationList> al = boost::dynamic_pointer_cast<AutomationList> (ac->list ()); - assert (al); - al->automation_state_changed.connect_same_thread ( - _list_connections, boost::bind (&Automatable::automation_list_automation_state_changed, this, ac->parameter(), _1) - ); + if (al) { + al->automation_state_changed.connect_same_thread ( + _list_connections, + boost::bind (&Automatable::automation_list_automation_state_changed, + this, ac->parameter(), _1)); + } ControlSet::add_control (ac); _can_automate_list.insert (param); - automation_list_automation_state_changed (param, al->automation_state ()); // sync everything up + if (al) { + automation_list_automation_state_changed (param, al->automation_state ()); // sync everything up + } } string @@ -394,6 +398,7 @@ Automatable::control_factory(const Evoral::Parameter& param) MidiTrack* mt = dynamic_cast<MidiTrack*>(this); if (mt) { control = new MidiTrack::MidiControl(mt, param); + list.reset(); // No list, this is region "automation" } else { warning << "MidiCCAutomation for non-MidiTrack" << endl; } diff --git a/libs/ardour/automation_control.cc b/libs/ardour/automation_control.cc index 355b0176ce..2bb694c7e5 100644 --- a/libs/ardour/automation_control.cc +++ b/libs/ardour/automation_control.cc @@ -85,7 +85,7 @@ AutomationControl::set_list (boost::shared_ptr<Evoral::ControlList> list) void AutomationControl::set_automation_state (AutoState as) { - if (as != alist()->automation_state()) { + if (_list && as != alist()->automation_state()) { alist()->set_automation_state (as); diff --git a/libs/ardour/midi_track.cc b/libs/ardour/midi_track.cc index 638ed05706..3866eb4d80 100644 --- a/libs/ardour/midi_track.cc +++ b/libs/ardour/midi_track.cc @@ -623,6 +623,24 @@ MidiTrack::write_immediate_event(size_t size, const uint8_t* buf) } void +MidiTrack::set_parameter_automation_state (Evoral::Parameter param, AutoState state) +{ + switch (param.type()) { + case MidiCCAutomation: + case MidiPgmChangeAutomation: + case MidiPitchBenderAutomation: + case MidiChannelPressureAutomation: + case MidiSystemExclusiveAutomation: + /* The track control for MIDI parameters is for immediate events to act + as a control surface, write/touch for them is not currently + supported. */ + return; + default: + Automatable::set_parameter_automation_state(param, state); + } +} + +void MidiTrack::MidiControl::set_value(double val) { bool valid = false; |