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:
itsmattkc
2020-06-05 15:18:14 +10:00
parent ddf63b39e1
commit de3288893d
7 changed files with 59 additions and 51 deletions
+5 -34
View File
@@ -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(&copy_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