waveforms: moved waveform to track rather than block
This is a much more robust and thread-safe system of storing the waveforms.
This commit is contained in:
@@ -94,11 +94,6 @@ void RenderBackend::SetViewerNode(ViewerOutput *viewer_node)
|
||||
}
|
||||
}
|
||||
|
||||
void RenderBackend::SetUpdateWithGraph(bool e)
|
||||
{
|
||||
update_with_graph_ = e;
|
||||
}
|
||||
|
||||
void RenderBackend::ClearVideoQueue()
|
||||
{
|
||||
foreach (RenderTicketPtr t, render_queue_) {
|
||||
@@ -275,6 +270,7 @@ void RenderBackend::RunNextJob()
|
||||
RenderWorker* worker = CreateNewWorker();
|
||||
|
||||
connect(worker, &RenderWorker::FinishedJob, this, &RenderBackend::WorkerFinished);
|
||||
connect(worker, &RenderWorker::WaveformGenerated, this, &RenderBackend::WorkerGeneratedWaveform);
|
||||
|
||||
workers_.replace(i, {worker, false});
|
||||
}
|
||||
@@ -292,6 +288,7 @@ void RenderBackend::RunNextJob()
|
||||
worker->SetVideoParams(video_params_);
|
||||
worker->SetAudioParams(audio_params_);
|
||||
worker->SetVideoDownloadMatrix(video_download_matrix_);
|
||||
worker->SetGeneratePreviews(generate_previews_);
|
||||
worker->SetCopyMap(©_map_);
|
||||
|
||||
RenderTicketPtr ticket = render_queue_.front();
|
||||
@@ -354,6 +351,34 @@ void RenderBackend::WorkerFinished()
|
||||
}
|
||||
}
|
||||
|
||||
void RenderBackend::WorkerGeneratedWaveform(const TrackOutput *copied_track, const AudioVisualWaveform& samples, const rational &r)
|
||||
{
|
||||
TrackOutput* track = nullptr;
|
||||
|
||||
/*
|
||||
if (!viewer_node_->audio_playback_cache()->JobIsCurrent(r)) {
|
||||
return;
|
||||
}
|
||||
*/
|
||||
|
||||
QHash<Node*, Node*>::const_iterator i;
|
||||
for (i=copy_map_.constBegin(); i!=copy_map_.constEnd(); i++) {
|
||||
if (i.value() == copied_track) {
|
||||
track = static_cast<TrackOutput*>(i.key());
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (track) {
|
||||
track->waveform().set_channel_count(audio_params_.channel_count());
|
||||
track->waveform().OverwriteSums(samples, r);
|
||||
qDebug() << "Preview changed";
|
||||
emit track->PreviewChanged();
|
||||
} else {
|
||||
qDebug() << "Failed to find track";
|
||||
}
|
||||
}
|
||||
|
||||
void RenderBackend::CopyNodeInputValue(NodeInput *input)
|
||||
{
|
||||
// Find our copy of this parameter
|
||||
|
||||
@@ -45,7 +45,15 @@ public:
|
||||
|
||||
void SetViewerNode(ViewerOutput* viewer_node);
|
||||
|
||||
void SetUpdateWithGraph(bool e);
|
||||
void SetUpdateWithGraph(bool e)
|
||||
{
|
||||
update_with_graph_ = e;
|
||||
}
|
||||
|
||||
void SetGeneratePreviews(bool e)
|
||||
{
|
||||
generate_previews_ = e;
|
||||
}
|
||||
|
||||
void ClearVideoQueue();
|
||||
|
||||
@@ -113,9 +121,13 @@ private:
|
||||
|
||||
bool update_with_graph_;
|
||||
|
||||
bool generate_previews_;
|
||||
|
||||
private slots:
|
||||
void WorkerFinished();
|
||||
|
||||
void WorkerGeneratedWaveform(const OLIVE_NAMESPACE::TrackOutput* copied_track, const OLIVE_NAMESPACE::AudioVisualWaveform& samples, const OLIVE_NAMESPACE::rational& start);
|
||||
|
||||
};
|
||||
|
||||
OLIVE_NAMESPACE_EXIT
|
||||
|
||||
@@ -34,7 +34,8 @@ OLIVE_NAMESPACE_ENTER
|
||||
RenderWorker::RenderWorker(RenderBackend* parent) :
|
||||
parent_(parent),
|
||||
available_(true),
|
||||
audio_mode_is_preview_(false)
|
||||
audio_mode_is_preview_(false),
|
||||
generate_previews_(false)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -123,24 +124,17 @@ NodeValueTable RenderWorker::GenerateBlockTable(const TrackOutput *track, const
|
||||
// Copy samples into destination buffer
|
||||
block_range_buffer->set(samples_from_this_block->const_data(), destination_offset, copy_length);
|
||||
|
||||
if (b->type() == Block::kClip) {
|
||||
// Save waveform to file
|
||||
ClipBlock* src_block = static_cast<ClipBlock*>(copy_map_->key(b));
|
||||
|
||||
AudioVisualWaveform& clip_waveform = src_block->waveform();
|
||||
|
||||
clip_waveform.set_channel_count(audio_params_.channel_count());
|
||||
|
||||
clip_waveform.OverwriteSamples(samples_from_this_block,
|
||||
audio_params_.sample_rate(),
|
||||
range_for_block.in() - b->in());
|
||||
|
||||
emit static_cast<ClipBlock*>(src_block)->PreviewUpdated();
|
||||
}
|
||||
|
||||
NodeValueTable::Merge({merged_table, table});
|
||||
}
|
||||
|
||||
if (generate_previews_) {
|
||||
// Generate visual waveform in this background thread
|
||||
AudioVisualWaveform visual_waveform;
|
||||
visual_waveform.set_channel_count(audio_params_.channel_count());
|
||||
visual_waveform.AddSamples(block_range_buffer, audio_params_.sample_rate());
|
||||
emit WaveformGenerated(track, visual_waveform, range.in());
|
||||
}
|
||||
|
||||
merged_table.Push(NodeParam::kSamples, QVariant::fromValue(block_range_buffer));
|
||||
|
||||
return merged_table;
|
||||
|
||||
@@ -73,6 +73,11 @@ public:
|
||||
copy_map_ = copy_map;
|
||||
}
|
||||
|
||||
void SetGeneratePreviews(bool e)
|
||||
{
|
||||
generate_previews_ = e;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Return a unique ID for the image generated at this time
|
||||
*
|
||||
@@ -127,6 +132,8 @@ signals:
|
||||
|
||||
void FinishedJob();
|
||||
|
||||
void WaveformGenerated(const OLIVE_NAMESPACE::TrackOutput* track, const OLIVE_NAMESPACE::AudioVisualWaveform& samples, const OLIVE_NAMESPACE::rational& start);
|
||||
|
||||
private:
|
||||
NodeValue GetDataFromStream(StreamPtr stream, const TimeRange& input_time);
|
||||
|
||||
@@ -157,6 +164,8 @@ private:
|
||||
|
||||
bool audio_mode_is_preview_;
|
||||
|
||||
bool generate_previews_;
|
||||
|
||||
QHash<Node*, Node*>* copy_map_;
|
||||
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user