diff --git a/app/render/audioplaybackcache.cpp b/app/render/audioplaybackcache.cpp index 93b3c592a..995658d26 100644 --- a/app/render/audioplaybackcache.cpp +++ b/app/render/audioplaybackcache.cpp @@ -58,7 +58,7 @@ void AudioPlaybackCache::SetParameters(const AudioParams ¶ms) emit ParametersChanged(); } -void AudioPlaybackCache::WritePCM(const TimeRange &range, const TimeRangeList &valid_ranges, SampleBufferPtr samples, const AudioVisualWaveform *waveform) +void AudioPlaybackCache::WritePCM(const TimeRange &range, const TimeRangeList &valid_ranges, SampleBufferPtr samples) { // Ensure if we have enough segments to write this data, creating more if not qint64 length_diff = params_.time_to_bytes_per_channel(range.out()) - playlist_.GetLength(); @@ -143,13 +143,6 @@ void AudioPlaybackCache::WritePCM(const TimeRange &range, const TimeRangeList &v // Each segment is contiguous, so this out will be the next segment's in this_segment_in = this_segment_out; } - - // Write visual - if (waveform) { - visual_.OverwriteSums(*waveform, r.in(), r.in() - range.in(), r.length()); - } else { - visual_.OverwriteSilence(r.in(), r.length()); - } } foreach (const TimeRange& v, ranges_we_validated) { @@ -157,11 +150,24 @@ void AudioPlaybackCache::WritePCM(const TimeRange &range, const TimeRangeList &v } } +void AudioPlaybackCache::WriteWaveform(const TimeRange &range, const TimeRangeList &valid_ranges, const AudioVisualWaveform *waveform) +{ + // Write each valid range to the segments + foreach (const TimeRange& r, valid_ranges) { + // Write visual + if (waveform) { + visual_.OverwriteSums(*waveform, r.in(), r.in() - range.in(), r.length()); + } else { + visual_.OverwriteSilence(r.in(), r.length()); + } + } +} + void AudioPlaybackCache::WriteSilence(const TimeRange &range) { // WritePCM will automatically fill non-existent bytes with silence, so we just have to send // it an empty sample buffer - WritePCM(range, {range}, nullptr, nullptr); + WritePCM(range, {range}, nullptr); } void AudioPlaybackCache::ShiftEvent(const rational &from_in_time, const rational &to_in_time) diff --git a/app/render/audioplaybackcache.h b/app/render/audioplaybackcache.h index ee697808d..8394975a9 100644 --- a/app/render/audioplaybackcache.h +++ b/app/render/audioplaybackcache.h @@ -66,7 +66,9 @@ public: void SetParameters(const AudioParams& params); - void WritePCM(const TimeRange &range, const TimeRangeList &valid_ranges, SampleBufferPtr samples, const AudioVisualWaveform *waveform); + void WritePCM(const TimeRange &range, const TimeRangeList &valid_ranges, SampleBufferPtr samples); + + void WriteWaveform(const TimeRange &range, const TimeRangeList &valid_ranges, const AudioVisualWaveform *waveform); void WriteSilence(const TimeRange &range); diff --git a/app/render/previewautocacher.cpp b/app/render/previewautocacher.cpp index d8ee8a129..daf18aac7 100644 --- a/app/render/previewautocacher.cpp +++ b/app/render/previewautocacher.cpp @@ -32,6 +32,10 @@ namespace olive { +// We may want to make this configurable at some point, so for now this constant is used as a +// placeholder for where that configarable variable would be used. +const bool PreviewAutoCacher::kRealTimeWaveformsEnabled = true; + PreviewAutoCacher::PreviewAutoCacher() : viewer_node_(nullptr), use_custom_range_(false), @@ -141,7 +145,9 @@ void PreviewAutoCacher::AudioInvalidated(const TimeRange &range) // cancelled, so some areas may end up unrendered forever // ClearAudioQueue(); - if (viewer_node_->GetAudioAutoCacheEnabled()) { + // If we're auto-caching audio or require realtime waveforms, we'll have to render this + if (viewer_node_->GetAudioAutoCacheEnabled() || kRealTimeWaveformsEnabled) { + // We still render for the sake of waveforms audio_job_tracker_.insert(range, graph_changed_time_); // Start jobs to re-render the audio at this range, split into 2 second chunks @@ -203,11 +209,14 @@ void PreviewAutoCacher::AudioRendered() AudioVisualWaveform waveform = watcher->GetTicket()->property("waveform").value(); - // WritePCM is tolerant to its buffer being null, it will just write silence instead - viewer_node_->audio_playback_cache()->WritePCM(range, - valid_ranges, - watcher->Get().value(), - &waveform); + if (viewer_node_->GetAudioAutoCacheEnabled()) { + // WritePCM is tolerant to its buffer being null, it will just write silence instead + viewer_node_->audio_playback_cache()->WritePCM(range, + valid_ranges, + watcher->Get().value()); + } + + viewer_node_->audio_playback_cache()->WriteWaveform(range, valid_ranges, &waveform); // Detect if this audio was incomplete because it was waiting on a conform to finish if (watcher->GetTicket()->property("incomplete").toBool()) { diff --git a/app/render/previewautocacher.h b/app/render/previewautocacher.h index a4d15cf82..150a45e48 100644 --- a/app/render/previewautocacher.h +++ b/app/render/previewautocacher.h @@ -192,6 +192,8 @@ private: TimeRangeListFrameIterator hash_iterator_; TimeRangeList audio_iterator_; + static const bool kRealTimeWaveformsEnabled; + private slots: /** * @brief Handler for when the NodeGraph reports a video change over a certain time range