From 7771bab5a057e3d081391c228e928b3f44fe4f24 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Wed, 18 Mar 2020 19:06:56 +1100 Subject: [PATCH] audiobackend: truncate PCM cache size when the length is reduced --- app/render/backend/audio/audiobackend.cpp | 1 + app/render/backend/audiorenderbackend.cpp | 13 +++++++++++++ app/render/backend/audiorenderbackend.h | 2 ++ 3 files changed, 16 insertions(+) diff --git a/app/render/backend/audio/audiobackend.cpp b/app/render/backend/audio/audiobackend.cpp index b6ccd42fa..cab440175 100644 --- a/app/render/backend/audio/audiobackend.cpp +++ b/app/render/backend/audio/audiobackend.cpp @@ -85,6 +85,7 @@ void AudioBackend::ThreadCompletedCache(NodeDependency dep, NodeValueTable data, f.write(cached_samples.data(), copy_length); if (copy_length < length) { + // Fill in remainder with silence QByteArray empty_space(length - copy_length, 0); f.write(empty_space); diff --git a/app/render/backend/audiorenderbackend.cpp b/app/render/backend/audiorenderbackend.cpp index 53a1c9177..32348310d 100644 --- a/app/render/backend/audiorenderbackend.cpp +++ b/app/render/backend/audiorenderbackend.cpp @@ -36,12 +36,14 @@ void AudioRenderBackend::ConnectViewer(ViewerOutput *node) { connect(node, &ViewerOutput::AudioChangedBetween, this, &AudioRenderBackend::InvalidateCache); connect(node, &ViewerOutput::AudioGraphChanged, this, &AudioRenderBackend::QueueRecompile); + connect(node, &ViewerOutput::LengthChanged, this, &AudioRenderBackend::TruncateCache); } void AudioRenderBackend::DisconnectViewer(ViewerOutput *node) { disconnect(node, &ViewerOutput::AudioChangedBetween, this, &AudioRenderBackend::InvalidateCache); disconnect(node, &ViewerOutput::AudioGraphChanged, this, &AudioRenderBackend::QueueRecompile); + disconnect(node, &ViewerOutput::LengthChanged, this, &AudioRenderBackend::TruncateCache); } bool AudioRenderBackend::CompileInternal() @@ -192,6 +194,17 @@ void AudioRenderBackend::ConformUpdated(Stream *stream, const AudioRenderingPara } } +void AudioRenderBackend::TruncateCache(const rational &r) +{ + int seq_length = params_.time_to_bytes(r); + + QFile cache_pcm(CachePathName()); + + if (cache_pcm.size() > seq_length) { + cache_pcm.resize(seq_length); + } +} + bool AudioRenderBackend::ConformWaitInfo::operator==(const AudioRenderBackend::ConformWaitInfo &rhs) const { return rhs.params == params diff --git a/app/render/backend/audiorenderbackend.h b/app/render/backend/audiorenderbackend.h index 37ff4521d..0f5aed463 100644 --- a/app/render/backend/audiorenderbackend.h +++ b/app/render/backend/audiorenderbackend.h @@ -74,6 +74,8 @@ private slots: void ConformUpdated(Stream *stream, const AudioRenderingParams& params); + void TruncateCache(const rational& r); + }; #endif // AUDIORENDERBACKEND_H