summaryrefslogtreecommitdiff
path: root/libs/ardour/delayline.cc
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2017-11-04 16:24:09 +0100
committerRobin Gareus <robin@gareus.org>2017-11-04 16:24:09 +0100
commit06abdee652d69a22ad7573d2392148c6fbe6d968 (patch)
tree77b85a9789bba2b2864bbf478d6febf68585cebb /libs/ardour/delayline.cc
parentd26ad5573ca47a851575d9fe3e11e9d5c4b7dd67 (diff)
[Re]-Implement Delayline flush.
Also don't automatically flush the delayline at transport or monitor- changes anymore. With full-graph latency compensation, delaylines are before the disk-reader, aligning input (disk uses read-ahead to align). Flushing the delayline should only happen when input-monitoring is disengaged. It's best degated to the Route or object using the Delayline (potentially latency-aligned delayed flush).
Diffstat (limited to 'libs/ardour/delayline.cc')
-rw-r--r--libs/ardour/delayline.cc22
1 files changed, 22 insertions, 0 deletions
diff --git a/libs/ardour/delayline.cc b/libs/ardour/delayline.cc
index d0a691c5ff..72ea208126 100644
--- a/libs/ardour/delayline.cc
+++ b/libs/ardour/delayline.cc
@@ -69,6 +69,8 @@ DelayLine::run (BufferSet& bufs, samplepos_t /* start_sample */, samplepos_t /*
const bool pending_flush = _pending_flush;
_pending_flush = false;
+ // TODO handle pending_flush.
+
/* Audio buffers */
if (_buf.size () == bufs.count ().n_audio () && _buf.size () > 0) {
@@ -155,6 +157,26 @@ DelayLine::run (BufferSet& bufs, samplepos_t /* start_sample */, samplepos_t /*
/* set new delay */
_delay = pending_delay;
+ if (pending_flush) {
+ /* fade out data after read-pointer, clear buffer until write-pointer */
+ const samplecnt_t fade_out_len = std::min (_delay, (samplecnt_t)FADE_LEN);
+
+ for (AudioDlyBuf::iterator i = _buf.begin(); i != _buf.end (); ++i) {
+ Sample* rb = (*i).get ();
+ uint32_t s = 0;
+ for (; s < fade_out_len; ++s) {
+ sampleoffset_t off = (_roff + s) % _bsiz;
+ rb[off] *= 1. - (s / (float) fade_out_len);
+ }
+ for (; s < _delay; ++s) {
+ sampleoffset_t off = (_roff + s) % _bsiz;
+ rb[off] = 0;
+ }
+ assert (_woff == ((_roff + s) % _bsiz));
+ }
+ // TODO consider adding a fade-in to bufs
+ }
+
/* delay audio buffers */
assert (_delay == ((_woff - _roff + _bsiz) % _bsiz));
AudioDlyBuf::iterator bi = _buf.begin ();