do not allow smf_source's reads to stomp on cached read_end position in parent class...
[ardour.git] / libs / ardour / midi_region.cc
index a30b837c5f73465e5d9f5bbf7f613d8406d84753..aca8d039ad218b01f3268e50a84cc5510439afb5 100644 (file)
 
 #include <glibmm/thread.h>
 
-#include <pbd/basename.h>
-#include <pbd/xml++.h>
-#include <pbd/enumwriter.h>
-
-#include <ardour/midi_region.h>
-#include <ardour/session.h>
-#include <ardour/gain.h>
-#include <ardour/dB.h>
-#include <ardour/playlist.h>
-#include <ardour/midi_source.h>
-#include <ardour/types.h>
-#include <ardour/midi_ring_buffer.h>
+#include "pbd/basename.h"
+#include "pbd/xml++.h"
+#include "pbd/enumwriter.h"
+
+#include "ardour/midi_region.h"
+#include "ardour/session.h"
+#include "ardour/gain.h"
+#include "ardour/dB.h"
+#include "ardour/playlist.h"
+#include "ardour/midi_source.h"
+#include "ardour/types.h"
+#include "ardour/midi_ring_buffer.h"
 
 #include "i18n.h"
 #include <locale.h>
@@ -142,15 +142,12 @@ MidiRegion::master_read_at (MidiRingBuffer<nframes_t>& out, sframes_t position,
 }
 
 nframes_t
-MidiRegion::_read_at (const SourceList& srcs, MidiRingBuffer<nframes_t>& dst, nframes_t position, nframes_t dur, uint32_t chan_n, NoteMode mode) const
+MidiRegion::_read_at (const SourceList& /*srcs*/, MidiRingBuffer<nframes_t>& dst, nframes_t position, nframes_t dur, uint32_t chan_n, NoteMode mode) const
 {
-       /*cerr << "MidiRegion " << _name << "._read_at(" << position << ") - "
-               << position << " duration: " << dur << endl;*/
-
        nframes_t internal_offset = 0;
        nframes_t src_offset      = 0;
        nframes_t to_read         = 0;
-       
+
        /* precondition: caller has verified that we cover the desired section */
 
        assert(chan_n == 0);
@@ -168,7 +165,6 @@ MidiRegion::_read_at (const SourceList& srcs, MidiRingBuffer<nframes_t>& dst, nf
                return 0; /* read nothing */
        }
        
-
        if ((to_read = min (dur, _length - internal_offset)) == 0) {
                return 0; /* read nothing */
        }
@@ -195,11 +191,20 @@ MidiRegion::_read_at (const SourceList& srcs, MidiRingBuffer<nframes_t>& dst, nf
                // _start from the note times in the midi source
                negative_output_buffer_position = _start; 
        }
-       
+
+#if 0  
+       cerr << "\t\tsource read from " << _position << " - " << _start << " (" << _position - _start << ") "
+            << " start in source " << _start << " + " << internal_offset << " (" << _start + internal_offset << ") "
+            << " dur = " << to_read 
+            << " offset = " << output_buffer_position 
+            << " negoffset = " << negative_output_buffer_position 
+            << endl;
+#endif
+
        if (src->midi_read (
                        dst, // destination buffer
                        _position - _start, // start position of the source in this read context
-                       _start + internal_offset, // where to start reading in the region
+                       _start + internal_offset, // where to start reading in the source
                        to_read, // read duration in frames
                        output_buffer_position, // the offset in the output buffer
                        negative_output_buffer_position // amount to substract from note times