diff --git a/CHANGELOG.md b/CHANGELOG.md index 893da3bb..8e65b8d2 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 3.0.5 +* Updates MobileVLC to allow for changing of volume. Example Updated Also. +credits to Mitch Ross (https://github.com/mitchross) + ## 3.0.4 * Updates MobileVLC to allow for options as flags and hardware acceleration/ credits to pharshdev (https://github.com/pharshdev) and Mitch Ross (https://github.com/mitchross) diff --git a/android/src/main/java/software/solid/fluttervlcplayer/FlutterVideoView.java b/android/src/main/java/software/solid/fluttervlcplayer/FlutterVideoView.java index 3f3e6d91..ba14508b 100755 --- a/android/src/main/java/software/solid/fluttervlcplayer/FlutterVideoView.java +++ b/android/src/main/java/software/solid/fluttervlcplayer/FlutterVideoView.java @@ -243,6 +243,15 @@ public void onMethodCall(MethodCall methodCall, @NonNull MethodChannel.Result re result.success(null); break; + + case "setVolume": + int volume = 100; + volume = methodCall.argument("volume"); + mediaPlayer.setVolume(volume); + result.success(null); + break; + + } } diff --git a/example/ios/Flutter/.last_build_id b/example/ios/Flutter/.last_build_id index 536e0527..c07d4b8e 100755 --- a/example/ios/Flutter/.last_build_id +++ b/example/ios/Flutter/.last_build_id @@ -1 +1 @@ -f1df2ffda6f2083c9121914530433089 \ No newline at end of file +b51a9eab8a58462f1b870a104119b683 \ No newline at end of file diff --git a/example/ios/Podfile b/example/ios/Podfile old mode 100755 new mode 100644 index d5a6946a..671f7672 --- a/example/ios/Podfile +++ b/example/ios/Podfile @@ -10,78 +10,32 @@ project 'Runner', { 'Release' => :release, } -def parse_KV_file(file, separator='=') - file_abs_path = File.expand_path(file) - if !File.exists? file_abs_path - return []; +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" end - generated_key_values = {} - skip_line_start_symbols = ["#", "/"] - File.foreach(file_abs_path) do |line| - next if skip_line_start_symbols.any? { |symbol| line =~ /^\s*#{symbol}/ } - plugin = line.split(pattern=separator) - if plugin.length == 2 - podname = plugin[0].strip() - path = plugin[1].strip() - podpath = File.expand_path("#{path}", file_abs_path) - generated_key_values[podname] = podpath - else - puts "Invalid plugin specification: #{line}" - end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches end - generated_key_values + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" end +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_ios_podfile_setup + target 'Runner' do use_frameworks! use_modular_headers! - # Flutter Pod - - copied_flutter_dir = File.join(__dir__, 'Flutter') - copied_framework_path = File.join(copied_flutter_dir, 'Flutter.framework') - copied_podspec_path = File.join(copied_flutter_dir, 'Flutter.podspec') - unless File.exist?(copied_framework_path) && File.exist?(copied_podspec_path) - # Copy Flutter.framework and Flutter.podspec to Flutter/ to have something to link against if the xcode backend script has not run yet. - # That script will copy the correct debug/profile/release version of the framework based on the currently selected Xcode configuration. - # CocoaPods will not embed the framework on pod install (before any build phases can generate) if the dylib does not exist. - - generated_xcode_build_settings_path = File.join(copied_flutter_dir, 'Generated.xcconfig') - unless File.exist?(generated_xcode_build_settings_path) - raise "Generated.xcconfig must exist. If you're running pod install manually, make sure flutter pub get is executed first" - end - generated_xcode_build_settings = parse_KV_file(generated_xcode_build_settings_path) - cached_framework_dir = generated_xcode_build_settings['FLUTTER_FRAMEWORK_DIR']; - - unless File.exist?(copied_framework_path) - FileUtils.cp_r(File.join(cached_framework_dir, 'Flutter.framework'), copied_flutter_dir) - end - unless File.exist?(copied_podspec_path) - FileUtils.cp(File.join(cached_framework_dir, 'Flutter.podspec'), copied_flutter_dir) - end - end - - # Keep pod path relative so it can be checked into Podfile.lock. - pod 'Flutter', :path => 'Flutter' - - # Plugin Pods - - # Prepare symlinks folder. We use symlinks to avoid having Podfile.lock - # referring to absolute paths on developers' machines. - system('rm -rf .symlinks') - system('mkdir -p .symlinks/plugins') - plugin_pods = parse_KV_file('../.flutter-plugins') - plugin_pods.each do |name, path| - symlink = File.join('.symlinks', 'plugins', name) - File.symlink(path, symlink) - pod name, :path => File.join(symlink, 'ios') - end + flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) end post_install do |installer| installer.pods_project.targets.each do |target| - target.build_configurations.each do |config| - config.build_settings['ENABLE_BITCODE'] = 'NO' - end + flutter_additional_ios_build_settings(target) end end diff --git a/example/lib/main.dart b/example/lib/main.dart index 25e13e89..0f9f0274 100755 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -31,6 +31,7 @@ class MyAppScaffoldState extends State { bool isPlaying = true; double sliderValue = 0.0; double currentPlayerTime = 0; + double volumeValue = 100; @override void initState() { @@ -82,7 +83,7 @@ class MyAppScaffoldState extends State { child: new VlcPlayer( aspectRatio: 16 / 9, url: - "https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerJoyrides.mp4", + "https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerJoyrides.mp4", controller: _videoViewController, // Play with vlc options options: [ @@ -91,7 +92,8 @@ class MyAppScaffoldState extends State { '--no-skip-frames', '--rtsp-tcp' ], - hwAcc: HwAcc.DISABLED, // or {HwAcc.AUTO, HwAcc.DECODING, HwAcc.FULL} + hwAcc: HwAcc + .DISABLED, // or {HwAcc.AUTO, HwAcc.DECODING, HwAcc.FULL} placeholder: Container( height: 250.0, child: Row( @@ -117,6 +119,7 @@ class MyAppScaffoldState extends State { ), ), ), + Text("Seek"), Slider( activeColor: Colors.white, value: sliderValue, @@ -135,6 +138,18 @@ class MyAppScaffoldState extends State { FlatButton( child: isPlaying ? Icon(Icons.pause) : Icon(Icons.play_arrow), onPressed: () => {playOrPauseVideo()}), + Text("Volume Level"), + Slider( + min: 0, + max: 100, + value: volumeValue, + onChanged: (value) { + setState(() { + volumeValue = value; + }); + _videoViewController2.setVolume(volumeValue.toInt()); + }, + ), FlatButton( child: Text("Change URL"), onPressed: () => _videoViewController.setStreamUrl( diff --git a/ios/Classes/SwiftFlutterVlcPlayerPlugin.swift b/ios/Classes/SwiftFlutterVlcPlayerPlugin.swift index 62a8036b..0218b223 100755 --- a/ios/Classes/SwiftFlutterVlcPlayerPlugin.swift +++ b/ios/Classes/SwiftFlutterVlcPlayerPlugin.swift @@ -138,8 +138,12 @@ public class VLCView: NSObject, FlutterPlatformView { let newTime = NSNumber(value:(setTimeInMillisecondsAsString! as NSString).doubleValue) let time = VLCTime(number: newTime ) self.player.time = time - - + result(nil) + return + + case .setVolume: + let setVolume = arguments["volume"] as? Int32 + self.player.audio.volume = setVolume ?? 100 result(nil) return @@ -202,7 +206,7 @@ class VLCPlayerEventStreamHandler:NSObject, FlutterStreamHandler, VLCMediaPlayer } } - + switch player?.state { case .esAdded, .buffering, .opening: @@ -303,4 +307,5 @@ enum FlutterMethodCallOption :String { case getSnapshot = "getSnapshot" case setPlaybackSpeed = "setPlaybackSpeed" case setTime = "setTime" + case setVolume = "setVolume" } diff --git a/lib/flutter_vlc_player.dart b/lib/flutter_vlc_player.dart index 3927d5dd..48b570c7 100755 --- a/lib/flutter_vlc_player.dart +++ b/lib/flutter_vlc_player.dart @@ -347,6 +347,10 @@ class VlcPlayerController { await _methodChannel.invokeMethod("setTime", {'time': time.toString()}); } + Future setVolume(int volume) async { + await _methodChannel.invokeMethod("setVolume", {'volume': volume}); + } + Future setPlaybackSpeed(double speed) async { await _methodChannel .invokeMethod("setPlaybackSpeed", {'speed': speed.toString()}); diff --git a/pubspec.yaml b/pubspec.yaml index 7c22b358..a05f45d3 100755 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: flutter_vlc_player description: A VLC-powered alternative to Flutter's video_player. Supports multiple players on one screen. -version: 3.0.4 +version: 3.0.5 homepage: https://github.com/solid-software/flutter_vlc_player environment: