summaryrefslogtreecommitdiff
path: root/libs/ardour/disk_reader.cc
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2019-02-06 20:22:22 +0100
committerRobin Gareus <robin@gareus.org>2019-02-06 20:22:22 +0100
commit1845dff4c8c95b7916ff1b1df9194e6df16143d4 (patch)
tree74a683fa3d238cd1c27be70c12e9fd2d166728fa /libs/ardour/disk_reader.cc
parentdcd612f8a70cbdfd9b36c882468adaf158f87592 (diff)
Implement backwards micro-locates
Diffstat (limited to 'libs/ardour/disk_reader.cc')
-rw-r--r--libs/ardour/disk_reader.cc36
1 files changed, 10 insertions, 26 deletions
diff --git a/libs/ardour/disk_reader.cc b/libs/ardour/disk_reader.cc
index 973cd33e3c..c5ae34d4f2 100644
--- a/libs/ardour/disk_reader.cc
+++ b/libs/ardour/disk_reader.cc
@@ -283,12 +283,10 @@ DiskReader::run (BufferSet& bufs, samplepos_t start_sample, samplepos_t end_samp
assert (speed == -1 || speed == 0 || speed == 1);
- if (speed < 0) {
- disk_samples_to_consume = -nframes;
- } else if (speed > 0) {
- disk_samples_to_consume = nframes;
- } else {
+ if (speed == 0) {
disk_samples_to_consume = 0;
+ } else {
+ disk_samples_to_consume = nframes;
}
if (!result_required || ((ms & MonitoringDisk) == 0) || still_locating || _no_disk_output) {
@@ -316,7 +314,7 @@ DiskReader::run (BufferSet& bufs, samplepos_t start_sample, samplepos_t end_samp
gain_t scaling;
if (n_chans > n_buffers) {
- scaling = ((float) n_buffers)/n_chans;
+ scaling = ((float) n_buffers) / n_chans;
} else {
scaling = 1.0;
}
@@ -335,27 +333,14 @@ DiskReader::run (BufferSet& bufs, samplepos_t start_sample, samplepos_t end_samp
disk_signal = output.data ();
}
- if (speed > 0) {
- if (start_sample < playback_sample) {
- cerr << owner()->name() << " SS = " << start_sample << " PS = " << playback_sample << endl;
- abort ();
- }
- } else if (speed < 0) {
- if (playback_sample < start_sample) {
- cerr << owner()->name() << " SS = " << start_sample << " PS = " << playback_sample << " REVERSE" << endl;
- abort ();
- }
- }
-
- if ((speed > 0) && (start_sample != playback_sample)) {
- stringstream str;
- str << owner()->name() << " playback @ " << start_sample << " not aligned with " << playback_sample << " jump ahead " << (start_sample - playback_sample) << endl;
- cerr << str.str();
+ if (start_sample != playback_sample) {
+ cerr << owner()->name() << " playback @ " << start_sample << " not aligned with " << playback_sample << " jump " << (start_sample - playback_sample) << endl;
if (can_internal_playback_seek (start_sample - playback_sample)) {
internal_playback_seek (start_sample - playback_sample);
} else {
cerr << owner()->name() << " playback not possible: ss = " << start_sample << " ps = " << playback_sample << endl;
+ abort (); // XXX -- now what?
goto midi;
}
}
@@ -377,8 +362,6 @@ DiskReader::run (BufferSet& bufs, samplepos_t start_sample, samplepos_t end_samp
apply_gain_to_buffer (disk_signal, disk_samples_to_consume, scaling);
}
- //chaninfo->rbuf->increment_read_ptr (disk_samples_to_consume);
-
if (ms & MonitoringInput) {
/* mix the disk signal into the input signal (already in bufs) */
mix_buffers_no_gain (output.data(), disk_signal, disk_samples_to_consume);
@@ -537,6 +520,7 @@ DiskReader::overwrite_existing_buffers ()
samplecnt_t to_read = size;
cerr << owner()->name() << " over-read: " << to_read << endl;
+
if (audio_read ((*chan)->rbuf, sum_buffer.get(), mixdown_buffer.get(), gain_buffer.get(), start, to_read, n, reversed)) {
error << string_compose(_("DiskReader %1: when refilling, cannot read %2 from playlist at sample %3"), id(), size, overwrite_sample) << endmsg;
goto midi;
@@ -976,7 +960,7 @@ DiskReader::refill_audio (Sample* sum_buffer, Sample* mixdown_buffer, float* gai
to_read = min (to_read, samples_to_read);
assert (to_read >= 0);
- cerr << owner()->name() << " to-read: " << to_read << endl;
+ // cerr << owner()->name() << " to-read: " << to_read << endl;
if (to_read) {
if (audio_read (chan->rbuf, sum_buffer, mixdown_buffer, gain_buffer, file_sample_tmp, to_read, chan_n, reversed)) {
@@ -1126,7 +1110,7 @@ void
DiskReader::get_midi_playback (MidiBuffer& dst, samplepos_t start_sample, samplepos_t end_sample, MonitorState ms, BufferSet& scratch_bufs, double speed, samplecnt_t disk_samples_to_consume)
{
MidiBuffer* target;
- samplepos_t nframes = end_sample - start_sample;
+ samplepos_t nframes = llabs (end_sample - start_sample);
assert (_midi_buf);