Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 32 additions & 0 deletions example/ios/Flutter/ephemeral/flutter_lldb_helper.py
Comment thread
NicholasNagy marked this conversation as resolved.
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
#
# Generated file, do not edit.
#

import lldb

def handle_new_rx_page(frame: lldb.SBFrame, bp_loc, extra_args, intern_dict):
"""Intercept NOTIFY_DEBUGGER_ABOUT_RX_PAGES and touch the pages."""
base = frame.register["x0"].GetValueAsAddress()
page_len = frame.register["x1"].GetValueAsUnsigned()

# Note: NOTIFY_DEBUGGER_ABOUT_RX_PAGES will check contents of the
# first page to see if handled it correctly. This makes diagnosing
# misconfiguration (e.g. missing breakpoint) easier.
data = bytearray(page_len)
data[0:8] = b'IHELPED!'

error = lldb.SBError()
frame.GetThread().GetProcess().WriteMemory(base, data, error)
if not error.Success():
print(f'Failed to write into {base}[+{page_len}]', error)
return

def __lldb_init_module(debugger: lldb.SBDebugger, _):
target = debugger.GetDummyTarget()
# Caveat: must use BreakpointCreateByRegEx here and not
# BreakpointCreateByName. For some reasons callback function does not
# get carried over from dummy target for the later.
bp = target.BreakpointCreateByRegex("^NOTIFY_DEBUGGER_ABOUT_RX_PAGES$")
bp.SetScriptCallbackFunction('{}.handle_new_rx_page'.format(__name__))
bp.SetAutoContinue(True)
print("-- LLDB integration loaded --")
5 changes: 5 additions & 0 deletions example/ios/Flutter/ephemeral/flutter_lldbinit
Comment thread
NicholasNagy marked this conversation as resolved.
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
#
# Generated file, do not edit.
#

command script import --relative-to-command-file flutter_lldb_helper.py
60 changes: 30 additions & 30 deletions example/pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -36,26 +36,26 @@ packages:
dependency: transitive
description:
name: characters
sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605"
sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803
url: "https://pub.dev"
source: hosted
version: "1.3.0"
version: "1.4.0"
clock:
dependency: transitive
description:
name: clock
sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf
sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b
url: "https://pub.dev"
source: hosted
version: "1.1.1"
version: "1.1.2"
collection:
dependency: transitive
description:
name: collection
sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a
sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76"
url: "https://pub.dev"
source: hosted
version: "1.18.0"
version: "1.19.1"
csslib:
dependency: transitive
description:
Expand Down Expand Up @@ -84,10 +84,10 @@ packages:
dependency: transitive
description:
name: fake_async
sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78"
sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44"
url: "https://pub.dev"
source: hosted
version: "1.3.1"
version: "1.3.3"
ffi:
dependency: transitive
description:
Expand Down Expand Up @@ -147,34 +147,34 @@ packages:
dependency: transitive
description:
name: leak_tracker
sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05"
sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de"
url: "https://pub.dev"
source: hosted
version: "10.0.5"
version: "11.0.2"
leak_tracker_flutter_testing:
dependency: transitive
description:
name: leak_tracker_flutter_testing
sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806"
sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1"
url: "https://pub.dev"
source: hosted
version: "3.0.5"
version: "3.0.10"
leak_tracker_testing:
dependency: transitive
description:
name: leak_tracker_testing
sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3"
sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1"
url: "https://pub.dev"
source: hosted
version: "3.0.1"
version: "3.0.2"
matcher:
dependency: transitive
description:
name: matcher
sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb
sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2
url: "https://pub.dev"
source: hosted
version: "0.12.16+1"
version: "0.12.17"
material_color_utilities:
dependency: transitive
description:
Expand All @@ -187,10 +187,10 @@ packages:
dependency: transitive
description:
name: meta
sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7
sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c
url: "https://pub.dev"
source: hosted
version: "1.15.0"
version: "1.16.0"
package_info_plus:
dependency: transitive
description:
Expand All @@ -211,10 +211,10 @@ packages:
dependency: transitive
description:
name: path
sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af"
sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5"
url: "https://pub.dev"
source: hosted
version: "1.9.0"
version: "1.9.1"
path_provider:
dependency: "direct main"
description:
Expand Down Expand Up @@ -299,7 +299,7 @@ packages:
dependency: transitive
description: flutter
source: sdk
version: "0.0.99"
version: "0.0.0"
source_span:
dependency: transitive
description:
Expand All @@ -312,18 +312,18 @@ packages:
dependency: transitive
description:
name: stack_trace
sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b"
sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1"
url: "https://pub.dev"
source: hosted
version: "1.11.1"
version: "1.12.1"
stream_channel:
dependency: transitive
description:
name: stream_channel
sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7
sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d"
url: "https://pub.dev"
source: hosted
version: "2.1.2"
version: "2.1.4"
string_scanner:
dependency: transitive
description:
Expand All @@ -344,10 +344,10 @@ packages:
dependency: transitive
description:
name: test_api
sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb"
sha256: "522f00f556e73044315fa4585ec3270f1808a4b186c936e612cab0b565ff1e00"
url: "https://pub.dev"
source: hosted
version: "0.7.2"
version: "0.7.6"
typed_data:
dependency: transitive
description:
Expand All @@ -360,10 +360,10 @@ packages:
dependency: transitive
description:
name: vector_math
sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803"
sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b
url: "https://pub.dev"
source: hosted
version: "2.1.4"
version: "2.2.0"
visibility_detector:
dependency: transitive
description:
Expand Down Expand Up @@ -429,5 +429,5 @@ packages:
source: hosted
version: "6.5.0"
sdks:
dart: ">=3.5.0 <4.0.0"
dart: ">=3.8.0-0 <4.0.0"
flutter: ">=3.24.0"
40 changes: 10 additions & 30 deletions ios/Classes/FLTBetterPlayerPlugin.swift
Original file line number Diff line number Diff line change
Expand Up @@ -760,39 +760,12 @@ class FLTBetterPlayer: NSObject, FlutterTexture, FlutterStreamHandler {
}

