* MIDI control lanes: Set Interpolationtype according to Parameter
[ardour.git] / libs / ardour / smf_source.cc
index 5b70f8e9c6b03047097c9addd52e02a1c1feaf72..cc521336e3afd315c2e8ea30ca3c30aec0ebde1c 100644 (file)
@@ -37,7 +37,6 @@
 #include <ardour/smf_source.h>
 #include <ardour/session.h>
 #include <ardour/midi_ring_buffer.h>
-#include <ardour/midi_util.h>
 #include <ardour/tempo.h>
 #include <ardour/audioengine.h>
 #include <ardour/event_type_map.h>
@@ -198,9 +197,9 @@ SMFSource::write_unlocked (MidiRingBuffer& src, nframes_t cnt)
 {
        _write_data_count = 0;
                
-       EventTime time;
-       EventType type;
-       uint32_t  size;
+       Evoral::EventTime time;
+       Evoral::EventType type;
+       uint32_t          size;
 
        size_t buf_capacity = 4;
        uint8_t* buf = (uint8_t*)malloc(buf_capacity);
@@ -242,8 +241,9 @@ SMFSource::write_unlocked (MidiRingBuffer& src, nframes_t cnt)
                
                append_event_unlocked(Frames, ev);
 
-               if (_model)
+               if (_model) {
                        _model->append(ev);
+               }
        }
 
        SMF::flush();
@@ -602,14 +602,18 @@ SMFSource::set_source_name (string newname, bool destructive)
 void
 SMFSource::load_model(bool lock, bool force_reload)
 {
-       if (_writing)
+       if (_writing) {
                return;
+       }
+       
 
-       if (lock)
+       if (lock) {
                Glib::Mutex::Lock lm (_lock);
+       }
 
-       if (_model && !force_reload && !_model->empty())
+       if (_model && !force_reload && !_model->empty()) {
                return;
+       }
 
        if (! _model) {
                _model = boost::shared_ptr<MidiModel>(new MidiModel(this));
@@ -644,15 +648,23 @@ SMFSource::load_model(bool lock, bool force_reload)
                
                if (ret > 0) { // didn't skip (meta) event
                        // make ev.time absolute time in frames
-                       ev.time() = time * frames_per_beat / (EventTime)ppqn();
+                       ev.time() = time * frames_per_beat / (Evoral::EventTime)ppqn();
                        ev.set_event_type(EventTypeMap::instance().midi_event_type(buf[0]));
                        _model->append(ev);
                }
 
-               if (ev.size() > scratch_size)
+               if (ev.size() > scratch_size) {
                        scratch_size = ev.size();
-               else
+               } else {
                        ev.size() = scratch_size;
+               }
+       }
+
+       // set interpolation style to defaults, can be changed by the GUI later
+       Evoral::ControlSet::Controls controls = _model->controls();
+       for (Evoral::ControlSet::Controls::iterator c = controls.begin(); c != controls.end(); ++c) {
+               (*c).second->list()->set_interpolation(
+                       EventTypeMap::instance().interpolation_of((*c).first));
        }
        
        _model->end_write(false);