Remove all use of nframes_t.
[ardour.git] / libs / ardour / midi_source.cc
index 97fb801a6ca4bad59d66acc3953c689a65c61548..120ee29e8eff58a536cf2401f9dae4444bafcf7e 100644 (file)
@@ -183,7 +183,7 @@ MidiSource::length (framepos_t pos) const
 }
 
 void
-MidiSource::update_length (sframes_t /*pos*/, sframes_t /*cnt*/)
+MidiSource::update_length (framepos_t /*pos*/, framecnt_t /*cnt*/)
 {
        // You're not the boss of me!
 }
@@ -196,10 +196,9 @@ MidiSource::invalidate ()
 }
 
 /** @param filtered A set of parameters whose MIDI messages will not be returned */
-nframes_t
-MidiSource::midi_read (Evoral::EventSink<nframes_t>& dst, sframes_t source_start,
-                       sframes_t start, nframes_t cnt,
-                       sframes_t stamp_offset, sframes_t negative_stamp_offset,
+framecnt_t
+MidiSource::midi_read (Evoral::EventSink<framepos_t>& dst, framepos_t source_start,
+                       framepos_t start, framecnt_t cnt,
                        MidiStateTracker* tracker,
                       std::set<Evoral::Parameter> const & filtered) const
 {
@@ -227,10 +226,10 @@ MidiSource::midi_read (Evoral::EventSink<nframes_t>& dst, sframes_t source_start
 
                // Read events up to end
                for (; i != _model->end(); ++i) {
-                       const sframes_t time_frames = converter.to(i->time());
+                       const framecnt_t time_frames = converter.to(i->time());
                        if (time_frames < start + cnt) {
-                               dst.write(time_frames + stamp_offset - negative_stamp_offset,
-                                          i->event_type(), i->size(), i->buffer());
+                               /* convert event times to session frames by adding on the source start position in session frames */
+                               dst.write (time_frames + source_start, i->event_type(), i->size(), i->buffer());
 
                                if (tracker) {
                                        Evoral::MIDIEvent<Evoral::MusicalTime>& ev (*(Evoral::MIDIEvent<Evoral::MusicalTime>*) (&(*i)));
@@ -248,21 +247,25 @@ MidiSource::midi_read (Evoral::EventSink<nframes_t>& dst, sframes_t source_start
                }
                return cnt;
        } else {
-               return read_unlocked (dst, source_start, start, cnt, stamp_offset, negative_stamp_offset, tracker);
+               return read_unlocked (dst, source_start, start, cnt, tracker);
        }
 }
 
-nframes_t
-MidiSource::midi_write (MidiRingBuffer<nframes_t>& source, sframes_t source_start, nframes_t duration)
+/** Write data from a MidiRingBuffer to this source.
+ *  @param source Source to read from.
+ *  @param source_start This source's start position in session frames.
+ */
+framecnt_t
+MidiSource::midi_write (MidiRingBuffer<framepos_t>& source, framepos_t source_start, framecnt_t duration)
 {
        Glib::Mutex::Lock lm (_lock);
-       const nframes_t ret = write_unlocked (source, source_start, duration);
+       const framecnt_t ret = write_unlocked (source, source_start, duration);
        _last_write_end += duration;
        return ret;
 }
 
 void
-MidiSource::mark_streaming_midi_write_started (NoteMode mode, sframes_t start_frame)
+MidiSource::mark_streaming_midi_write_started (NoteMode mode, framepos_t start_frame)
 {
        set_timeline_position(start_frame);
 
@@ -311,8 +314,8 @@ MidiSource::clone (Evoral::MusicalTime begin, Evoral::MusicalTime end)
         
         boost::shared_ptr<MidiSource> newsrc = boost::dynamic_pointer_cast<MidiSource>(
                 SourceFactory::createWritable(DataType::MIDI, _session,
-                                              newpath, false, _session.frame_rate()));
-        
+                                              newpath, string(), false, _session.frame_rate()));
+
         newsrc->set_timeline_position(_timeline_position);
        newsrc->copy_interpolation_from (this);
        newsrc->copy_automation_state_from (this);
@@ -416,7 +419,11 @@ MidiSource::automation_state_of (Evoral::Parameter p) const
 {
        AutomationStateMap::const_iterator i = _automation_state.find (p);
        if (i == _automation_state.end()) {
-               return Off;
+               /* default to `play', otherwise if MIDI is recorded /
+                  imported with controllers etc. they are by default
+                  not played back, which is a little surprising.
+               */
+               return Play;
        }
 
        return i->second;
@@ -449,7 +456,7 @@ MidiSource::set_automation_state_of (Evoral::Parameter p, AutoState s)
                return;
        }
        
-       if (s == Off) {
+       if (s == Play) {
                /* automation state is being set to the default, so we don't need a note in our map */
                _automation_state.erase (p);
        } else {