diff --git a/app/render/backend/audiorenderbackend.cpp b/app/render/backend/audiorenderbackend.cpp index 70dec1bb2..53a1c9177 100644 --- a/app/render/backend/audiorenderbackend.cpp +++ b/app/render/backend/audiorenderbackend.cpp @@ -8,7 +8,8 @@ #include "render/backend/indexmanager.h" AudioRenderBackend::AudioRenderBackend(QObject *parent) : - RenderBackend(parent) + RenderBackend(parent), + ic_from_conform_(false) { connect(IndexManager::instance(), &IndexManager::StreamConformAppended, this, &AudioRenderBackend::ConformUpdated); } @@ -112,6 +113,38 @@ TimeRange AudioRenderBackend::PopNextFrameFromQueue() return range; } +void AudioRenderBackend::InvalidateCacheInternal(const rational &start_range, const rational &end_range) +{ + if (!ic_from_conform_) { + // Cancel any ranges waiting on a conform here since obviously the contents have changed + TimeRange range(start_range, end_range); + + for (int i=0;i start_range) { + info.affected_range.set_out(start_range); + } else if (info.affected_range.in() < end_range && info.affected_range.out() > end_range) { + info.affected_range.set_in(end_range); + } + } + } + + RenderBackend::InvalidateCacheInternal(start_range, end_range); +} + void AudioRenderBackend::ConformUnavailable(StreamPtr stream, const TimeRange &range, const rational &stream_time, const AudioRenderingParams& params) { ConformWaitInfo info = {stream, params, range, stream_time}; @@ -120,8 +153,6 @@ void AudioRenderBackend::ConformUnavailable(StreamPtr stream, const TimeRange &r return; } - qDebug() << "Waiting for conformed" << stream.get() << "time" << stream_time.toDouble() << "for frame" << range.in(); - AudioStreamPtr audio_stream = std::static_pointer_cast(stream); if (IndexManager::instance()->IsConforming(audio_stream, params)) { @@ -150,10 +181,13 @@ void AudioRenderBackend::ConformUpdated(Stream *stream, const AudioRenderingPara if (info.stream.get() == stream && info.params == params) { - InvalidateCache(info.affected_range); conform_wait_info_.removeAt(i); i--; + ic_from_conform_ = true; + InvalidateCache(info.affected_range); + ic_from_conform_ = false; + } } } diff --git a/app/render/backend/audiorenderbackend.h b/app/render/backend/audiorenderbackend.h index 5724e4e16..37ff4521d 100644 --- a/app/render/backend/audiorenderbackend.h +++ b/app/render/backend/audiorenderbackend.h @@ -49,6 +49,8 @@ protected: virtual TimeRange PopNextFrameFromQueue() override; + virtual void InvalidateCacheInternal(const rational &start_range, const rational &end_range) override; + QHash copy_map_; private: @@ -65,6 +67,8 @@ private: AudioRenderingParams params_; + bool ic_from_conform_; + private slots: void ConformUnavailable(StreamPtr stream, const TimeRange& range, const rational& stream_time, const AudioRenderingParams ¶ms);