diff --git a/app/render/previewautocacher.cpp b/app/render/previewautocacher.cpp index 5801bd532..ceba5b335 100644 --- a/app/render/previewautocacher.cpp +++ b/app/render/previewautocacher.cpp @@ -132,10 +132,7 @@ void PreviewAutoCacher::HashesProcessed() } } - if (hash_iterator_.HasNext()) { - // Launch next hashes - QueueNextHashTask(); - } else { + if (!hash_iterator_.HasNext()) { // Restart delayed requeue timer delayed_requeue_timer_.stop(); delayed_requeue_timer_.start(); @@ -145,6 +142,9 @@ void PreviewAutoCacher::HashesProcessed() // The cacher might be waiting for this job to finish if (!graph_update_queue_.isEmpty()) { TryRender(); + } else if (hash_iterator_.HasNext()) { + // Launch next hashes + QueueNextHashTask(); } delete watcher; @@ -213,7 +213,9 @@ void PreviewAutoCacher::AudioRendered() } // The cacher might be waiting for this job to finish - if (!graph_update_queue_.isEmpty()) { + if (graph_update_queue_.isEmpty()) { + QueueNextAudioTask(); + } else { TryRender(); } @@ -442,6 +444,8 @@ void PreviewAutoCacher::ClearVideoQueue(bool hard) void PreviewAutoCacher::ClearAudioQueue(bool hard) { ClearQueueInternal(audio_tasks_, hard, &PreviewAutoCacher::AudioRendered); + + audio_iterator_.clear(); } void PreviewAutoCacher::ClearVideoDownloadQueue(bool hard) @@ -503,16 +507,10 @@ void PreviewAutoCacher::TryRender() } if (!invalidated_audio_.isEmpty()) { - foreach (const TimeRange& range, invalidated_audio_) { - std::list chunks = range.Split(30); + audio_iterator_ = invalidated_audio_; - foreach (const TimeRange& r, chunks) { - RenderTicketWatcher* watcher = new RenderTicketWatcher(); - watcher->setProperty("job", QVariant::fromValue(last_update_time_)); - connect(watcher, &RenderTicketWatcher::Finished, this, &PreviewAutoCacher::AudioRendered); - audio_tasks_.insert(watcher, r); - watcher->SetTicket(RenderManager::instance()->RenderAudio(copied_viewer_node_, r, RenderMode::kOffline, true)); - } + for (int i=0; isetProperty("job", QVariant::fromValue(last_update_time_)); + connect(watcher, &RenderTicketWatcher::Finished, this, &PreviewAutoCacher::AudioRendered); + audio_tasks_.insert(watcher, r); + watcher->SetTicket(RenderManager::instance()->RenderAudio(copied_viewer_node_, r, RenderMode::kOffline, false)); + + audio_iterator_.remove(r); + } +} + template void PreviewAutoCacher::ClearQueueInternal(T& list, bool hard, Func member) { diff --git a/app/render/previewautocacher.h b/app/render/previewautocacher.h index 0036a9738..af59b4cf7 100644 --- a/app/render/previewautocacher.h +++ b/app/render/previewautocacher.h @@ -107,6 +107,7 @@ private: void QueueNextFrameInRange(int max); void QueueNextHashTask(); + void QueueNextAudioTask(); struct HashData { rational time; @@ -176,6 +177,7 @@ private: TimeRangeListFrameIterator queued_frame_iterator_; TimeRangeListFrameIterator hash_iterator_; + TimeRangeList audio_iterator_; private slots: /**