summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
Diffstat (limited to 'libs')
-rw-r--r--libs/ardour/ardour/midi_track.h2
-rw-r--r--libs/ardour/automatable.cc15
-rw-r--r--libs/ardour/automation_control.cc2
-rw-r--r--libs/ardour/midi_track.cc18
-rw-r--r--libs/evoral/src/ControlSet.cpp19
5 files changed, 45 insertions, 11 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;
diff --git a/libs/evoral/src/ControlSet.cpp b/libs/evoral/src/ControlSet.cpp
index 393b819146..f24c410d73 100644
--- a/libs/evoral/src/ControlSet.cpp
+++ b/libs/evoral/src/ControlSet.cpp
@@ -45,9 +45,12 @@ ControlSet::add_control(boost::shared_ptr<Control> ac)
ac->ListMarkedDirty.connect_same_thread (_control_connections, boost::bind (&ControlSet::control_list_marked_dirty, this));
- ac->list()->InterpolationChanged.connect_same_thread (
- _list_connections, boost::bind (&ControlSet::control_list_interpolation_changed, this, ac->parameter(), _1)
- );
+ if (ac->list()) {
+ ac->list()->InterpolationChanged.connect_same_thread (
+ _list_connections,
+ boost::bind (&ControlSet::control_list_interpolation_changed,
+ this, ac->parameter(), _1));
+ }
}
void
@@ -95,6 +98,9 @@ ControlSet::find_next_event (double now, double end, ControlEvent& next_event) c
ControlList::const_iterator i;
boost::shared_ptr<const ControlList> alist (li->second->list());
ControlEvent cp (now, 0.0f);
+ if (!alist) {
+ continue;
+ }
for (i = lower_bound (alist->begin(), alist->end(), &cp, ControlList::time_comparator);
i != alist->end() && (*i)->when < end; ++i) {
@@ -121,8 +127,11 @@ ControlSet::clear_controls ()
_control_connections.drop_connections ();
_list_connections.drop_connections ();
- for (Controls::iterator li = _controls.begin(); li != _controls.end(); ++li)
- li->second->list()->clear();
+ for (Controls::iterator li = _controls.begin(); li != _controls.end(); ++li) {
+ if (li->second->list()) {
+ li->second->list()->clear();
+ }
+ }
}
} // namespace Evoral