remove some debug output
[ardour.git] / libs / ardour / smf_source.cc
index c686ae3d27705e3ac86475bad6ff7a6bcdf3cfb3..f379d0946d4a2c2257c2a426428a9caf167647d4 100644 (file)
@@ -1,6 +1,6 @@
 /*
     Copyright (C) 2006 Paul Davis
-       Written by Dave Robillard, 2006
+    Author: David Robillard
 
     This program is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
@@ -65,7 +65,7 @@ SMFSource::SMFSource (Session& s, const string& path, Source::Flag flags)
        if (init(_path, false)) {
                throw failed_constructor ();
        }
-        
+
         /* file is not opened until write */
 }
 
@@ -106,7 +106,7 @@ SMFSource::open_for_write ()
 {
        if (create (_path)) {
                 return -1;
-        } 
+        }
         _open = true;
         return 0;
 }
@@ -221,11 +221,6 @@ SMFSource::read_unlocked (Evoral::EventSink<framepos_t>& destination, framepos_t
 framecnt_t
 SMFSource::write_unlocked (MidiRingBuffer<framepos_t>& source, framepos_t position, framecnt_t duration)
 {
-        if (!_open && open_for_write()) {
-                error << string_compose (_("cannot open MIDI file %1 for write"), _path) << endmsg;
-                return 0;
-        }
-
         if (!_writing) {
                 mark_streaming_write_started ();
         }
@@ -246,7 +241,7 @@ SMFSource::write_unlocked (MidiRingBuffer<framepos_t>& source, framepos_t positi
        Evoral::MIDIEvent<framepos_t> ev;
 
        while (true) {
-               bool ret = source.peek_time(&time);
+               bool ret = source.peek ((uint8_t*)&time, sizeof (time));
                if (!ret || time > _last_write_end + duration) {
                        break;
                }
@@ -300,10 +295,10 @@ SMFSource::append_event_unlocked_beats (const Evoral::Event<double>& ev)
        if (ev.size() == 0)  {
                return;
        }
-        
-       /* printf("SMFSource: %s - append_event_unlocked_beats ID = %d time = %lf, size = %u, data = ",
+
+       /*printf("SMFSource: %s - append_event_unlocked_beats ID = %d time = %lf, 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");*/
+              for (size_t i = 0; i < ev.size(); ++i) printf("%X ", ev.buffer()[i]); printf("\n");*/
 
        assert(ev.time() >= 0);
        if (ev.time() < _last_ev_time_beats) {
@@ -364,12 +359,12 @@ SMFSource::append_event_unlocked_frames (const Evoral::Event<framepos_t>& ev, fr
        }
 
        if (_model) {
-               const Evoral::Event<double> beat_ev (ev.event_type(), 
-                                                    ev_time_beats, 
-                                                    ev.size(), 
+               const Evoral::Event<double> beat_ev (ev.event_type(),
+                                                    ev_time_beats,
+                                                    ev.size(),
                                                     (uint8_t*)ev.buffer());
                _model->append (beat_ev, event_id);
-       } 
+       }
 
        _length_beats = max(_length_beats, ev_time_beats);
 
@@ -415,6 +410,12 @@ SMFSource::mark_streaming_midi_write_started (NoteMode mode)
 {
         /* CALLER MUST HOLD LOCK */
 
+        if (!_open && open_for_write()) {
+                error << string_compose (_("cannot open MIDI file %1 for write"), _path) << endmsg;
+                /* XXX should probably throw or return something */
+                return;
+        }
+
        MidiSource::mark_streaming_midi_write_started (mode);
        Evoral::SMF::begin_write ();
        _last_ev_time_beats = 0.0;
@@ -434,12 +435,12 @@ SMFSource::mark_streaming_write_completed ()
        if (_model) {
                _model->set_edited(false);
        }
-       
+
        Evoral::SMF::end_write ();
 
        /* data in the file now, not removable */
 
-       mark_nonremovable (); 
+       mark_nonremovable ();
 }
 
 bool
@@ -491,7 +492,7 @@ SMFSource::load_model (bool lock, bool force_reload)
        while ((ret = read_event (&delta_t, &size, &buf, &event_id)) >= 0) {
 
                time += delta_t;
-                
+
                if (ret == 0) {
 
                        /* meta-event : did we get an event ID ?
@@ -502,9 +503,9 @@ SMFSource::load_model (bool lock, bool force_reload)
                        }
 
                        continue;
-               } 
-                        
-               if (ret > 0) { 
+               }
+
+               if (ret > 0) {
 
                        /* not a meta-event */
 
@@ -512,11 +513,11 @@ SMFSource::load_model (bool lock, bool force_reload)
                        ev.set_event_type(EventTypeMap::instance().midi_event_type(buf[0]));
 
                        if (!have_event_id) {
-                               event_id = Evoral::next_event_id();   
+                               event_id = Evoral::next_event_id();
                        }
 #ifndef NDEBUG
                        std::string ss;
-                        
+
                        for (uint32_t xx = 0; xx < size; ++xx) {
                                char b[8];
                                snprintf (b, sizeof (b), "0x%x ", buf[xx]);
@@ -526,21 +527,21 @@ SMFSource::load_model (bool lock, bool force_reload)
                        DEBUG_TRACE (DEBUG::MidiSourceIO, string_compose ("SMF %6 load model delta %1, time %2, size %3 buf %4, type %5\n",
                                                                          delta_t, time, size, ss , ev.event_type(), name()));
 #endif
-                        
+
                        _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
-                        
+
                        _length_beats = max(_length_beats, ev.time());
                }
 
                /* event ID's must immediately precede the event they are for
                 */
-                   
+
                have_event_id = false;
        }
 
@@ -568,7 +569,7 @@ SMFSource::flush_midi ()
 
        Evoral::SMF::end_write();
        /* data in the file means its no longer removable */
-       mark_nonremovable (); 
+       mark_nonremovable ();
 }
 
 void
@@ -577,3 +578,29 @@ SMFSource::set_path (const string& p)
        FileSource::set_path (p);
        SMF::set_path (_path);
 }
+
+/** Ensure that this source has some file on disk, even if it's just a SMF header */
+void
+SMFSource::ensure_disk_file ()
+{
+       if (_model) {
+               /* We have a model, so write it to disk; see MidiSource::session_saved
+                  for an explanation of what we are doing here.
+               */
+               boost::shared_ptr<MidiModel> mm = _model;
+               _model.reset ();
+               mm->sync_to_source ();
+               _model = mm;
+       } else {
+               /* No model; if it's not already open, it's an empty source, so create
+                  and open it for writing.
+               */
+               if (!_open) {
+                       open_for_write ();
+               }
+
+               /* Flush, which will definitely put something on disk */
+               flush_midi ();
+       }
+}
+