From 2f6a851e688d7c004d268d8884244c9250ee1b97 Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Tue, 22 Jun 2021 18:25:51 +0900 Subject: [PATCH] video: prevent speed control when audio is not ready --- lib/model/settings/settings.dart | 1 + lib/widgets/viewer/overlay/bottom/video.dart | 42 ++++++++++---------- lib/widgets/viewer/video/controller.dart | 4 +- lib/widgets/viewer/video/fijkplayer.dart | 12 +++++- 4 files changed, 36 insertions(+), 23 deletions(-) diff --git a/lib/model/settings/settings.dart b/lib/model/settings/settings.dart index 3d70dec3f..560c35a86 100644 --- a/lib/model/settings/settings.dart +++ b/lib/model/settings/settings.dart @@ -79,6 +79,7 @@ class Settings extends ChangeNotifier { EntryAction.share, ]; static const videoQuickActionsDefault = [ + VideoAction.replay10, VideoAction.togglePlay, ]; diff --git a/lib/widgets/viewer/overlay/bottom/video.dart b/lib/widgets/viewer/overlay/bottom/video.dart index d003e90ce..e595e9928 100644 --- a/lib/widgets/viewer/overlay/bottom/video.dart +++ b/lib/widgets/viewer/overlay/bottom/video.dart @@ -242,32 +242,32 @@ class _ButtonRow extends StatelessWidget { ValueListenableBuilder _buildFromListenable(ValueListenable? enabledNotifier) { return ValueListenableBuilder( valueListenable: enabledNotifier ?? ValueNotifier(false), - builder: (context, canDo, child) { - return IconButton( - icon: child!, - onPressed: canDo ? onPressed : null, - tooltip: action.getText(context), - ); - }, + builder: (context, canDo, child) => IconButton( + icon: child!, + onPressed: canDo ? onPressed : null, + tooltip: action.getText(context), + ), child: Icon(action.getIcon()), ); } switch (action) { + case VideoAction.captureFrame: + child = _buildFromListenable(controller?.canCaptureFrameNotifier); + break; + case VideoAction.selectStreams: + child = _buildFromListenable(controller?.canSelectStreamNotifier); + break; + case VideoAction.setSpeed: + child = _buildFromListenable(controller?.canSetSpeedNotifier); + break; case VideoAction.togglePlay: child = _PlayToggler( controller: controller, onPressed: onPressed, ); break; - case VideoAction.captureFrame: - child = _buildFromListenable(controller?.renderingVideoNotifier); - break; - case VideoAction.selectStreams: - child = _buildFromListenable(controller?.canSelectStreamNotifier); - break; case VideoAction.replay10: - case VideoAction.setSpeed: child = IconButton( icon: Icon(action.getIcon()), onPressed: onPressed, @@ -287,17 +287,19 @@ class _ButtonRow extends StatelessWidget { PopupMenuEntry _buildPopupMenuItem(BuildContext context, VideoAction action) { late final enabled; switch (action) { - case VideoAction.togglePlay: - case VideoAction.replay10: - case VideoAction.setSpeed: - enabled = true; - break; case VideoAction.captureFrame: - enabled = controller?.renderingVideoNotifier.value ?? false; + enabled = controller?.canCaptureFrameNotifier.value ?? false; break; case VideoAction.selectStreams: enabled = controller?.canSelectStreamNotifier.value ?? false; break; + case VideoAction.setSpeed: + enabled = controller?.canSetSpeedNotifier.value ?? false; + break; + case VideoAction.replay10: + case VideoAction.togglePlay: + enabled = true; + break; } Widget? child; diff --git a/lib/widgets/viewer/video/controller.dart b/lib/widgets/viewer/video/controller.dart index fc79bef15..9eb7fb01d 100644 --- a/lib/widgets/viewer/video/controller.dart +++ b/lib/widgets/viewer/video/controller.dart @@ -41,7 +41,9 @@ abstract class AvesVideoController { Stream get timedTextStream; - ValueNotifier get renderingVideoNotifier; + ValueNotifier get canCaptureFrameNotifier; + + ValueNotifier get canSetSpeedNotifier; ValueNotifier get canSelectStreamNotifier; diff --git a/lib/widgets/viewer/video/fijkplayer.dart b/lib/widgets/viewer/video/fijkplayer.dart index a281ccfab..b6d592d33 100644 --- a/lib/widgets/viewer/video/fijkplayer.dart +++ b/lib/widgets/viewer/video/fijkplayer.dart @@ -36,7 +36,10 @@ class IjkPlayerAvesVideoController extends AvesVideoController { final double maxSpeed = 2; @override - final ValueNotifier renderingVideoNotifier = ValueNotifier(false); + final ValueNotifier canCaptureFrameNotifier = ValueNotifier(false); + + @override + final ValueNotifier canSetSpeedNotifier = ValueNotifier(false); @override final ValueNotifier canSelectStreamNotifier = ValueNotifier(false); @@ -56,9 +59,14 @@ class IjkPlayerAvesVideoController extends AvesVideoController { } _instance = FijkPlayer(); _valueStream.firstWhere((value) => value.videoRenderStart).then( - (value) => renderingVideoNotifier.value = true, + (value) => canCaptureFrameNotifier.value = true, onError: (error) {}, ); + _valueStream.firstWhere((value) => value.audioRenderStart).then( + (value) => canSetSpeedNotifier.value = true, + onError: (error) {}, + ); + _startListening(); }