summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2008-05-21 05:05:26 +0000
committerDavid Robillard <d@drobilla.net>2008-05-21 05:05:26 +0000
commite9d9f8d8ccb843308087430285836474763941a8 (patch)
treefa9bbc1640a315b53393e8b09992c5720e87f61a
parentd9228151aee5cb6e7809ef273e9f3b34e74b4b12 (diff)
Clean up MidiDiskstream code, more closely match audio diskstream.
git-svn-id: svn://localhost/ardour2/branches/3.0@3374 d708f5d6-7413-0410-9779-e7cbd77b26cf
-rw-r--r--libs/ardour/midi_diskstream.cc45
1 files changed, 18 insertions, 27 deletions
diff --git a/libs/ardour/midi_diskstream.cc b/libs/ardour/midi_diskstream.cc
index 27b9ad7942..b36e8da293 100644
--- a/libs/ardour/midi_diskstream.cc
+++ b/libs/ardour/midi_diskstream.cc
@@ -818,47 +818,49 @@ MidiDiskstream::do_refill_with_alloc ()
int
MidiDiskstream::do_refill ()
{
- int32_t ret = 0;
- size_t write_space = _playback_buf->write_space();
-
- bool reversed = (_visible_speed * _session.transport_speed()) < 0.0f;
+ int ret = 0;
+ size_t write_space = _playback_buf->write_space();
+ bool reversed = (_visible_speed * _session.transport_speed()) < 0.0f;
if (write_space == 0) {
return 0;
}
+
+ /* if there are 2+ chunks of disk i/o possible for
+ this track, let the caller know so that it can arrange
+ for us to be called again, ASAP.
+ */
+
+ if (write_space >= (_slaved?3:2) * disk_io_chunk_frames) {
+ ret = 1;
+ }
/* if we're running close to normal speed and there isn't enough
space to do disk_io_chunk_frames of I/O, then don't bother.
at higher speeds, just do it because the sync between butler
and audio thread may not be good enough.
- */
+ */
if ((write_space < disk_io_chunk_frames) && fabs (_actual_speed) < 2.0f) {
- //cerr << "No refill 1\n";
return 0;
}
/* when slaved, don't try to get too close to the read pointer. this
leaves space for the buffer reversal to have something useful to
work with.
- */
+ */
if (_slaved && write_space < (_playback_buf->capacity() / 2)) {
- //cerr << "No refill 2\n";
return 0;
}
if (reversed) {
- //cerr << "No refill 3 (reverse)\n";
return 0;
}
+ /* at end: nothing to do */
if (file_frame == max_frames) {
- //cerr << "No refill 4 (EOF)\n";
-
- /* at end: nothing to do */
-
return 0;
}
@@ -866,19 +868,12 @@ MidiDiskstream::do_refill ()
assert(_playback_buf->write_space() > 0); // ... have something to write to, and
assert(file_frame <= max_frames); // ... something to write
- nframes_t file_frame_tmp = file_frame;
nframes_t to_read = min(disk_io_chunk_frames, (max_frames - file_frame));
- // FIXME: read count?
- if (read (file_frame_tmp, to_read, reversed)) {
+ if (read (file_frame, to_read, reversed)) {
ret = -1;
- goto out;
}
-
- file_frame = file_frame_tmp;
-
-out:
-
+
return ret;
}
@@ -897,8 +892,6 @@ MidiDiskstream::do_flush (Session::RunContext context, bool force_flush)
{
uint32_t to_write;
int32_t ret = 0;
- // FIXME: I'd be lying if I said I knew what this thing was
- //RingBufferNPT<CaptureTransition>::rw_vector transvec;
nframes_t total;
_write_data_count = 0;
@@ -929,7 +922,6 @@ MidiDiskstream::do_flush (Session::RunContext context, bool force_flush)
ret = 1;
}
- //to_write = min (disk_io_chunk_frames, (nframes_t) vector.len[0]);
to_write = disk_io_chunk_frames;
assert(!destructive());
@@ -944,8 +936,7 @@ MidiDiskstream::do_flush (Session::RunContext context, bool force_flush)
}
out:
- //return ret;
- return 0; // FIXME: everything's fine! always! honest!
+ return ret;
}
void