From 1316712383b6e2689872714bb5e356edb48f624a Mon Sep 17 00:00:00 2001 From: Erick Date: Sun, 8 May 2022 20:55:52 -0300 Subject: [PATCH] fix: prevent overlapping background music (#422) * fix: prevent overlaping background music * coverage --- .../pinball_audio/lib/src/pinball_audio.dart | 24 ++++++++++++++++++- .../test/src/pinball_audio_test.dart | 12 ++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/packages/pinball_audio/lib/src/pinball_audio.dart b/packages/pinball_audio/lib/src/pinball_audio.dart index 98074fc5..19a5d583 100644 --- a/packages/pinball_audio/lib/src/pinball_audio.dart +++ b/packages/pinball_audio/lib/src/pinball_audio.dart @@ -116,6 +116,28 @@ class _LoopAudio extends _Audio { } } +class _SingleLoopAudio extends _LoopAudio { + _SingleLoopAudio({ + required PreCacheSingleAudio preCacheSingleAudio, + required LoopSingleAudio loopSingleAudio, + required String path, + }) : super( + preCacheSingleAudio: preCacheSingleAudio, + loopSingleAudio: loopSingleAudio, + path: path, + ); + + bool _playing = false; + + @override + void play() { + if (!_playing) { + super.play(); + _playing = true; + } + } +} + class _RandomABAudio extends _Audio { _RandomABAudio({ required this.createAudioPool, @@ -270,7 +292,7 @@ class PinballAudioPlayer { path: Assets.sfx.cowMoo, duration: const Duration(seconds: 2), ), - PinballAudio.backgroundMusic: _LoopAudio( + PinballAudio.backgroundMusic: _SingleLoopAudio( preCacheSingleAudio: _preCacheSingleAudio, loopSingleAudio: _loopSingleAudio, path: Assets.music.background, diff --git a/packages/pinball_audio/test/src/pinball_audio_test.dart b/packages/pinball_audio/test/src/pinball_audio_test.dart index df21b1ad..e7592b8f 100644 --- a/packages/pinball_audio/test/src/pinball_audio_test.dart +++ b/packages/pinball_audio/test/src/pinball_audio_test.dart @@ -447,6 +447,18 @@ void main() { .onCall('packages/pinball_audio/${Assets.music.background}'), ).called(1); }); + + test('plays only once', () async { + await Future.wait(audioPlayer.load()); + audioPlayer + ..play(PinballAudio.backgroundMusic) + ..play(PinballAudio.backgroundMusic); + + verify( + () => loopSingleAudio + .onCall('packages/pinball_audio/${Assets.music.background}'), + ).called(1); + }); }); test(