// Set the playback speed
func setSpeed(_ speed: Double, result: @escaping FlutterResult) {
if speed == 1.0 || speed == 0.0 {
playerRate = 1.0
result(nil)
} else if speed < 0 || speed > 2.0 {
result(FlutterError(
code: "unsupported_speed",
message: "Speed must be >= 0.0 and <= 2.0",
details: nil
))
} else if (speed > 1.0 && player.currentItem?.canPlayFastForward == true) ||
(speed < 1.0 && player.currentItem?.canPlaySlowForward == true) {
playerRate = Float(speed)
result(nil)
} else {
if speed > 1.0 {
result(FlutterError(
code: "unsupported_fast_forward",
message: "This video cannot be played fast forward",
details: nil
))
} else {
result(FlutterError(
code: "unsupported_slow_forward",
message: "This video cannot be played slow forward",
details: nil
))
}
}
func setSpeed(_ speed: Double) {
playerRate = Float(speed)

// Apply rate if currently playing
if isPlaying {
player.rate = Float(playerRate)
player.rate = playerRate
}
}

Expand Down Expand Up @@ -1507,6 +1480,13 @@ public class FLTBetterPlayerPlugin: NSObject, FlutterPlugin {
}
result(nil)

case "setSpeed":
// Set playback speed
if let speed = argsMap["speed"] as? Double {
player.setSpeed(speed)
}
result(nil)

case "setMixWithOthers":
// Configure audio mixing behavior
if let mixWithOthers = argsMap["mixWithOthers"] as? Bool {
Expand Down
17 changes: 17 additions & 0 deletions lib/src/core/better_player_controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -352,6 +352,23 @@ class BetterPlayerController {
return videoPlayerController!.isPlaying;
}

/// Sets the playback speed of the video.
///
/// [speed] indicates a speed value with 0.0 to 2.0 range.
/// A value of 1.0 is normal speed.
///
/// Throws [ArgumentError] if speed is not between 0.0 and 2.0.
/// Throws [StateError] if the data source has not been initialized.
Future<void> setSpeed(double speed) async {
if (videoPlayerController == null) {
throw StateError("The data source has not been initialized");
}
if (speed < 0.0 || speed > 2.0) {
throw ArgumentError.value(speed, 'speed', 'Must be between 0.0 and 2.0');
}
await videoPlayerController!.setSpeed(speed);
}

///Flag which determines whenever player is loading video data or not.
bool? isBuffering() {
if (videoPlayerController == null) {
Expand Down
11 changes: 11 additions & 0 deletions lib/src/video_player/method_channel_video_player.dart
Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,17 @@ class MethodChannelVideoPlayer extends VideoPlayerPlatform {
);
}

@override
Future<void> setSpeed(int? textureId, double speed) {
return _channel.invokeMethod<void>(
'setSpeed',
<String, dynamic>{
'textureId': textureId,
'speed': speed,
},
);
}

@override
Future<void> setMixWithOthers(int? textureId, bool mixWithOthers) {
return _channel.invokeMethod<void>(
Expand Down
20 changes: 20 additions & 0 deletions lib/src/video_player/video_player.dart
Original file line number Diff line number Diff line change
Expand Up @@ -515,6 +515,26 @@ class VideoPlayerController extends ValueNotifier<VideoPlayerValue> {
_videoPlayerPlatform.setAudioTrack(_textureId, name, index);
}

/// Sets the playback speed of the video.
///
/// [speed] indicates a speed value with 0.0 to 2.0 range.
/// A value of 1.0 is normal speed.
///
/// Throws [ArgumentError] if speed is not between 0.0 and 2.0.
Future<void> setSpeed(double speed) async {
if (_isDisposed) {
return;
}
if (speed < 0 || speed > 2.0) {
throw ArgumentError.value(
speed,
'speed',
'Speed must be between 0.0 and 2.0',
);
}
await _videoPlayerPlatform.setSpeed(_textureId, speed);
}

void setMixWithOthers(bool mixWithOthers) {
_videoPlayerPlatform.setMixWithOthers(_textureId, mixWithOthers);
}
Expand Down
4 changes: 4 additions & 0 deletions lib/src/video_player/video_player_platform_interface.dart
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,10 @@ abstract class VideoPlayerPlatform {
throw UnimplementedError('setAudio() has not been implemented.');
}

Future<void> setSpeed(int? textureId, double speed) {
throw UnimplementedError('setSpeed() has not been implemented.');
}

Future<void> setMixWithOthers(int? textureId, bool mixWithOthers) {
throw UnimplementedError('setMixWithOthers() has not been implemented.');
}
Expand Down
Loading
Loading