do not allow smf_source's reads to stomp on cached read_end position in parent class...
[ardour.git] / libs / ardour / smf_source.cc
index 5c420bf986d7ec37cd9216b6c8e3d492c686617a..7fbc8b0287d29296fc5106c292dc8dc03c92e567 100644 (file)
@@ -55,6 +55,7 @@ SMFSource::SMFSource (Session& s, const ustring& path, bool embedded, Source::Fl
        , Evoral::SMF()
        , _last_ev_time_beats(0.0)
        , _last_ev_time_frames(0)
+       , _smf_last_read_end (0)
 {
        if (init(_name, false)) {
                throw failed_constructor ();
@@ -72,6 +73,7 @@ SMFSource::SMFSource (Session& s, const XMLNode& node, bool must_exist)
        , FileSource(s, node, must_exist)
        , _last_ev_time_beats(0.0)
        , _last_ev_time_frames(0)
+       , _smf_last_read_end (0)
 {
        if (set_state(node)) {
                throw failed_constructor ();
@@ -116,20 +118,20 @@ SMFSource::read_unlocked (MidiRingBuffer<nframes_t>& destination, sframes_t sour
 
        const uint64_t start_ticks = (uint64_t)(converter.from(start) * ppqn());
 
-       if (_last_read_end == 0 || start != _last_read_end) {
-               cerr << "SMFSource::read_unlocked seeking to " << start << endl;
+       if (_smf_last_read_end == 0 || start != _smf_last_read_end) {
+               //cerr << "SMFSource::read_unlocked seeking to " << start << endl;
                Evoral::SMF::seek_to_start();
                while (time < start_ticks) {
                        ret = read_event(&ev_delta_t, &ev_size, &ev_buffer);
                        if (ret == -1) { // EOF
-                               _last_read_end = start + duration;
+                               _smf_last_read_end = start + duration;
                                return duration;
                        }
                        time += ev_delta_t; // accumulate delta time
                }
        }
        
-       _last_read_end = start + duration;
+       _smf_last_read_end = start + duration;
 
        while (true) {
                ret = read_event(&ev_delta_t, &ev_size, &ev_buffer);
@@ -186,11 +188,7 @@ SMFSource::write_unlocked (MidiRingBuffer<nframes_t>& source, sframes_t position
 
        while (true) {
                bool ret = source.peek_time(&time);
-               g_debug ("time: %u, last_write_end: %lu, duration: %u", time, _last_write_end, duration);
                if (!ret || time > _last_write_end + duration) {
-                       if (!ret) g_debug ("peek failed");
-                       if (time > _last_write_end + duration) g_debug ("time: %u > last_write_end: %lu + duration: %u", time, _last_write_end, duration);
                        break;
                }
 
@@ -260,7 +258,7 @@ SMFSource::append_event_unlocked_beats (const Evoral::Event<double>& ev)
        
        const double delta_time_beats   = ev.time() - _last_ev_time_beats;
        const uint32_t delta_time_ticks = (uint32_t)lrint(delta_time_beats * (double)ppqn());
-
+       
        Evoral::SMF::append_event_delta(delta_time_ticks, ev.size(), ev.buffer());
        _last_ev_time_beats = ev.time();
 
@@ -378,10 +376,10 @@ SMFSource::load_model (bool lock, bool force_reload)
 
        if (! _model) {
                _model = boost::shared_ptr<MidiModel>(new MidiModel(this));
-               cerr << _name << " loaded new model " << _model.get() << endl;
+               //cerr << _name << " loaded new model " << _model.get() << endl;
        } else {
-               cerr << _name << " reloading model " << _model.get()
-                       << " (" << _model->n_notes() << " notes)" <<endl;
+               /*cerr << _name << " reloading model " << _model.get()
+                       << " (" << _model->n_notes() << " notes)" << endl;*/
                _model->clear();
        }
 
@@ -400,7 +398,7 @@ SMFSource::load_model (bool lock, bool force_reload)
        while ((ret = read_event(&delta_t, &size, &buf)) >= 0) {
                time += delta_t;
                ev.set(buf, size, time / (double)ppqn());
-               
+
                if (ret > 0) { // didn't skip (meta) event
                        ev.set_event_type(EventTypeMap::instance().midi_event_type(buf[0]));
                        _model->append(ev);