better error msg about autoloop location
[ardour.git] / libs / ardour / smf_source.cc
index 9e777b6ae5fde5351d71251455c9684a06ad8282..e0462efb08137f9cb14e8004e32f3aed4e4b2d1d 100644 (file)
@@ -25,7 +25,6 @@
 #include <unistd.h>
 #include <errno.h>
 
-#include "pbd/mountpoint.h"
 #include "pbd/pathscanner.h"
 #include "pbd/stl_delete.h"
 #include "pbd/strsplit.h"
@@ -34,7 +33,6 @@
 
 #include "evoral/Control.hpp"
 
-#include "ardour/audioengine.h"
 #include "ardour/event_type_map.h"
 #include "ardour/midi_model.h"
 #include "ardour/midi_ring_buffer.h"
@@ -127,8 +125,6 @@ SMFSource::read_unlocked (Evoral::EventSink<framepos_t>& destination, framepos_t
 
        DEBUG_TRACE (DEBUG::MidiSourceIO, string_compose ("SMF read_unlocked: start %1 duration %2\n", start, duration));
 
-       _read_data_count = 0;
-
        // Output parameters for read_event (which will allocate scratch in buffer as needed)
        uint32_t ev_delta_t = 0;
        uint32_t ev_type    = 0;
@@ -203,8 +199,6 @@ SMFSource::read_unlocked (Evoral::EventSink<framepos_t>& destination, framepos_t
                        break;
                }
 
-               _read_data_count += ev_size;
-
                if (ev_size > scratch_size) {
                        scratch_size = ev_size;
                }
@@ -225,8 +219,6 @@ SMFSource::write_unlocked (MidiRingBuffer<framepos_t>& source, framepos_t positi
                 mark_streaming_write_started ();
         }
 
-       _write_data_count = 0;
-
        framepos_t        time;
        Evoral::EventType type;
        uint32_t          size;
@@ -240,7 +232,7 @@ SMFSource::write_unlocked (MidiRingBuffer<framepos_t>& source, framepos_t positi
 
        Evoral::MIDIEvent<framepos_t> ev;
 
-       cerr << "SMFSource::write unlocked, begins writing from src buffer with _last_write_end = " << _last_write_end << " dur = " << duration << endl;
+       // cerr << "SMFSource::write unlocked, begins writing from src buffer with _last_write_end = " << _last_write_end << " dur = " << duration << endl;
 
        while (true) {
                bool ret;
@@ -286,11 +278,10 @@ SMFSource::write_unlocked (MidiRingBuffer<framepos_t>& source, framepos_t positi
                        continue;
                }
 
-               cerr << "SMFSource:: calling append_event_unlocked_frames()\n";
                append_event_unlocked_frames(ev, position);
        }
 
-       Evoral::SMF::flush();
+       Evoral::SMF::flush ();
        free (buf);
 
        return duration;
@@ -335,9 +326,6 @@ SMFSource::append_event_unlocked_beats (const Evoral::Event<double>& ev)
 
        Evoral::SMF::append_event_delta(delta_time_ticks, ev.size(), ev.buffer(), event_id);
        _last_ev_time_beats = ev.time();
-
-       _write_data_count += ev.size();
-
 }
 
 /** Append an event with a timestamp in frames (framepos_t) */
@@ -350,9 +338,9 @@ SMFSource::append_event_unlocked_frames (const Evoral::Event<framepos_t>& ev, fr
                return;
        }
 
-       /* printf("SMFSource: %s - append_event_unlocked_frames ID = %d time = %u, size = %u, data = ",
-               name().c_str(), ev.id(), ev.time(), ev.size());
-          for (size_t i=0; i < ev.size(); ++i) printf("%X ", ev.buffer()[i]); printf("\n");*/
+       // printf("SMFSource: %s - append_event_unlocked_frames ID = %d time = %u, size = %u, data = ",
+       // name().c_str(), ev.id(), ev.time(), ev.size());
+       // for (size_t i=0; i < ev.size(); ++i) printf("%X ", ev.buffer()[i]); printf("\n");
 
        if (ev.time() < _last_ev_time_frames) {
                cerr << "SMFSource: Warning: Skipping event with non-monotonic time" << endl;
@@ -373,21 +361,18 @@ SMFSource::append_event_unlocked_frames (const Evoral::Event<framepos_t>& ev, fr
                const Evoral::Event<double> beat_ev (ev.event_type(),
                                                     ev_time_beats,
                                                     ev.size(),
-                                                    (uint8_t*)ev.buffer());
+                                                    const_cast<uint8_t*>(ev.buffer()));
                _model->append (beat_ev, event_id);
        }
 
        _length_beats = max(_length_beats, ev_time_beats);
 
-       const framepos_t delta_time_frames = ev.time() - _last_ev_time_frames;
-       const double     delta_time_beats  = converter.from(delta_time_frames);
-       const uint32_t   delta_time_ticks  = (uint32_t)(lrint(delta_time_beats * (double)ppqn()));
+       const Evoral::MusicalTime last_time_beats  = converter.from (_last_ev_time_frames);
+       const Evoral::MusicalTime delta_time_beats = ev_time_beats - last_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(), event_id);
        _last_ev_time_frames = ev.time();
-
-       _write_data_count += ev.size();
-
 }
 
 XMLNode&
@@ -442,10 +427,11 @@ SMFSource::mark_streaming_write_completed ()
 void
 SMFSource::mark_midi_streaming_write_completed (Evoral::Sequence<Evoral::MusicalTime>::StuckNoteOption stuck_notes_option, Evoral::MusicalTime when)
 {
-       Glib::Mutex::Lock lm (_lock);
+       Glib::Threads::Mutex::Lock lm (_lock);
        MidiSource::mark_midi_streaming_write_completed (stuck_notes_option, when);
 
        if (!writable()) {
+               warning << string_compose ("attempt to write to unwritable SMF file %1", _path) << endmsg;
                return;
        }
 
@@ -473,9 +459,9 @@ SMFSource::load_model (bool lock, bool force_reload)
                return;
        }
 
-       boost::shared_ptr<Glib::Mutex::Lock> lm;
+       boost::shared_ptr<Glib::Threads::Mutex::Lock> lm;
        if (lock)
-               lm = boost::shared_ptr<Glib::Mutex::Lock>(new Glib::Mutex::Lock(_lock));
+               lm = boost::shared_ptr<Glib::Threads::Mutex::Lock>(new Glib::Threads::Mutex::Lock(_lock));
 
        if (_model && !force_reload) {
                return;
@@ -497,7 +483,7 @@ SMFSource::load_model (bool lock, bool force_reload)
        uint64_t time = 0; /* in SMF ticks */
        Evoral::Event<double> ev;
 
-       size_t scratch_size = 0; // keep track of scratch and minimize reallocs
+       uint32_t scratch_size = 0; // keep track of scratch and minimize reallocs
 
        uint32_t delta_t = 0;
        uint32_t size    = 0;
@@ -547,11 +533,9 @@ SMFSource::load_model (bool lock, bool force_reload)
 
                        _model->append (ev, event_id);
 
-                       if (ev.size() > scratch_size) {
-                               scratch_size = ev.size();
-                       }
-
-                       ev.size() = scratch_size; // ensure read_event only allocates if necessary
+                       // Set size to max capacity to minimize allocs in read_event
+                       scratch_size = std::max(size, scratch_size);
+                       size = scratch_size;
 
                        _length_beats = max(_length_beats, ev.time());
                }