From c4b0a53174842d593b2209dee96360f3ca253b24 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Mon, 18 May 2020 22:52:31 +1000 Subject: [PATCH] cache: render audio in chunks so they can be multithreaded --- app/render/backend/renderbackend.cpp | 46 ++++++++++++++++++---------- 1 file changed, 30 insertions(+), 16 deletions(-) diff --git a/app/render/backend/renderbackend.cpp b/app/render/backend/renderbackend.cpp index 11a3a41d4..cac1c18a7 100644 --- a/app/render/backend/renderbackend.cpp +++ b/app/render/backend/renderbackend.cpp @@ -360,25 +360,39 @@ void RenderBackend::AudioInvalidated(const TimeRange& r) } } - // FIXME: Split into chunks for multithreading + // Split into 2 second chunks, one for each thread + const int chunk_size = 2; - { - QMutexLocker locker(&queued_audio_lock_); - if (queued_audio_.ContainsTimeRange(r)) { - return; + QList split_ranges; + + int start_time = qFloor(r.in().toDouble() / static_cast(chunk_size)) * chunk_size; + int end_time = qCeil(r.out().toDouble() / static_cast(chunk_size)) * chunk_size; + for (int i=start_time; i* watcher = new QFutureWatcher(); + connect(watcher, &QFutureWatcher::finished, + this, &RenderBackend::AudioRendered); + + audio_jobs_.insert(watcher, this_range); + + watcher->setFuture(QtConcurrent::run(&audio_pool_.threads, + GetInstanceFromPool(audio_pool_), + &RenderWorker::RenderAudio, + this_range)); } - - QFutureWatcher* watcher = new QFutureWatcher(); - connect(watcher, &QFutureWatcher::finished, this, &RenderBackend::AudioRendered); - - audio_jobs_.insert(watcher, r); - - watcher->setFuture(QtConcurrent::run(&audio_pool_.threads, - GetInstanceFromPool(audio_pool_), - &RenderWorker::RenderAudio, - r)); } void RenderBackend::AudioRendered()