fixes for 98% of all the warnings/errors reported by OS X gcc on tiger
[ardour.git] / libs / ardour / midi_diskstream.cc
index ff3d5d67755d0ca38ed9e2885127990aad9a61f5..28ee12cc5ae3f574d0c24cf1bf4366a7883096d5 100644 (file)
@@ -74,7 +74,6 @@ MidiDiskstream::MidiDiskstream (Session &sess, const string &name, Diskstream::F
        , _playback_buf(0)
        , _capture_buf(0)
        , _source_port(0)
-       , _last_flush_frame(0)
        , _note_mode(Sustained)
        , _frames_written_to_ringbuffer(0)
        , _frames_read_from_ringbuffer(0)
@@ -95,7 +94,6 @@ MidiDiskstream::MidiDiskstream (Session& sess, const XMLNode& node)
        , _playback_buf(0)
        , _capture_buf(0)
        , _source_port(0)
-       , _last_flush_frame(0)
        , _note_mode(Sustained)
        , _frames_written_to_ringbuffer(0)
        , _frames_read_from_ringbuffer(0)
@@ -146,7 +144,6 @@ MidiDiskstream::non_realtime_locate (framepos_t position)
        if (_write_source) {
                _write_source->set_timeline_position (position);
        }
-       cerr << name() << " Seeking to " << position << endl;
        seek (position, false);
 }
 
@@ -203,7 +200,9 @@ MidiDiskstream::non_realtime_input_change ()
                seek (_session.transport_frame());
        }
 
-       _last_flush_frame = _session.transport_frame();
+       if (_write_source) {
+               _write_source->set_last_write_end (_session.transport_frame());
+       }
 }
 
 int
