From 769fa43e90e281c6a09690211dcc46a16c7da830 Mon Sep 17 00:00:00 2001 From: Sagar Patel Date: Tue, 7 Nov 2023 19:10:33 +0530 Subject: [PATCH 1/6] setMaxVolume and startAt when changing media --- .../fluttervlcplayer/FlutterVlcPlayer.java | 2 +- .../lib/src/vlc_player_controller.dart | 38 ++++++++++++++++++- 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/flutter_vlc_player/android/src/main/java/software/solid/fluttervlcplayer/FlutterVlcPlayer.java b/flutter_vlc_player/android/src/main/java/software/solid/fluttervlcplayer/FlutterVlcPlayer.java index cb658754..c58faf6a 100644 --- a/flutter_vlc_player/android/src/main/java/software/solid/fluttervlcplayer/FlutterVlcPlayer.java +++ b/flutter_vlc_player/android/src/main/java/software/solid/fluttervlcplayer/FlutterVlcPlayer.java @@ -322,7 +322,7 @@ void setLooping(boolean value) { void setVolume(long value) { if (mediaPlayer == null) return; - long bracketedValue = Math.max(0, Math.min(100, value)); + long bracketedValue = Math.max(0, Math.min(200, value)); mediaPlayer.setVolume((int) bracketedValue); } diff --git a/flutter_vlc_player/lib/src/vlc_player_controller.dart b/flutter_vlc_player/lib/src/vlc_player_controller.dart index a473bbe9..e0c68be4 100644 --- a/flutter_vlc_player/lib/src/vlc_player_controller.dart +++ b/flutter_vlc_player/lib/src/vlc_player_controller.dart @@ -20,7 +20,7 @@ import 'package:flutter_vlc_player_platform_interface/flutter_vlc_player_platfor /// /// After [dispose] all further calls are ignored. class VlcPlayerController extends ValueNotifier { - static const _maxVolume = 100; + int _maxVolume = 100; /// The URI to the video file. This will be in different formats depending on /// the [DataSourceType] of the original video. @@ -394,6 +394,7 @@ class VlcPlayerController extends ValueNotifier { String? package, bool? autoPlay, HwAcc? hwAcc, + Duration? startAt, }) async { _dataSourceType = DataSourceType.asset; this.package = package; @@ -403,6 +404,7 @@ class VlcPlayerController extends ValueNotifier { package: package, autoPlay: autoPlay, hwAcc: hwAcc, + startAt: startAt, ); } @@ -414,6 +416,7 @@ class VlcPlayerController extends ValueNotifier { String dataSource, { bool? autoPlay, HwAcc? hwAcc, + Duration? startAt, }) async { _dataSourceType = DataSourceType.network; package = null; @@ -422,6 +425,7 @@ class VlcPlayerController extends ValueNotifier { dataSourceType: DataSourceType.network, autoPlay: autoPlay, hwAcc: hwAcc, + startAt: startAt, ); } @@ -433,6 +437,7 @@ class VlcPlayerController extends ValueNotifier { File file, { bool? autoPlay, HwAcc? hwAcc, + Duration? startAt, }) async { _dataSourceType = DataSourceType.file; package = null; @@ -442,6 +447,7 @@ class VlcPlayerController extends ValueNotifier { dataSourceType: DataSourceType.file, autoPlay: autoPlay, hwAcc: hwAcc, + startAt: startAt, ); } @@ -456,6 +462,7 @@ class VlcPlayerController extends ValueNotifier { String? package, bool? autoPlay, HwAcc? hwAcc, + Duration? startAt, }) async { _throwIfNotInitialized('setStreamUrl'); await vlcPlayerPlatform.stop(_viewId); @@ -468,6 +475,10 @@ class VlcPlayerController extends ValueNotifier { autoPlay: autoPlay ?? true, ); + if (startAt != null) { + await vlcPlayerPlatform.seekTo(_viewId, startAt); + } + return; } @@ -557,9 +568,32 @@ class VlcPlayerController extends ValueNotifier { return position; } + /// Sets the max audio volume of + /// + /// [maxVolume] indicates a value between 1 (lowest) and 200 (highest) on a + /// linear scale. + Future setMaxVolume(int maxVolume) async { + _throwIfNotInitialized('setMaxVolume'); + const volumeLimit = 200; + if (maxVolume > volumeLimit) { + throw ArgumentError.value( + maxVolume, + 'Max volume should be lower than 200.', + ); + } else if (maxVolume <= 0) { + throw ArgumentError.value( + maxVolume, + 'Max volume should not be 0 or negative.', + ); + } + _maxVolume = maxVolume; + + return; + } + /// Sets the audio volume of /// - /// [volume] indicates a value between 0 (silent) and 100 (full volume) on a + /// [volume] indicates a value between 0 (silent), 100 (full volume) and 200 (maximum) on a /// linear scale. Future setVolume(int volume) async { _throwIfNotInitialized('setVolume'); From de94ba2e59d9d872168a67505616c695d4231648 Mon Sep 17 00:00:00 2001 From: Sagar Patel Date: Tue, 7 Nov 2023 19:49:04 +0530 Subject: [PATCH 2/6] get max volume --- .../lib/src/vlc_player_controller.dart | 33 ++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/flutter_vlc_player/lib/src/vlc_player_controller.dart b/flutter_vlc_player/lib/src/vlc_player_controller.dart index e0c68be4..8faa9dd5 100644 --- a/flutter_vlc_player/lib/src/vlc_player_controller.dart +++ b/flutter_vlc_player/lib/src/vlc_player_controller.dart @@ -1,4 +1,5 @@ import 'dart:async'; +import 'dart:developer'; import 'dart:io'; import 'package:flutter/services.dart'; @@ -39,6 +40,9 @@ class VlcPlayerController extends ValueNotifier { /// Initialize vlc player when the platform is ready automatically final bool autoInitialize; + /// Video start from [startAt]. When initialization is complete + final Duration? startAt; + /// Set keep playing video in background, when app goes in background. /// The default value is false. final bool allowBackgroundPlayback; @@ -71,7 +75,6 @@ class VlcPlayerController extends ValueNotifier { /// List of onRenderer listeners final List _onRendererEventListeners = []; - bool _isDisposed = false; VlcAppLifeCycleObserver? _lifeCycleObserver; @@ -96,6 +99,7 @@ class VlcPlayerController extends ValueNotifier { this.dataSource, { this.autoInitialize = true, this.allowBackgroundPlayback = false, + this.startAt, this.package, this.hwAcc = HwAcc.auto, this.autoPlay = true, @@ -118,6 +122,7 @@ class VlcPlayerController extends ValueNotifier { this.dataSource, { this.autoInitialize = true, this.allowBackgroundPlayback = false, + this.startAt, this.hwAcc = HwAcc.auto, this.autoPlay = true, this.options, @@ -139,6 +144,7 @@ class VlcPlayerController extends ValueNotifier { File file, { this.autoInitialize = true, this.allowBackgroundPlayback = true, + this.startAt, this.hwAcc = HwAcc.auto, this.autoPlay = true, this.options, @@ -346,9 +352,24 @@ class VlcPlayerController extends ValueNotifier { _notifyOnInitListeners(); + /// Calling start at + unawaited(_setStartAt()); + return initializingCompleter.future; } + /// Waiting for video being loaded and then seek to start at + Future _setStartAt() async { + if (startAt != null) { + do { + await Future.delayed(const Duration(milliseconds: 100)); + } while (value.playingState != PlayingState.playing); + + log("seeking: ${value.duration.inSeconds}"); + await seekTo(startAt ?? Duration.zero); + } + } + /// Dispose controller @override Future dispose() async { @@ -591,6 +612,16 @@ class VlcPlayerController extends ValueNotifier { return; } + /// Sets the max audio volume of + /// + /// [maxVolume] indicates a value between 1 (lowest) and 200 (highest) on a + /// linear scale. + Future getMaxVolume(int maxVolume) async { + _throwIfNotInitialized('getMaxVolume'); + + return _maxVolume; + } + /// Sets the audio volume of /// /// [volume] indicates a value between 0 (silent), 100 (full volume) and 200 (maximum) on a From 36b2b8ac0d721d222fb63d3dafe98c6c70122d49 Mon Sep 17 00:00:00 2001 From: Sagar Patel Date: Tue, 7 Nov 2023 19:49:49 +0530 Subject: [PATCH 3/6] fix --- flutter_vlc_player/lib/src/vlc_player_controller.dart | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/flutter_vlc_player/lib/src/vlc_player_controller.dart b/flutter_vlc_player/lib/src/vlc_player_controller.dart index 8faa9dd5..0d1917c9 100644 --- a/flutter_vlc_player/lib/src/vlc_player_controller.dart +++ b/flutter_vlc_player/lib/src/vlc_player_controller.dart @@ -612,11 +612,8 @@ class VlcPlayerController extends ValueNotifier { return; } - /// Sets the max audio volume of - /// - /// [maxVolume] indicates a value between 1 (lowest) and 200 (highest) on a - /// linear scale. - Future getMaxVolume(int maxVolume) async { + /// Returns current vlc max volume level. + Future getMaxVolume() async { _throwIfNotInitialized('getMaxVolume'); return _maxVolume; From f59d0cd5508a3879ca27c6c8f81cabf4601e00a4 Mon Sep 17 00:00:00 2001 From: Sagar Date: Sat, 9 Dec 2023 13:24:24 +0530 Subject: [PATCH 4/6] Fixes. --- .../lib/src/vlc_player_controller.dart | 34 ++++++++++++------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/flutter_vlc_player/lib/src/vlc_player_controller.dart b/flutter_vlc_player/lib/src/vlc_player_controller.dart index 0d1917c9..7b56e948 100644 --- a/flutter_vlc_player/lib/src/vlc_player_controller.dart +++ b/flutter_vlc_player/lib/src/vlc_player_controller.dart @@ -1,5 +1,4 @@ import 'dart:async'; -import 'dart:developer'; import 'dart:io'; import 'package:flutter/services.dart'; @@ -22,6 +21,7 @@ import 'package:flutter_vlc_player_platform_interface/flutter_vlc_player_platfor /// After [dispose] all further calls are ignored. class VlcPlayerController extends ValueNotifier { int _maxVolume = 100; + bool _startAtSet = false; /// The URI to the video file. This will be in different formats depending on /// the [DataSourceType] of the original video. @@ -239,6 +239,10 @@ class VlcPlayerController extends ValueNotifier { ); break; case VlcMediaEventType.playing: + + /// Calling start at + if (startAt != null && !_startAtSet) _setStartAt(); + value = value.copyWith( isEnded: false, isPlaying: true, @@ -352,22 +356,27 @@ class VlcPlayerController extends ValueNotifier { _notifyOnInitListeners(); - /// Calling start at - unawaited(_setStartAt()); - return initializingCompleter.future; } - /// Waiting for video being loaded and then seek to start at + /// Seeking to start at Future _setStartAt() async { - if (startAt != null) { - do { - await Future.delayed(const Duration(milliseconds: 100)); - } while (value.playingState != PlayingState.playing); + // Check if already seted up or start at is null then return. + if (startAt == null || _startAtSet) return; - log("seeking: ${value.duration.inSeconds}"); - await seekTo(startAt ?? Duration.zero); + final Duration startAtDuration = startAt ?? Duration.zero; + + // Checking if startAt is greatet then video's duration then throw error. + if (startAtDuration.inMilliseconds > value.duration.inMilliseconds) { + throw ArgumentError.value( + startAtDuration, + 'Start At cannot be greater than video duration.', + ); } + + // Setting startAt + _startAtSet = true; + await seekTo(startAtDuration); } /// Dispose controller @@ -595,8 +604,7 @@ class VlcPlayerController extends ValueNotifier { /// linear scale. Future setMaxVolume(int maxVolume) async { _throwIfNotInitialized('setMaxVolume'); - const volumeLimit = 200; - if (maxVolume > volumeLimit) { + if (maxVolume > 200) { throw ArgumentError.value( maxVolume, 'Max volume should be lower than 200.', From 03e8d54bf3cccdfe0c8ccf86f70d8ebec1cb8be3 Mon Sep 17 00:00:00 2001 From: Sagar Patel Date: Thu, 24 Apr 2025 01:05:13 +0530 Subject: [PATCH 5/6] Errors Resolved --- .../lib/src/vlc_player_controller.dart | 22 ++++--------------- 1 file changed, 4 insertions(+), 18 deletions(-) diff --git a/flutter_vlc_player/lib/src/vlc_player_controller.dart b/flutter_vlc_player/lib/src/vlc_player_controller.dart index ec32cfe9..035cb178 100644 --- a/flutter_vlc_player/lib/src/vlc_player_controller.dart +++ b/flutter_vlc_player/lib/src/vlc_player_controller.dart @@ -236,10 +236,6 @@ class VlcPlayerController extends ValueNotifier { position: Duration.zero, ); case VlcMediaEventType.playing: - - /// Calling start at - if (startAt != null && !_startAtSet) _setStartAt(); - value = value.copyWith( isEnded: false, isPlaying: true, @@ -254,6 +250,9 @@ class VlcPlayerController extends ValueNotifier { activeSpuTrack: event.activeSpuTrack, errorDescription: VlcPlayerValue.noError, ); + + /// Calling start at + _setStartAt(); case VlcMediaEventType.ended: value = value.copyWith( isPlaying: false, @@ -596,20 +595,7 @@ class VlcPlayerController extends ValueNotifier { /// linear scale. Future setMaxVolume(int maxVolume) async { _throwIfNotInitialized('setMaxVolume'); - if (maxVolume > 200) { - throw ArgumentError.value( - maxVolume, - 'Max volume should be lower than 200.', - ); - } else if (maxVolume <= 0) { - throw ArgumentError.value( - maxVolume, - 'Max volume should not be 0 or negative.', - ); - } - _maxVolume = maxVolume; - - return; + _maxVolume = maxVolume.clamp(0, 200); } /// Returns current vlc max volume level. From bc37187d54bb58d973d1e823a05ef153f5c4a60c Mon Sep 17 00:00:00 2001 From: Sagar Patel Date: Sat, 31 May 2025 23:18:38 +0530 Subject: [PATCH 6/6] Fixes --- flutter_vlc_player/lib/src/vlc_player_controller.dart | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/flutter_vlc_player/lib/src/vlc_player_controller.dart b/flutter_vlc_player/lib/src/vlc_player_controller.dart index 3ce6e99b..e0e79480 100644 --- a/flutter_vlc_player/lib/src/vlc_player_controller.dart +++ b/flutter_vlc_player/lib/src/vlc_player_controller.dart @@ -355,10 +355,11 @@ class VlcPlayerController extends ValueNotifier { // Check if already seted up or start at is null then return. if (startAt == null || _startAtSet) return; - final Duration startAtDuration = startAt ?? Duration.zero; + final Duration startAtDuration = startAt!; - // Checking if startAt is greatet then video's duration then throw error. - if (startAtDuration.inMilliseconds > value.duration.inMilliseconds) { + // Only perform the check if the video's duration is known (greater than zero) + if (value.duration > Duration.zero && + startAtDuration.inMilliseconds > value.duration.inMilliseconds) { throw ArgumentError.value( startAtDuration, 'Start At cannot be greater than video duration.',