diff --git a/app/widget/viewer/viewer.cpp b/app/widget/viewer/viewer.cpp index 398c43cfb..702a475bb 100644 --- a/app/widget/viewer/viewer.cpp +++ b/app/widget/viewer/viewer.cpp @@ -110,6 +110,11 @@ ViewerWidget::ViewerWidget(QWidget *parent) : connect(controls_, &PlaybackControls::TimeChanged, this, &ViewerWidget::SetTimeAndSignal); layout->addWidget(controls_); + // If audio is invalidated during playback, we wait some time before starting it again + audio_restart_timer_.setInterval(250); + audio_restart_timer_.setSingleShot(true); + connect(&audio_restart_timer_, &QTimer::timeout, this, &ViewerWidget::StartAudioOutput); + // FIXME: Magic number SetScale(48.0); @@ -186,6 +191,8 @@ void ViewerWidget::ConnectNodeEvent(ViewerOutput *n) connect(n, &ViewerOutput::AudioParamsChanged, this, &ViewerWidget::UpdateRendererAudioParameters); connect(n->video_frame_cache(), &FrameHashCache::Invalidated, this, &ViewerWidget::ViewerInvalidatedVideoRange); connect(n->video_frame_cache(), &FrameHashCache::Shifted, this, &ViewerWidget::ViewerShiftedRange); + connect(n->audio_playback_cache(), &AudioPlaybackCache::Invalidated, this, &ViewerWidget::AudioCacheInvalidated); + connect(n->audio_playback_cache(), &AudioPlaybackCache::Validated, this, &ViewerWidget::AudioCacheValidated); connect(n, &ViewerOutput::TextureInputChanged, this, &ViewerWidget::UpdateStack); VideoParams vp = n->GetVideoParams(); @@ -230,6 +237,8 @@ void ViewerWidget::DisconnectNodeEvent(ViewerOutput *n) disconnect(n, &ViewerOutput::AudioParamsChanged, this, &ViewerWidget::UpdateRendererAudioParameters); disconnect(n->video_frame_cache(), &FrameHashCache::Invalidated, this, &ViewerWidget::ViewerInvalidatedVideoRange); disconnect(n->video_frame_cache(), &FrameHashCache::Shifted, this, &ViewerWidget::ViewerShiftedRange); + disconnect(n->audio_playback_cache(), &AudioPlaybackCache::Invalidated, this, &ViewerWidget::AudioCacheInvalidated); + disconnect(n->audio_playback_cache(), &AudioPlaybackCache::Validated, this, &ViewerWidget::AudioCacheValidated); disconnect(n, &ViewerOutput::TextureInputChanged, this, &ViewerWidget::UpdateStack); ruler()->SetPlaybackCache(nullptr); @@ -395,6 +404,17 @@ bool ViewerWidget::ShouldForceWaveform() const && GetConnectedNode()->GetConnectedSampleOutput().IsValid(); } +void ViewerWidget::StartAudioOutput() +{ + AudioPlaybackCache* audio_cache = GetConnectedNode()->audio_playback_cache(); + if (audio_cache->GetParameters().is_valid()) { + AudioManager::instance()->SetOutputParams(audio_cache->GetParameters()); + AudioManager::instance()->StartOutput(audio_cache, + audio_cache->GetParameters().time_to_bytes(GetTime()), + playback_speed_); + } +} + void ViewerWidget::UpdateTextureFromNode(const rational& time) { bool frame_exists_at_time = FrameExistsAtTime(time); @@ -650,13 +670,7 @@ void ViewerWidget::FinishPlayPreprocess() { int64_t playback_start_time = ruler()->GetTime(); - AudioPlaybackCache* audio_cache = GetConnectedNode()->audio_playback_cache(); - if (audio_cache->GetParameters().is_valid()) { - AudioManager::instance()->SetOutputParams(audio_cache->GetParameters()); - AudioManager::instance()->StartOutput(audio_cache, - audio_cache->GetParameters().time_to_bytes(GetTime()), - playback_speed_); - } + StartAudioOutput(); playback_timer_.Start(playback_start_time, playback_speed_, timebase_dbl()); display_widget_->ResetFPSTimer(); @@ -1263,4 +1277,21 @@ void ViewerWidget::Dropped(QDropEvent *event) } } +void ViewerWidget::AudioCacheInvalidated() +{ + if (IsPlaying()) { + AudioManager::instance()->StopOutput(); + } +} + +void ViewerWidget::AudioCacheValidated() +{ + if (IsPlaying()) { + // This timer will restart audio + AudioManager::instance()->StopOutput(); + audio_restart_timer_.stop(); + audio_restart_timer_.start(); + } +} + } diff --git a/app/widget/viewer/viewer.h b/app/widget/viewer/viewer.h index c3f35f505..2213acd79 100644 --- a/app/widget/viewer/viewer.h +++ b/app/widget/viewer/viewer.h @@ -245,6 +245,8 @@ private: PreviewAutoCacher auto_cacher_; + QTimer audio_restart_timer_; + static QVector instances_; private slots: @@ -292,6 +294,11 @@ private slots: void Dropped(QDropEvent* event); + void AudioCacheInvalidated(); + void AudioCacheValidated(); + + void StartAudioOutput(); + }; }