From 2dc27de37c1e185719a34961b499fa950ba8487d Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Thu, 8 Apr 2021 10:44:32 +1000 Subject: [PATCH] ensure frame rate and sample rate changes ripple through widgets --- app/node/output/viewer/viewer.cpp | 10 ++++++ app/node/output/viewer/viewer.h | 4 +++ app/widget/timebased/timebasedwidget.cpp | 37 +++++++++++++------- app/widget/timebased/timebasedwidget.h | 2 ++ app/widget/timelinewidget/timelinewidget.cpp | 14 ++++++++ app/widget/timelinewidget/timelinewidget.h | 4 +++ 6 files changed, 58 insertions(+), 13 deletions(-) diff --git a/app/node/output/viewer/viewer.cpp b/app/node/output/viewer/viewer.cpp index 9a6334bc9..8f0327280 100644 --- a/app/node/output/viewer/viewer.cpp +++ b/app/node/output/viewer/viewer.cpp @@ -431,10 +431,20 @@ void ViewerOutput::InputValueChangedEvent(const QString &input, int element) } else if (input == kAudioParamsInput) { + AudioParams new_audio_params = GetAudioParams(); + + bool sample_rate_changed = new_audio_params.sample_rate() != cached_audio_params_.sample_rate(); + + if (sample_rate_changed) { + emit SampleRateChanged(new_audio_params.sample_rate()); + } + emit AudioParamsChanged(); audio_playback_cache_.SetParameters(GetAudioParams()); + cached_audio_params_ = new_audio_params; + } } diff --git a/app/node/output/viewer/viewer.h b/app/node/output/viewer/viewer.h index 66f004bdc..a20419edf 100644 --- a/app/node/output/viewer/viewer.h +++ b/app/node/output/viewer/viewer.h @@ -167,6 +167,8 @@ signals: void TextureInputChanged(); + void SampleRateChanged(int sr); + public slots: void VerifyLength(); @@ -200,6 +202,8 @@ private: VideoParams cached_video_params_; + AudioParams cached_audio_params_; + TimelinePoints timeline_points_; private slots: diff --git a/app/widget/timebased/timebasedwidget.cpp b/app/widget/timebased/timebasedwidget.cpp index 516a1008f..ff0fb7408 100644 --- a/app/widget/timebased/timebasedwidget.cpp +++ b/app/widget/timebased/timebasedwidget.cpp @@ -86,6 +86,10 @@ void TimeBasedWidget::ConnectViewerNode(ViewerOutput *node) // Disconnect length changed signal disconnect(viewer_node_, &ViewerOutput::LengthChanged, this, &TimeBasedWidget::UpdateMaximumScroll); + // Disconnect rate change signals if they were connected + disconnect(viewer_node_, &ViewerOutput::FrameRateChanged, this, &TimeBasedWidget::AutoUpdateTimebase); + disconnect(viewer_node_, &ViewerOutput::SampleRateChanged, this, &TimeBasedWidget::AutoUpdateTimebase); + // Reset timebase to null SetTimebase(rational()); @@ -112,19 +116,9 @@ void TimeBasedWidget::ConnectViewerNode(ViewerOutput *node) // If we're setting the timebase, set it automatically based on the video and audio parameters if (auto_set_timebase_) { - rational video_tb = viewer_node_->GetVideoParams().frame_rate_as_time_base(); - - if (!video_tb.isNull()) { - SetTimebase(video_tb); - } else { - rational audio_tb = viewer_node_->GetAudioParams().sample_rate_as_time_base(); - - if (!audio_tb.isNull()) { - SetTimebase(audio_tb); - } else { - SetTimebase(rational()); - } - } + AutoUpdateTimebase(); + connect(viewer_node_, &ViewerOutput::FrameRateChanged, this, &TimeBasedWidget::AutoUpdateTimebase); + connect(viewer_node_, &ViewerOutput::SampleRateChanged, this, &TimeBasedWidget::AutoUpdateTimebase); } // Call derivatives @@ -205,6 +199,23 @@ void TimeBasedWidget::CatchUpScrollToPoint(int point) PageScrollInternal(point, false); } +void TimeBasedWidget::AutoUpdateTimebase() +{ + rational video_tb = viewer_node_->GetVideoParams().frame_rate_as_time_base(); + + if (!video_tb.isNull()) { + SetTimebase(video_tb); + } else { + rational audio_tb = viewer_node_->GetAudioParams().sample_rate_as_time_base(); + + if (!audio_tb.isNull()) { + SetTimebase(audio_tb); + } else { + SetTimebase(rational()); + } + } +} + TimeRuler *TimeBasedWidget::ruler() const { return ruler_; diff --git a/app/widget/timebased/timebasedwidget.h b/app/widget/timebased/timebasedwidget.h index c327c24be..562b36a47 100644 --- a/app/widget/timebased/timebasedwidget.h +++ b/app/widget/timebased/timebasedwidget.h @@ -228,6 +228,8 @@ private slots: void CatchUpScrollToPoint(int point); + void AutoUpdateTimebase(); + }; } diff --git a/app/widget/timelinewidget/timelinewidget.cpp b/app/widget/timelinewidget/timelinewidget.cpp index 22058a231..6a3292249 100644 --- a/app/widget/timelinewidget/timelinewidget.cpp +++ b/app/widget/timelinewidget/timelinewidget.cpp @@ -224,6 +224,8 @@ void TimelineWidget::ConnectNodeEvent(ViewerOutput *n) connect(s, &Sequence::TrackAdded, this, &TimelineWidget::AddTrack); connect(s, &Sequence::TrackRemoved, this, &TimelineWidget::RemoveTrack); + connect(s, &Sequence::FrameRateChanged, this, &TimelineWidget::FrameRateChanged); + connect(s, &Sequence::SampleRateChanged, this, &TimelineWidget::SampleRateChanged); ruler()->SetPlaybackCache(n->video_frame_cache()); @@ -252,6 +254,8 @@ void TimelineWidget::DisconnectNodeEvent(ViewerOutput *n) disconnect(s, &Sequence::TrackAdded, this, &TimelineWidget::AddTrack); disconnect(s, &Sequence::TrackRemoved, this, &TimelineWidget::RemoveTrack); + disconnect(s, &Sequence::FrameRateChanged, this, &TimelineWidget::FrameRateChanged); + disconnect(s, &Sequence::SampleRateChanged, this, &TimelineWidget::SampleRateChanged); DeselectAll(); @@ -1035,6 +1039,16 @@ void TimelineWidget::SetViewWaveformsEnabled(bool e) } } +void TimelineWidget::FrameRateChanged() +{ + SetTimebase(GetConnectedNode()->GetVideoParams().frame_rate_as_time_base()); +} + +void TimelineWidget::SampleRateChanged() +{ + UpdateViewTimebases(); +} + void TimelineWidget::AddGhost(TimelineViewGhostItem *ghost) { ghost_items_.append(ghost); diff --git a/app/widget/timelinewidget/timelinewidget.h b/app/widget/timelinewidget/timelinewidget.h index d6d7b0b66..ebf5aacf4 100644 --- a/app/widget/timelinewidget/timelinewidget.h +++ b/app/widget/timelinewidget/timelinewidget.h @@ -347,6 +347,10 @@ private slots: void SetViewWaveformsEnabled(bool e); + void FrameRateChanged(); + + void SampleRateChanged(); + }; }