From e77694ade1e31d862557fee52891eeac8f1d0342 Mon Sep 17 00:00:00 2001 From: Ryan Heise Date: Fri, 27 Dec 2019 02:45:11 +1100 Subject: [PATCH] Implement setSpeed and reset position on stop for iOS --- example/lib/main.dart | 5 ++++- ios/Classes/AudioPlayer.m | 20 +++++++++++--------- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/example/lib/main.dart b/example/lib/main.dart index 158218b..690e0c7 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -90,7 +90,10 @@ class _MyAppState extends State { return StreamBuilder( stream: _player.getPositionStream(), builder: (context, snapshot) { - final position = snapshot.data ?? Duration.zero; + var position = snapshot.data ?? Duration.zero; + if (position > duration) { + position = duration; + } return SeekBar( duration: duration, position: position, diff --git a/ios/Classes/AudioPlayer.m b/ios/Classes/AudioPlayer.m index 1d0997e..546068b 100644 --- a/ios/Classes/AudioPlayer.m +++ b/ios/Classes/AudioPlayer.m @@ -95,7 +95,7 @@ long long now = (long long)([[NSDate date] timeIntervalSince1970] * 1000.0); int position = [self getCurrentPosition]; long long timeSinceLastUpdate = now - _updateTime; - long long expectedPosition = _updatePosition + timeSinceLastUpdate; // TODO: * speed + long long expectedPosition = _updatePosition + (long long)(timeSinceLastUpdate * _player.rate); long long drift = position - expectedPosition; // Update if we've drifted or just started observing if (_updateTime == 0L) { @@ -164,7 +164,7 @@ queue:nil usingBlock:^(NSNotification* note) { NSLog(@"Reached play end time"); - [self setPlaybackState:stopped]; + [self stop]; } ]; if (_player) { @@ -252,8 +252,10 @@ - (void)stop { [_player pause]; - [[_player currentItem] seekToTime:CMTimeMake(0, 1000)]; - [self setPlaybackState:stopped]; + [_player seekToTime:CMTimeMake(0, 1000) + completionHandler:^(BOOL finished) { + [self setPlaybackState:stopped]; + }]; } - (void)setVolume:(float)volume { @@ -261,11 +263,11 @@ } - (void)setSpeed:(float)speed { - //if (speed == 1.0 - // || speed < 1.0 && _player.currentItem.canPlaySlowForward - // || speed > 1.0 && _player.currentItem.canPlayFastForward) { - // _player.rate = speed; - //} + if (speed == 1.0 + || speed < 1.0 && _player.currentItem.canPlaySlowForward + || speed > 1.0 && _player.currentItem.canPlayFastForward) { + _player.rate = speed; + } } - (void)seek:(int)position result:(FlutterResult)result {