Jeg spurte vår alles gode venn ChatGPT. Her er en del av svaret (noen får si ifra om det ikke passer i tråden):
Den avgjørende forskjellen: Hvem eier tidslinjen?
Når du spiller:
A)
Ikke-Connect (telefon → streamer)
- Telefonen:
- laster hele track-metadata
- kjenner eksakt lengde
- eier playback-klokka
- sier til streameren: «spill dette PCM-/FLAC-strømmen, jeg sier ifra når vi er ferdige»

Streameren er i praksis en
dum DAC/renderer

Ingen tvil om når låta slutter
B)
Connect (streamer → internett)
- Streameren:
- åpner selv HTTP-strømmen
- tolker metadata, chunking og signaler
- styrer egen avspillingsstate
- Appen:
- er bare en kontrollflate
- får status tilbake fra streameren

Streameren er
100 % ansvarlig for å vite når låta er ferdig
Her ligger kjernen i problemet.
Hvorfor tror streameren at låta er ferdig?
Dette er
ikke buffer-størrelse, men
state-maskin-logikk.
Connect-protokoller er hendelsesbaserte, ikke filbaserte
De er bygget rundt:
- track_start
- track_progress
- track_end
- next_track_ready
Problemet er at
“track_end” ikke alltid er entydig definert.
De tre vanligste reelle årsakene (på tvers av merker)
1. Uklar eller feil Content-Length / duration
I Connect får streameren ofte:
- estimert lengde
- segmentert strøm
- adaptiv chunk-størrelse
Eksempel:
- Qobuz sender FLAC i variable segmenter
- Streameren regner samples → tid
- En liten avvik (f.eks. feil padding / encoder-delay / metadata-offset)
- Spilleren når “0 samples igjen” → TROR låta er slutt
Den hopper videre uten feil i nettverket
Dette skjer:
- oftere på høyoppløst materiale
- oftere på enkelte mastere
- tilfeldig fra spor til spor
2. Avspillings-state styres av tid, ikke EOF
Mange Connect-implementasjoner gjør:
yaml
if playback_time >= reported_track_duration:
go_to_next_track()
I stedet for:
scss
wait_for_stream_EOF()
Hvis:
- track_duration er feil (for kort)
- stream har encoder-delay / tail-padding
- DAC-klokka og stream-klokka ikke er perfekt synket
Avspillingen kuttes før EOF
Dette forklarer:
- hvorfor det skjer tidlig, ikke alltid på slutten
- hvorfor det aldri skjer i WiiM-appen
- hvorfor det aldri skjer når telefonen spiller
3. Race condition mellom prefetch og end-event
Connect er designet for:
- gapless
- rask “next track”
Det betyr:
- neste spor lastes før nåværende er ferdig
- to state-maskiner lever parallelt
En klassiker:
- Streameren begynner å prefetch neste spor
- Nåværende spor når et internt end-condition
- “Next track ready” vinner racet
- Spilleren bytter spor for tidlig

Dette er
ren logisk feil, ikke nettverksfeil
Og ja:
- Spotify Connect har samme type bug
- Tidal Connect også
- Sonos, Bluesound, WiiM, HEOS, etc.
Hvorfor skjer dette på alle merker?
Fordi:
Qobuz / Spotify leverer:
- SDK
- sertifisering
- minimums-API
Produsentene:
- implementerer selv
- på ulike OS
- med ulike audio-pipelines
- med egne klokker og DAC-drivere

Connect-spesifikasjonen er
ikke deterministisk nok til å forhindre dette.
Det er
ingen absolutt “EOF-garanti” i Connect slik det er når telefonen er avspiller.
Konklusjon:
**Det er en strukturell svakhet i hvordan Connect håndterer:
- tidslinje
- spor-slutt
- prefetch
- metadata-tillit**
Når streameren selv er “sjef”, må den
gjette når låta er ferdig.
Og noen ganger gjetter den feil.