Skip to content

Commit d73c7d5

Browse files
authored
fix: Set playback rate only when playing (#1658)
Fixes #468
1 parent 9086e75 commit d73c7d5

4 files changed

Lines changed: 24 additions & 5 deletions

File tree

packages/audioplayers/example/integration_test/platform_test.dart

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,18 @@ void main() async {
181181
}
182182
}
183183

184+
testWidgets('Avoid resume on setting playbackRate (#468)', (tester) async {
185+
await tester.prepareSource(
186+
playerId: playerId,
187+
platform: platform,
188+
testData: mp3Url1TestData,
189+
);
190+
await platform.setPlaybackRate(playerId, 2.0);
191+
await tester.pumpAndSettle(const Duration(seconds: 2));
192+
expect(await platform.getCurrentPosition(playerId), 0);
193+
await tester.pumpLinux();
194+
});
195+
184196
for (final td in audioTestDataList) {
185197
if (features.hasSeek && !td.isLiveStream) {
186198
testWidgets('#seek with millisecond precision ${td.source}',

packages/audioplayers_android/android/src/main/kotlin/xyz/luan/audioplayers/player/MediaPlayerPlayer.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,9 @@ class MediaPlayerPlayer(
4343
override fun setRate(rate: Float) {
4444
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
4545
mediaPlayer.playbackParams = mediaPlayer.playbackParams.setSpeed(rate)
46-
} else if (rate != 1.0f) {
46+
} else if (rate == 1.0f) {
47+
mediaPlayer.start()
48+
} else {
4749
error("Changing the playback rate is only available for Android M/23+ or using LOW_LATENCY mode.")
4850
}
4951
}
@@ -58,7 +60,8 @@ class MediaPlayerPlayer(
5860
}
5961

6062
override fun start() {
61-
mediaPlayer.start()
63+
// Setting playback rate instead of mediaPlayer.start().
64+
setRate(wrappedPlayer.rate)
6265
}
6366

6467
override fun pause() {

packages/audioplayers_android/android/src/main/kotlin/xyz/luan/audioplayers/player/WrappedPlayer.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,9 @@ class WrappedPlayer internal constructor(
6767
set(value) {
6868
if (field != value) {
6969
field = value
70-
player?.setRate(value)
70+
if (playing) {
71+
player?.setRate(value)
72+
}
7173
}
7274
}
7375

@@ -364,7 +366,6 @@ class WrappedPlayer internal constructor(
364366
}
365367

366368
private fun Player.configAndPrepare() {
367-
setRate(rate)
368369
setVolumeAndBalance(volume, balance)
369370
setLooping(isLooping)
370371
prepare()

packages/audioplayers_darwin/darwin/Classes/WrappedMediaPlayer.swift

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,10 @@ class WrappedMediaPlayer {
114114

115115
func setPlaybackRate(playbackRate: Double) {
116116
self.playbackRate = playbackRate
117-
player.rate = Float(playbackRate)
117+
if isPlaying {
118+
// Setting the rate causes the player to resume playing. So setting it only, when already playing.
119+
player.rate = Float(playbackRate)
120+
}
118121
}
119122

120123
func seek(time: CMTime, completer: Completer? = nil) {

0 commit comments

Comments
 (0)