Skip to content

Commit 22faebc

Browse files
committed
fix: enhance playback state management with improved control handling and update logic
1 parent c2f1820 commit 22faebc

File tree

1 file changed

+23
-16
lines changed

1 file changed

+23
-16
lines changed

lib/services/audio_service.dart

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,20 @@ class MusifyAudioHandler extends BaseAudioHandler {
110110
prev.queueIndex == curr.queueIndex,
111111
);
112112

113+
static const _playingControls = [
114+
MediaControl.skipToPrevious,
115+
MediaControl.pause,
116+
MediaControl.stop,
117+
MediaControl.skipToNext,
118+
];
119+
120+
static const _pausedControls = [
121+
MediaControl.skipToPrevious,
122+
MediaControl.play,
123+
MediaControl.stop,
124+
MediaControl.skipToNext,
125+
];
126+
113127
final processingStateMap = {
114128
ProcessingState.idle: AudioProcessingState.idle,
115129
ProcessingState.loading: AudioProcessingState.loading,
@@ -270,26 +284,27 @@ class MusifyAudioHandler extends BaseAudioHandler {
270284

271285
Future.microtask(() {
272286
try {
287+
final now = DateTime.now();
288+
final currentPosition = audioPlayer.position;
289+
final isPlaying = audioPlayer.playing;
273290
final currentState = playbackState.valueOrNull;
274291
final newProcessingState =
275292
processingStateMap[audioPlayer.processingState] ??
276293
AudioProcessingState.idle;
277294

278295
var shouldUpdate =
279296
currentState == null ||
280-
currentState.playing != audioPlayer.playing ||
297+
currentState.playing != isPlaying ||
281298
currentState.processingState != newProcessingState ||
282299
currentState.queueIndex != _currentQueueIndex;
283300

284301
if (!shouldUpdate) {
285-
final currentPosition = audioPlayer.position;
286302
final lastUpdateTime = currentState.updateTime;
287303
final lastUpdatePosition = currentState.updatePosition;
288304
final speed = currentState.speed;
289305

290306
final expectedPosition =
291-
lastUpdatePosition +
292-
(DateTime.now().difference(lastUpdateTime)) * speed;
307+
lastUpdatePosition + (now.difference(lastUpdateTime)) * speed;
293308

294309
if ((currentPosition - expectedPosition).abs() >
295310
const Duration(milliseconds: 500)) {
@@ -300,30 +315,22 @@ class MusifyAudioHandler extends BaseAudioHandler {
300315
if (shouldUpdate) {
301316
playbackState.add(
302317
PlaybackState(
303-
controls: [
304-
MediaControl.skipToPrevious,
305-
if (audioPlayer.playing)
306-
MediaControl.pause
307-
else
308-
MediaControl.play,
309-
MediaControl.stop,
310-
MediaControl.skipToNext,
311-
],
318+
controls: isPlaying ? _playingControls : _pausedControls,
312319
systemActions: const {
313320
MediaAction.seek,
314321
MediaAction.seekForward,
315322
MediaAction.seekBackward,
316323
},
317324
androidCompactActionIndices: const [0, 1, 3],
318325
processingState: newProcessingState,
319-
playing: audioPlayer.playing,
320-
updatePosition: audioPlayer.position,
326+
playing: isPlaying,
327+
updatePosition: currentPosition,
321328
bufferedPosition: audioPlayer.bufferedPosition,
322329
speed: audioPlayer.speed,
323330
queueIndex: _currentQueueIndex < _queueList.length
324331
? _currentQueueIndex
325332
: null,
326-
updateTime: DateTime.now(),
333+
updateTime: now,
327334
),
328335
);
329336
}

0 commit comments

Comments
 (0)