@@ -292,6 +291,7 @@ MidiDiskstream::use_copy_playlist ()
 int
 MidiDiskstream::set_destructive (bool yn)
 {
+       yn = 0; // stop pedantic gcc complaints about unused parameter
        assert( ! destructive());
        assert( ! yn);
        return -1;
@@ -476,7 +476,7 @@ trace_midi (ostream& o, MIDI::byte *msg, size_t len)
 #endif
 
 int
-MidiDiskstream::process (framepos_t transport_frame, pframes_t nframes, bool can_record, bool rec_monitors_input, bool& need_butler)
+MidiDiskstream::process (framepos_t transport_frame, pframes_t nframes, bool can_record, bool& need_butler)
 {
        int       ret = -1;
        framecnt_t rec_offset = 0;
@@ -564,7 +564,7 @@ MidiDiskstream::process (framepos_t transport_frame, pframes_t nframes, bool can
        } else {
 
                if (was_recording) {
-                       finish_capture (rec_monitors_input);
+                       finish_capture ();
                }
 
        }
@@ -861,27 +861,23 @@ MidiDiskstream::do_refill ()
 int
 MidiDiskstream::do_flush (RunContext /*context*/, bool force_flush)
 {
-       uint32_t to_write;
-       int32_t ret = 0;
+       framecnt_t to_write;
        framecnt_t total;
+       int32_t ret = 0;
+
+       if (!_write_source) {
+               return 0;
+       }
 
-       cerr << name() << " flushing to disk, bufspace = " << _capture_buf->read_space() << endl;
+       assert (!destructive());
 
        _write_data_count = 0;
 
-       total = _session.transport_frame() - _last_flush_frame;
-
-       if (_last_flush_frame > _session.transport_frame() || _last_flush_frame < capture_start_frame) {
-               _last_flush_frame = _session.transport_frame();
-       }
+       total = _session.transport_frame() - _write_source->last_write_end();
 
-       if (total == 0 || _capture_buf->read_space() == 0
-                       || (!force_flush && (total < disk_io_chunk_frames && was_recording))) {
-               cerr << "\tFlush shortcut because total = " << total
-                    << " capture read space = " << _capture_buf->read_space()
-                    << " force flush = " << force_flush 
-                    << " was recording = " << was_recording
-                    << endl;
+       if (total == 0 || 
+           _capture_buf->read_space() == 0 || 
+           (!force_flush && (total < disk_io_chunk_frames) && was_recording)) {
                goto out;
        }
 
@@ -900,24 +896,18 @@ MidiDiskstream::do_flush (RunContext /*context*/, bool force_flush)
                ret = 1;
        }
 
-       to_write = disk_io_chunk_frames;
-
-       assert(!destructive());
+       if (force_flush) {
+               /* push out everything we have, right now */
+               to_write = max_framecnt;
+       } else {
+               to_write = disk_io_chunk_frames;
+       }
 
-       if (record_enabled() &&
-           ((_session.transport_frame() - _last_flush_frame > disk_io_chunk_frames) ||
-            force_flush)) {
-               if ((!_write_source) || _write_source->midi_write (*_capture_buf, get_capture_start_frame (0), to_write) != to_write) {
+       if (record_enabled() && ((total > disk_io_chunk_frames) || force_flush)) {
+               if (_write_source->midi_write (*_capture_buf, get_capture_start_frame (0), to_write) != to_write) {
                        error << string_compose(_("MidiDiskstream %1: cannot write to disk"), _id) << endmsg;
                        return -1;
-               } else {
-                       cerr << "didn't write, _write_source = " << _write_source << endl;
-                       _last_flush_frame = _session.transport_frame();
-               }
-       } else {
-               cerr << "\tdidn't write to disk because recenabled = " << record_enabled()
-                    << " last flush @ " << _last_flush_frame << " disk io " << disk_io_chunk_frames << " TF @ " << _session.transport_frame()
-                    << " force = " << force_flush << endl;
+               } 
        }
 
 out:
@@ -934,7 +924,7 @@ MidiDiskstream::transport_stopped_wallclock (struct tm& /*when*/, time_t /*twhen
        MidiRegion::SourceList::iterator src;
        vector<CaptureInfo*>::iterator ci;
 
-       finish_capture (true);
+       finish_capture ();
 
        /* butler is already stopped, but there may be work to do
           to flush remaining data to disk.
@@ -990,17 +980,17 @@ MidiDiskstream::transport_stopped_wallclock (struct tm& /*when*/, time_t /*twhen
                        _write_source->set_timeline_position (capture_info.front()->start);
                        _write_source->set_captured_for (_name);
 
+                       /* set length in beats to entire capture length */
+
+                       BeatsFramesConverter converter (_session.tempo_map(), capture_info.front()->start);
+                       const double total_capture_beats = converter.from (total_capture);
+                       _write_source->set_length_beats (total_capture_beats);
+
                        /* flush to disk: this step differs from the audio path,
                           where all the data is already on disk.
                        */
 
-                       _write_source->mark_streaming_write_completed ();
-
-                       /* set length in beats to entire capture length */
-
-                       BeatsFramesConverter converter (_session.tempo_map(), capture_info.front()->start);
-                       const double total_capture_beats = converter.from(total_capture);
-                       _write_source->set_length_beats(total_capture_beats);
+                       _write_source->mark_midi_streaming_write_completed (Evoral::Sequence<Evoral::MusicalTime>::ResolveStuckNotes, total_capture_beats);
 
                        /* we will want to be able to keep (over)writing the source
                           but we don't want it to be removable. this also differs
@@ -1135,7 +1125,7 @@ MidiDiskstream::transport_looped (framepos_t transport_frame)
                        }
                }
 
-               finish_capture (true);
+               finish_capture ();
 
                // the next region will start recording via the normal mechanism
                // we'll set the start position to the current transport pos
@@ -1148,7 +1138,7 @@ MidiDiskstream::transport_looped (framepos_t transport_frame)
 }
 
 void
-MidiDiskstream::finish_capture (bool /*rec_monitors_input*/)
+MidiDiskstream::finish_capture ()
 {
        was_recording = false;