From 36dd06d2dc07a139af9cf67590b2f4a9268c8632 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Fri, 10 Jul 2020 18:30:39 +1000 Subject: [PATCH] viewer: set video and audio caches to children of the viewer Ensures their thread gets changed along with the viewer. The project gets loaded/created in a background thread so the GUI can remain responsive, and is then moved to the main thread for intended event handling. However if the caches aren't parented, the hierarchy breaks and the caches remain in a thread whose event loop is quickly destroyed. Now that they're parented, events can be properly queued on them once again. --- app/node/output/viewer/viewer.cpp | 4 +++- app/render/audioplaybackcache.cpp | 3 ++- app/render/audioplaybackcache.h | 2 +- app/render/framehashcache.h | 10 +++++++--- app/render/playbackcache.h | 5 ++++- 5 files changed, 17 insertions(+), 7 deletions(-) diff --git a/app/node/output/viewer/viewer.cpp b/app/node/output/viewer/viewer.cpp index 45fd6b23d..b5b0f495b 100644 --- a/app/node/output/viewer/viewer.cpp +++ b/app/node/output/viewer/viewer.cpp @@ -24,7 +24,9 @@ OLIVE_NAMESPACE_ENTER -ViewerOutput::ViewerOutput() +ViewerOutput::ViewerOutput() : + video_frame_cache_(this), + audio_playback_cache_(this) { texture_input_ = new NodeInput("tex_in", NodeInput::kTexture); AddInput(texture_input_); diff --git a/app/render/audioplaybackcache.cpp b/app/render/audioplaybackcache.cpp index 98503223e..73e76a067 100644 --- a/app/render/audioplaybackcache.cpp +++ b/app/render/audioplaybackcache.cpp @@ -28,7 +28,8 @@ OLIVE_NAMESPACE_ENTER -AudioPlaybackCache::AudioPlaybackCache() +AudioPlaybackCache::AudioPlaybackCache(QObject* parent) : + PlaybackCache(parent) { quint32 r = std::rand(); UpdateFilename(QString::number(r)); diff --git a/app/render/audioplaybackcache.h b/app/render/audioplaybackcache.h index 9e1328fbc..5fdb224df 100644 --- a/app/render/audioplaybackcache.h +++ b/app/render/audioplaybackcache.h @@ -31,7 +31,7 @@ class AudioPlaybackCache : public PlaybackCache { Q_OBJECT public: - AudioPlaybackCache(); + AudioPlaybackCache(QObject* parent = nullptr); AudioParams GetParameters() { QMutexLocker locker(lock()); diff --git a/app/render/framehashcache.h b/app/render/framehashcache.h index a31c4335c..96878059e 100644 --- a/app/render/framehashcache.h +++ b/app/render/framehashcache.h @@ -35,12 +35,13 @@ class FrameHashCache : public PlaybackCache { Q_OBJECT public: - FrameHashCache() = default; + FrameHashCache(QObject* parent = nullptr) : + PlaybackCache(parent) + { + } QByteArray GetHash(const rational& time); - void SetHash(const rational& time, const QByteArray& hash, const qint64 &job_time); - void SetTimebase(const rational& tb); /** @@ -72,6 +73,9 @@ public: QVector GetFrameListFromTimeRange(const TimeRangeList &range); QVector GetInvalidatedFrames(); +public slots: + void SetHash(const OLIVE_NAMESPACE::rational& time, const QByteArray& hash, const qint64 &job_time); + protected: virtual void LengthChangedEvent(const rational& old, const rational& newlen) override; diff --git a/app/render/playbackcache.h b/app/render/playbackcache.h index f73cefb9f..ce54bdd7e 100644 --- a/app/render/playbackcache.h +++ b/app/render/playbackcache.h @@ -32,7 +32,10 @@ class PlaybackCache : public QObject { Q_OBJECT public: - PlaybackCache() = default; + PlaybackCache(QObject* parent = nullptr) : + QObject(parent) + { + } void Invalidate(const TimeRange& r);