diff options
author | Robin Gareus <robin@gareus.org> | 2020-04-14 03:57:26 +0200 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2020-04-14 03:57:26 +0200 |
commit | ea2bda666813ed7b8963ee2884f7a496b8284b08 (patch) | |
tree | b6bddc9e65df364163f86e7390c981dc6c6c1d8e /libs/ardour/disk_reader.cc | |
parent | d5f25f998bb5a5cb8aefbba8679e63ffa0062d55 (diff) |
Fix playback alignment when adding/removing channels
The disk-reader assumes that all playback ringbuffers are in sync
and have the same fill_level.
Diffstat (limited to 'libs/ardour/disk_reader.cc')
-rw-r--r-- | libs/ardour/disk_reader.cc | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/libs/ardour/disk_reader.cc b/libs/ardour/disk_reader.cc index 666f8a1e6a..4e687c7962 100644 --- a/libs/ardour/disk_reader.cc +++ b/libs/ardour/disk_reader.cc @@ -507,6 +507,12 @@ DiskReader::declick_in_progress () const return (_declick_amp.gain () != 0); // declick-out } +void +DiskReader::configuration_changed () +{ + _session.request_overwrite_buffer (_track, LoopDisabled); +} + bool DiskReader::pending_overwrite () const { @@ -521,6 +527,24 @@ DiskReader::set_pending_overwrite (OverwriteReason why) /* called from audio thread, so we can use the read ptr and playback sample as we wish */ if (!c->empty ()) { + + if (c->size () > 1) { + /* Align newly added buffers. + * + * overwrite_sample and file_sample[] are are maintained + * per DiskReader, not per channel. + * ::refill_audio() and ::overwrite_existing_audio() expect + * that read-pointers and fill_level of all buffers are in sync. + */ + ChannelList::iterator chan = c->begin (); + for (++chan; chan != c->end (); ++chan) { + ReaderChannelInfo* chaninfo = dynamic_cast<ReaderChannelInfo*> (*chan); + if (!chaninfo->initialized) { + (*chan)->rbuf->align_to (*(c->front ()->rbuf)); + } + } + } + const samplecnt_t reserved_size = c->front ()->rbuf->reserved_size (); const samplecnt_t bufsize = c->front ()->rbuf->bufsize (); |