renderer: move waveform generation into worker and mutex the waveform
Addresses scheduling issues where a backend might be closed (or even destroyed) before it processes a waveform signal from a worker. Requires extra multithreading code.
This commit is contained in:
@@ -34,7 +34,8 @@ OLIVE_NAMESPACE_ENTER
|
||||
RenderBackend::RenderBackend(QObject *parent) :
|
||||
QObject(parent),
|
||||
viewer_node_(nullptr),
|
||||
update_with_graph_(false)
|
||||
update_with_graph_(false),
|
||||
preview_job_time_(0)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -270,7 +271,6 @@ 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});
|
||||
}
|
||||
@@ -288,7 +288,9 @@ void RenderBackend::RunNextJob()
|
||||
worker->SetVideoParams(video_params_);
|
||||
worker->SetAudioParams(audio_params_);
|
||||
worker->SetVideoDownloadMatrix(video_download_matrix_);
|
||||
worker->SetGeneratePreviews(generate_previews_);
|
||||
if (preview_job_time_) {
|
||||
worker->EnablePreviewGeneration(viewer_node_->audio_playback_cache(), preview_job_time_);
|
||||
}
|
||||
worker->SetCopyMap(©_map_);
|
||||
|
||||
RenderTicketPtr ticket = render_queue_.front();
|
||||
@@ -351,37 +353,6 @@ void RenderBackend::WorkerFinished()
|
||||
}
|
||||
}
|
||||
|
||||
void RenderBackend::WorkerGeneratedWaveform(const TrackOutput *copied_track, const AudioVisualWaveform& samples, const rational &r)
|
||||
{
|
||||
if (!viewer_node_) {
|
||||
return;
|
||||
}
|
||||
|
||||
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);
|
||||
emit track->PreviewChanged();
|
||||
} else {
|
||||
qDebug() << "Failed to find track";
|
||||
}
|
||||
}
|
||||
|
||||
void RenderBackend::CopyNodeInputValue(NodeInput *input)
|
||||
{
|
||||
// Find our copy of this parameter
|
||||
|
||||
Reference in New Issue
Block a user