@@ -10,10 +10,12 @@ import 'package:app/utils/preferences.dart' as preferences;
10
10
import 'package:assets_audio_player/assets_audio_player.dart' ;
11
11
import 'package:flutter/cupertino.dart' ;
12
12
import 'package:rxdart/rxdart.dart' ;
13
+ import 'package:mutex/mutex.dart' ;
13
14
14
15
class AudioProvider with StreamSubscriber , ChangeNotifier {
15
16
SongProvider _songProvider;
16
17
InteractionProvider _interactionProvider;
18
+ Mutex _mutex;
17
19
18
20
late AssetsAudioPlayer _player;
19
21
AssetsAudioPlayer get player => _player;
@@ -22,7 +24,8 @@ class AudioProvider with StreamSubscriber, ChangeNotifier {
22
24
required SongProvider songProvider,
23
25
required InteractionProvider interactionProvider,
24
26
}) : _songProvider = songProvider,
25
- _interactionProvider = interactionProvider;
27
+ _interactionProvider = interactionProvider,
28
+ _mutex = Mutex ();
26
29
27
30
Future <void > init () async {
28
31
_player = AssetsAudioPlayer .newPlayer ();
@@ -72,23 +75,29 @@ class AudioProvider with StreamSubscriber, ChangeNotifier {
72
75
}
73
76
74
77
Future <void > play ({Song ? song}) async {
75
- if (song == null ) {
76
- return await _player.play ();
77
- }
78
+ await _mutex.acquire ();
78
79
79
- int index = await indexInQueue (song);
80
+ try {
81
+ if (song == null ) {
82
+ return await _player.play ();
83
+ }
80
84
81
- if (index != - 1 ) {
82
- await _player.playlistPlayAtIndex (index);
83
- } else {
84
- await _player.playlistPlayAtIndex (
85
- _player.current.hasValue
86
- ? await queueAfterCurrent (song: song)
87
- : await queueToTop (song: song),
88
- );
89
- }
85
+ int index = await indexInQueue (song);
90
86
91
- await _player.play ();
87
+ if (index != - 1 ) {
88
+ await _player.playlistPlayAtIndex (index);
89
+ } else {
90
+ await _player.playlistPlayAtIndex (
91
+ _player.current.hasValue
92
+ ? await queueAfterCurrent (song: song)
93
+ : await queueToTop (song: song),
94
+ );
95
+ }
96
+
97
+ await _player.play ();
98
+ } finally {
99
+ _mutex.release ();
100
+ }
92
101
}
93
102
94
103
Future <void > stop () async => await _player.stop ();
0 commit comments