video: prevent speed control when audio is not ready

This commit is contained in:
Thibault Deckers 2021-06-22 18:25:51 +09:00
parent e40770b1c4
commit 2f6a851e68
4 changed files with 36 additions and 23 deletions

View file

@ -79,6 +79,7 @@ class Settings extends ChangeNotifier {
EntryAction.share,
];
static const videoQuickActionsDefault = [
VideoAction.replay10,
VideoAction.togglePlay,
];

View file

@ -242,32 +242,32 @@ class _ButtonRow extends StatelessWidget {
ValueListenableBuilder<bool> _buildFromListenable(ValueListenable<bool>? enabledNotifier) {
return ValueListenableBuilder<bool>(
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<VideoAction> _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;

View file

@ -41,7 +41,9 @@ abstract class AvesVideoController {
Stream<String?> get timedTextStream;
ValueNotifier<bool> get renderingVideoNotifier;
ValueNotifier<bool> get canCaptureFrameNotifier;
ValueNotifier<bool> get canSetSpeedNotifier;
ValueNotifier<bool> get canSelectStreamNotifier;

View file

@ -36,7 +36,10 @@ class IjkPlayerAvesVideoController extends AvesVideoController {
final double maxSpeed = 2;
@override
final ValueNotifier<bool> renderingVideoNotifier = ValueNotifier(false);
final ValueNotifier<bool> canCaptureFrameNotifier = ValueNotifier(false);
@override
final ValueNotifier<bool> canSetSpeedNotifier = ValueNotifier(false);
@override
final ValueNotifier<bool> 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();
}