fix: prevent notification close on skip and background audio stall
- playCurrent: set _trackChanging flag and update media session metadata before changing src, so the pause event fired by src-swap does not set playbackState='paused' and dismiss the Samsung cover screen notification - Remove stalled->load() handler that silently paused audio with no recovery - Error handler now retries regardless of paused state (load() causes paused) - Add .catch() to audio.play() in playCurrent Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
1 parent
f2c77f975d
commit
89e169b70a
8 files changed
+632
-9
No files matched your search
+6
-5
@@ -126,6 +126,7 @@ window.addEventListener('load', () => {
|
||||
S.audio.addEventListener('timeupdate', updateProgress);
|
||||
S.audio.addEventListener('ended', onEnded);
|
||||
S.audio.addEventListener('play', () => {
|
||||
S._trackChanging = false;
|
||||
absInterrupt();
|
||||
setPlayIcon(true);
|
||||
document.getElementById('player-art').classList.add('spinning');
|
||||
@@ -134,16 +135,16 @@ window.addEventListener('load', () => {
|
||||
S.audio.addEventListener('pause', () => {
|
||||
setPlayIcon(false);
|
||||
document.getElementById('player-art').classList.remove('spinning');
|
||||
if(navigator.mediaSession) navigator.mediaSession.playbackState = 'paused';
|
||||
// Suppress during track change — src swap fires pause before the new track starts
|
||||
if(!S._trackChanging && navigator.mediaSession) navigator.mediaSession.playbackState = 'paused';
|
||||
});
|
||||
S.previewAudio.addEventListener('timeupdate', updatePreviewProgress);
|
||||
S.previewAudio.addEventListener('ended', stopPreview);
|
||||
|
||||
// Recovery: try to resume if audio stalls (network hiccup, background throttle)
|
||||
S.audio.addEventListener('stalled', () => { if(!S.audio.paused) S.audio.load(); });
|
||||
S.audio.addEventListener('waiting', () => { /* let browser handle buffering */ });
|
||||
// stalled = browser buffer ran out briefly; let the browser retry naturally.
|
||||
// The watchdog below catches genuine long freezes.
|
||||
S.audio.addEventListener('error', () => {
|
||||
if(!S.audio.paused && S.queue[S.qIdx]) {
|
||||
if(S.queue[S.qIdx]) {
|
||||
const t = setTimeout(() => { S.audio.load(); S.audio.play().catch(()=>{}); }, 2000);
|
||||
S.audio.addEventListener('play', () => clearTimeout(t), { once: true });
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user