diff --git a/app/node/output/viewer/viewer.cpp b/app/node/output/viewer/viewer.cpp index 0c1ebf408..d003c91d6 100644 --- a/app/node/output/viewer/viewer.cpp +++ b/app/node/output/viewer/viewer.cpp @@ -60,7 +60,7 @@ ViewerOutput::ViewerOutput(bool create_buffer_inputs, bool create_default_stream IgnoreHashingFrom(kVideoAutoCacheInput); IgnoreInvalidationsFrom(kVideoAutoCacheInput); - AddInput(kAudioAutoCacheInput, NodeValue::kBoolean, true, InputFlags(kInputFlagNotKeyframable | kInputFlagNotConnectable)); + AddInput(kAudioAutoCacheInput, NodeValue::kBoolean, false, InputFlags(kInputFlagNotKeyframable | kInputFlagNotConnectable)); IgnoreHashingFrom(kAudioAutoCacheInput); IgnoreInvalidationsFrom(kAudioAutoCacheInput); } diff --git a/app/render/previewautocacher.cpp b/app/render/previewautocacher.cpp index d18975da7..18d8367dd 100644 --- a/app/render/previewautocacher.cpp +++ b/app/render/previewautocacher.cpp @@ -887,4 +887,31 @@ void PreviewAutoCacher::SetViewerNode(ViewerOutput *viewer_node) } } +PreviewAutoCacher::PlaybackDevice::PlaybackDevice(PreviewAutoCacher *cacher, QObject *parent) : + cacher_(cacher), + current_time_(0) +{ + audio_params_ = viewer()->GetAudioParams(); +} + +bool PreviewAutoCacher::PlaybackDevice::seek(qint64 pos) +{ + // Call super function + if (QIODevice::seek(pos)) { + // Convert bytes to time + current_time_ = audio_params_.bytes_to_time(pos); + + return true; + } + + return false; +} + +qint64 PreviewAutoCacher::PlaybackDevice::size() const +{ + rational audio_length = cacher_->copied_viewer_node_->GetAudioLength(); + + return audio_params_.time_to_bytes(audio_length); +} + } diff --git a/app/render/previewautocacher.h b/app/render/previewautocacher.h index 1108714d6..04077fd14 100644 --- a/app/render/previewautocacher.h +++ b/app/render/previewautocacher.h @@ -9,6 +9,7 @@ #include "node/node.h" #include "node/output/viewer/viewer.h" #include "node/project/project.h" +#include "render/audioparams.h" #include "render/renderjobtracker.h" #include "threading/threadticketwatcher.h" @@ -71,6 +72,37 @@ public: void CancelVideoTasks(bool and_wait_for_them_to_finish = false); void CancelAudioTasks(bool and_wait_for_them_to_finish = false); + class PlaybackDevice : public QIODevice + { + public: + PlaybackDevice(PreviewAutoCacher *cacher, QObject *parent = nullptr); + + virtual ~PlaybackDevice() override; + + virtual bool isSequential() const override; + + virtual bool seek(qint64 pos) override; + + virtual qint64 size() const override; + + virtual qint64 readData(char *data, qint64 maxSize) override; + + virtual qint64 writeData(const char *, qint64) override; + + ViewerOutput *viewer() const + { + return cacher_->copied_viewer_node_; + } + + private: + PreviewAutoCacher *cacher_; + + rational current_time_; + + AudioParams audio_params_; + + }; + private: void TryRender(); diff --git a/app/widget/viewer/viewer.cpp b/app/widget/viewer/viewer.cpp index 253443795..b9cb8aa60 100644 --- a/app/widget/viewer/viewer.cpp +++ b/app/widget/viewer/viewer.cpp @@ -603,7 +603,7 @@ void ViewerWidget::PushScrubbedAudio() const AudioParams& params = GetConnectedNode()->audio_playback_cache()->GetParameters(); if (params.is_valid()) { - AudioPlaybackCache::PlaybackDevice* audio_src = GetConnectedNode()->audio_playback_cache()->CreatePlaybackDevice(); + PreviewAutoCacher::PlaybackDevice *audio_src = new PreviewAutoCacher::PlaybackDevice(&auto_cacher_, this); if (audio_src->open(QIODevice::ReadOnly)) { // FIXME: Hardcoded scrubbing interval (20ms)