From 92da0c220d6b779c819d234cb5b690c103ffbcf5 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sun, 5 Apr 2020 00:13:26 +1100 Subject: [PATCH] exporter: wait for conforms/indexes when exporting audio The audio rendering system uses an event-based mechanism where if audio needs to be converted (i.e. to a different sample rate), it will create a conform task and re-render that section again when the audio is ready. Unfortunately, the export code didn't respect this and would start encoding audio once the initial queue was done. This usually resulted in silent audio, but could also result in "uninitialized" audio that would crash any float-based encoders (e.g. AAC). Now we use a different signal that only emits once the queue is done AND all conforms are done. --- app/render/backend/audiorenderbackend.cpp | 8 ++++++++ app/render/backend/audiorenderbackend.h | 4 ++++ app/render/backend/exporter.cpp | 2 +- 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/app/render/backend/audiorenderbackend.cpp b/app/render/backend/audiorenderbackend.cpp index 8ad0eff57..72428f743 100644 --- a/app/render/backend/audiorenderbackend.cpp +++ b/app/render/backend/audiorenderbackend.cpp @@ -12,6 +12,7 @@ AudioRenderBackend::AudioRenderBackend(QObject *parent) : ic_from_conform_(false) { connect(IndexManager::instance(), &IndexManager::StreamConformAppended, this, &AudioRenderBackend::ConformUpdated); + connect(this, &AudioRenderBackend::QueueComplete, this, &AudioRenderBackend::FilterQueueCompleteSignal); } void AudioRenderBackend::SetParameters(const AudioRenderingParams ¶ms) @@ -205,6 +206,13 @@ void AudioRenderBackend::TruncateCache(const rational &r) } } +void AudioRenderBackend::FilterQueueCompleteSignal() +{ + if (conform_wait_info_.isEmpty()) { + emit AudioComplete(); + } +} + 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 0f5aed463..07ed394f8 100644 --- a/app/render/backend/audiorenderbackend.h +++ b/app/render/backend/audiorenderbackend.h @@ -27,6 +27,8 @@ public: signals: void ParamsChanged(); + void AudioComplete(); + protected: virtual void ConnectViewer(ViewerOutput* node) override; @@ -76,6 +78,8 @@ private slots: void TruncateCache(const rational& r); + void FilterQueueCompleteSignal(); + }; #endif // AUDIORENDERBACKEND_H diff --git a/app/render/backend/exporter.cpp b/app/render/backend/exporter.cpp index 32c87bacb..d8b7d448c 100644 --- a/app/render/backend/exporter.cpp +++ b/app/render/backend/exporter.cpp @@ -245,7 +245,7 @@ void Exporter::EncoderOpenedSuccessfully() if (!audio_done_) { // We set the audio backend to render the full sequence to the disk - connect(audio_backend_, &AudioRenderBackend::QueueComplete, this, &Exporter::AudioRendered); + connect(audio_backend_, &AudioRenderBackend::AudioComplete, this, &Exporter::AudioRendered); audio_backend_->InvalidateCache(TimeRange(0, viewer_node_->Length())); }