[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).
This commit is contained in:
Robin Gareus 2017-11-04 16:24:09 +01:00
parent d26ad5573c
commit 06abdee652
2 changed files with 26 additions and 9 deletions

View file

@ -40,21 +40,16 @@ public:
DelayLine (Session& s, const std::string& name);
~DelayLine ();
bool display_to_user () const { return false; }
void run (BufferSet&, samplepos_t, samplepos_t, double, pframes_t, bool);
bool set_name (const std::string& str);
bool set_delay (samplecnt_t signal_delay);
samplecnt_t delay () { return _pending_delay; }
/* processor interface */
bool display_to_user () const { return false; }
void run (BufferSet&, samplepos_t, samplepos_t, double, pframes_t, bool);
bool configure_io (ChanCount in, ChanCount out);
bool can_support_io_configuration (const ChanCount& in, ChanCount& out);
void flush ();
void realtime_handle_transport_stopped () { flush (); }
void realtime_locate () { flush (); }
void monitoring_changed () { flush (); }
bool set_name (const std::string& str);
protected:
XMLNode& state ();

View file

@ -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 ();