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
24 changes: 24 additions & 0 deletions packages/audioplayers/example/integration_test/lib_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,30 @@ void main() async {
skip: !features.hasBytesSource,
);

group('ReleaseMode', () {
for (final td in audioTestDataList) {
if (features.hasReleaseModeRelease && !td.isLiveStream) {
testWidgets('#release ${td.source}', (tester) async {
final player = AudioPlayer();
await player.setReleaseMode(ReleaseMode.release);

await player.play(td.source);

if (td.duration! < const Duration(seconds: 2)) {
await tester.pumpPlatform(const Duration(seconds: 3));
// No need to call stop, as it should be released by now
} else {
await tester.pumpPlatform(const Duration(seconds: 1));
await player.stop();
}
// TODO(Gustl22): test if source was released
expect(await player.getDuration(), null);
expect(await player.getCurrentPosition(), null);
});
}
}
});

group('AP events', () {
late AudioPlayer player;

Expand Down
24 changes: 0 additions & 24 deletions packages/audioplayers/example/integration_test/platform_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -275,30 +275,6 @@ void main() async {
}
}

for (final td in audioTestDataList) {
if (features.hasReleaseModeRelease && !td.isLiveStream) {
testWidgets('#ReleaseMode.release ${td.source}', (tester) async {
await tester.prepareSource(
playerId: playerId,
platform: platform,
testData: td,
);
await platform.setReleaseMode(playerId, ReleaseMode.release);
await platform.resume(playerId);
if (td.duration! < const Duration(seconds: 2)) {
await tester.pumpAndSettle(const Duration(seconds: 3));
// No need to call stop, as it should be released by now
} else {
await tester.pumpAndSettle(const Duration(seconds: 1));
await platform.stop(playerId);
}
// TODO(Gustl22): test if source was released
expect(await platform.getDuration(playerId), null);
expect(await platform.getCurrentPosition(playerId), null);
});
}
}

for (final td in audioTestDataList) {
testWidgets('#release ${td.source}', (tester) async {
await tester.prepareSource(
Expand Down
31 changes: 26 additions & 5 deletions packages/audioplayers/lib/src/audioplayer.dart
Original file line number Diff line number Diff line change
Expand Up @@ -157,10 +157,24 @@ class AudioPlayer {
);
_onPlayerCompleteStreamSubscription = onPlayerComplete.listen(
(_) async {
if (state == PlayerState.disposed) {
return;
}
state = PlayerState.completed;
if (releaseMode == ReleaseMode.release) {
_source = null;
if (releaseMode != ReleaseMode.loop) {
await _platform.stop(this.playerId);
if (state == PlayerState.disposed) {
return;
}
if (releaseMode == ReleaseMode.release) {
await _platform.release(this.playerId);
if (state == PlayerState.disposed) {
return;
}
_source = null;
}
}
// Need to call AFTER stop, to take the zero position into account.
await _positionUpdater?.stopAndUpdate();
},
onError: (Object _, [StackTrace? __]) {
Expand Down Expand Up @@ -260,6 +274,10 @@ class AudioPlayer {
state = PlayerState.stopped;
await _positionUpdater?.stopAndUpdate();
}
if (releaseMode == ReleaseMode.release) {
await _platform.release(playerId);
_source = null;
}
}

/// Resumes the audio that has been paused or stopped.
Expand All @@ -284,9 +302,12 @@ class AudioPlayer {
/// call [resume] or change the source.
Future<void> release() async {
await stop();
await _platform.release(playerId);
// Stop state already set in stop()
_source = null;
if (releaseMode != ReleaseMode.release) {
// If ReleaseMode.release, otherwise `stop` already releases the resource.
await _platform.release(playerId);
// Stop state already set in stop()
_source = null;
}
}

/// Moves the cursor to the desired position.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -229,20 +229,16 @@ class WrappedPlayer internal constructor(
if (released) {
return
}
if (releaseMode != ReleaseMode.RELEASE) {
pause()
if (prepared) {
if (player?.isLiveStream() == true) {
player?.stop()
prepared = false
player?.prepare()
} else {
// MediaPlayer does not allow to call player.seekTo after calling player.stop
seek(0)
}
pause()
if (prepared) {
if (player?.isLiveStream() == true) {
player?.stop()
prepared = false
player?.prepare()
} else {
// MediaPlayer does not allow to call player.seekTo after calling player.stop
seek(0)
}
} else {
release()
}
}

Expand Down Expand Up @@ -296,9 +292,6 @@ class WrappedPlayer internal constructor(
}

fun onCompletion() {
if (releaseMode != ReleaseMode.LOOP) {
stop()
}
ref.handleComplete(this)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -186,13 +186,9 @@ class WrappedPlayer internal constructor(
if (released) {
return
}
if (releaseMode != ReleaseMode.RELEASE) {
pause()
if (prepared) {
player?.stop()
}
} else {
release()
pause()
if (prepared) {
player?.stop()
}
}

Expand Down Expand Up @@ -245,9 +241,6 @@ class WrappedPlayer internal constructor(
}

fun onCompletion() {
if (releaseMode != ReleaseMode.LOOP) {
stop()
}
ref.handleComplete(this)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -133,9 +133,7 @@ enum ReleaseMode: String {

func stop() async {
pause()
if releaseMode == ReleaseMode.release {
await release()
} else if (getCurrentPosition() ?? 0) != 0 {
if (getCurrentPosition() ?? 0) != 0 {
await seek(time: toCMTime(millis: 0))
}
}
Expand Down Expand Up @@ -276,13 +274,9 @@ enum ReleaseMode: String {
reference.controlAudioSession()
eventHandler.onComplete()

await seek(time: toCMTime(millis: 0))
if self.releaseMode == ReleaseMode.loop {
await seek(time: toCMTime(millis: 0))
self.resume()
} else if self.releaseMode == ReleaseMode.release {
await self.release()
} else {
self.isPlaying = false
}
}
}
20 changes: 7 additions & 13 deletions packages/audioplayers_linux/linux/audio_player.cc
Original file line number Diff line number Diff line change
Expand Up @@ -251,8 +251,6 @@ void AudioPlayer::OnPlaybackEnded() {
}
if (GetReleaseMode() == ReleaseMode::loop) {
Play();
} else {
Stop();
}
}

Expand Down Expand Up @@ -413,17 +411,13 @@ void AudioPlayer::Stop() {
return;
}

if (GetReleaseMode() == ReleaseMode::release) {
ReleaseMediaSource();
} else {
SetPosition(0);
// Block thread to wait for state, as it is not expected to be waited to
// "seek complete" event on the dart side.
GstStateChangeReturn ret =
gst_element_get_state(playbin, NULL, NULL, GST_CLOCK_TIME_NONE);
if (ret == GST_STATE_CHANGE_FAILURE) {
throw "Unable to seek playback to '0' while stopping the player.";
}
SetPosition(0);
// Block thread to wait for state, as it is not expected to be waited to
// "seek complete" event on the dart side.
GstStateChangeReturn ret =
gst_element_get_state(playbin, NULL, NULL, GST_CLOCK_TIME_NONE);
if (ret == GST_STATE_CHANGE_FAILURE) {
throw "Unable to seek playback to '0' while stopping the player.";
}
}

Expand Down
11 changes: 1 addition & 10 deletions packages/audioplayers_web/lib/wrapped_player.dart
Original file line number Diff line number Diff line change
Expand Up @@ -136,11 +136,6 @@ class WrappedPlayer {
);
_playerEndedSubscription = p.onEnded.listen(
(_) async {
if (_currentReleaseMode == ReleaseMode.release) {
await release();
} else {
await stop();
}
eventStreamController.add(
const AudioEvent(eventType: AudioEventType.complete),
);
Expand Down Expand Up @@ -237,11 +232,7 @@ class WrappedPlayer {
Future<void> stop() async {
pause();
_pausedAt = 0;
if (_currentReleaseMode == ReleaseMode.release) {
await release();
} else {
player?.currentTime = 0;
}
player?.currentTime = 0;
}

void seek(int position) {
Expand Down
8 changes: 1 addition & 7 deletions packages/audioplayers_windows/windows/audio_player.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -181,8 +181,6 @@ void AudioPlayer::OnPlaybackEnded() {
}
if (GetReleaseMode() == ReleaseMode::loop) {
Play();
} else {
Stop();
}
}

Expand Down Expand Up @@ -280,11 +278,7 @@ void AudioPlayer::Pause() {

void AudioPlayer::Stop() {
Pause();
if (GetReleaseMode() == ReleaseMode::release) {
ReleaseMediaSource();
} else {
SeekTo(0);
}
SeekTo(0);
}

void AudioPlayer::Resume() {
Expand Down
Loading