Fix crash on out of range MIDI events (though this shouldn't be possible at all....
[ardour.git] / libs / ardour / midi_playlist.cc
index 27410462d1b85a3ed6778a4c6cabf33f87b99ea1..d258d495247db4b54aba0418ee9399b69976b1dd 100644 (file)
@@ -42,6 +42,7 @@ using namespace std;
 
 MidiPlaylist::MidiPlaylist (Session& session, const XMLNode& node, bool hidden)
                : Playlist (session, node, DataType::MIDI, hidden)
+               , _note_mode(Sustained)
 {
        const XMLProperty* prop = node.property("type");
        assert(prop && DataType(prop->value()) == DataType::MIDI);
@@ -178,43 +179,7 @@ MidiPlaylist::refresh_dependents (boost::shared_ptr<Region> r)
 void
 MidiPlaylist::finalize_split_region (boost::shared_ptr<Region> original, boost::shared_ptr<Region> left, boost::shared_ptr<Region> right)
 {
-       throw; // I don't wanna
-       /*
-       MidiRegion *orig  = dynamic_cast<MidiRegion*>(o);
-       MidiRegion *left  = dynamic_cast<MidiRegion*>(l);
-       MidiRegion *right = dynamic_cast<MidiRegion*>(r);
-
-       for (Crossfades::iterator x = _crossfades.begin(); x != _crossfades.end();) {
-               Crossfades::iterator tmp;
-               tmp = x;
-               ++tmp;
-
-               Crossfade *fade = 0;
-
-               if ((*x)->_in == orig) {
-                       if (! (*x)->covers(right->position())) {
-                               fade = new Crossfade( *(*x), left, (*x)->_out);
-                       } else {
-                               // Overlap, the crossfade is copied on the left side of the right region instead
-                               fade = new Crossfade( *(*x), right, (*x)->_out);
-                       }
-               }
-
-               if ((*x)->_out == orig) {
-                       if (! (*x)->covers(right->position())) {
-                               fade = new Crossfade( *(*x), (*x)->_in, right);
-                       } else {
-                               // Overlap, the crossfade is copied on the right side of the left region instead
-                               fade = new Crossfade( *(*x), (*x)->_in, left);
-                       }
-               }
-
-               if (fade) {
-                       _crossfades.remove( (*x) );
-                       add_crossfade (*fade);
-               }
-               x = tmp;
-       }*/
+       /* No MIDI crossfading (yet?), so nothing to do here */
 }
 
 void
@@ -300,6 +265,30 @@ MidiPlaylist::destroy_region (boost::shared_ptr<Region> region)
        return changed;
 }
 
+set<Parameter>
+MidiPlaylist::contained_automation()
+{
+       /* this function is never called from a realtime thread, so
+          its OK to block (for short intervals).
+       */
+
+       Glib::Mutex::Lock rm (region_lock);
+
+       set<Parameter> ret;
+
+       for (RegionList::const_iterator r = regions.begin(); r != regions.end(); ++r) {
+               boost::shared_ptr<MidiRegion> mr = boost::dynamic_pointer_cast<MidiRegion>(*r);
+
+               for (Automatable::Controls::iterator c = mr->controls().begin();
+                               c != mr->controls().end(); ++c) {
+                       ret.insert(c->first);
+               }
+       }
+
+       return ret;
+}
+
+
 bool
 MidiPlaylist::region_changed (Change what_changed, boost::shared_ptr<Region> region)
 {