Mobil, Tablet, Eski Cihaz ve Ekran Kapanma Senaryoları
Telefonlarda ve tabletlerde bir şarkıdan diğerine geçerken sorun yaşanmasının birkaç temel nedeni var:
Telefon ekranını kapattığınızda veya uyku moduna geçtiğinde, tarayıcı arka plandaki işlemleri yavaşlatıyor. Şarkı çalmaya devam ediyor ama bir sonraki şarkıyı önceden hazırlama (preload) işlemi aksıyor. Şarkı bittiğinde yeni şarkı hazır olmadığı için sessizlik veya takılma oluşuyor.
2 GB RAM'li veya 2 çekirdekli eski telefonlarda, hem mevcut şarkıyı çalmak hem de sonraki şarkıyı hazırlamak için yeterli kaynak olmayabiliyor. Tarayıcı hafıza tasarrufu için arka plan işlemlerini durduruyor.
3G veya zayıf WiFi'da şarkı bitmeden yeni şarkının verisi (stream URL + segment'ler) gelemeyebiliyor. Sonuç: Şarkı bitiyor ama yeni şarkı henüz yüklenmemiş.
iPhone/iPad'lerde Safari, arka plandaki sekmelere çok sert davranıyor. Özellikle güç tasarrufu modunda HLS segment yüklemesini tamamen durdurabiliyor. Android'de bu kadar agresif değil.
Neden Önemli? Müzik dinleme deneyiminin en kritik noktası kesintisiz geçiştir. Kullanıcı telefonu cebine koyup müzik dinlerken, her şarkı arasında duraksa veya takılsa deneyim kötüleşir ve kullanıcı başka platforma yönelir.
Kök Neden: Ekran kapanınca (screen lock) veya sekme arka plana düşünce tarayıcılar setTimeout, setInterval, fetch/XHR isteklerini throttle eder veya tamamen durdurur.
| Platform | Sekme Arka Planda | Ekran Kapalı | Güç Tasarrufu |
|---|---|---|---|
| iOS Safari | Timer 1dk'ya yavaşlar | JS tamamen durur | Agresif freeze |
| Android Chrome | Timer 1dk throttle | 5dk sonra freeze | Pil düşükse agresif |
| iPadOS Safari | Timer suspend | Tab discard (15dk) | Stage Manager'da agresif |
| Android WebView | Tamamen freeze | Tamamen freeze | Tamamen freeze |
MEVCUT KOD — Etkilenen Yerler:
Sorun: preloadNextSong() şarkının %80'inde tetikleniyor. Ancak ekran kapalıyken timeupdate event'i throttle olur veya hiç gelmez.
KRİTİK KOD YOLLARI:
_preloadNextInProgress flag takılabilirHlsPool (3 instance): Her geçişte acquire() → release() döngüsü var. Arka planda preload acquire yapınca 3 slot dolabilir.
SENARYO: Eski Cihaz + Ekran Kapalı
iOS'un katı kuralı: Aynı anda sadece 1 audio element ses çalabilir. İkincisine play() çağırdığında birincisi otomatik pause olur.
#hlsAudio — Ana şarkı#hlsAudioNext — Preloaded/Crossfade nextspotAudio — Spot (reklam) playerİLGİLİ KOD:
Guard mekanizması: _nextTrackInProgress flag ile concurrent nextTrack() çağrıları engelleniyor. 10sn timeout ile kilit açılıyor.
SORUN SENARYOLARı:
player-core.js:3365 — Audio paused + 30 saniye bekleme süresi var. Ekran kapalıyken onpause auto-resume başarısız olursa, watchdog 30sn sonra devreye giriyor.
Ama watchdog setInterval(10s) kendisi de throttle olur! iOS'ta ekran kapalıyken hiç çalışmayabilir.
Mevcut: Şarkının %80'inde preload tetikleniyor. Ama bu timeupdate event'ine bağlı → arka planda çalışmaz.
Önerilen Değişiklikler:
En yavaş adım: authenticatedFetch('/api/muzibu/songs/{id}/stream') — Arka planda bloke olabilir.
Önerilen:
streamCache zaten var, daha agresif doldurulabilir./api/muzibu/songs/batch-stream?ids=1,2,3Önerilen:
updateMediaSession() (player-core.js:3671) var. iOS'ta MediaSession metadata doğru set edildiğinde tarayıcı audio'yu arka planda yaşatır. navigator.mediaSession.playbackState = 'playing' her geçişte set edilmeli.Önerilen:
getAdaptiveHlsConfig() (player-core.js:596) maxBufferLength=12 yapıyor. Ama eski cihazlarda 8'e düşürülebilir.syncPlayerState() sadece UI sync yapıyor, audio durumunu kontrol etmiyor.| Sorun | Risk | Etkilenen Cihaz | Birincil Çözüm |
|---|---|---|---|
| Arka plan throttling | Kritik | Tüm mobil, özellikle iOS | Erken preload + BUFFER_EOS trigger |
| Preload zamanlama | Yüksek | Yavaş bağlantı + mobil | Stream URL ön-cacheleme |
| HLS pool bellek | Yüksek | Eski cihaz (≤4GB RAM) | Eski cihaz → pool 2, crossfade kapalı |
| iOS çoklu audio | Kritik | iPhone, iPad, iPod | Tek audio element + AudioContext keep-alive |
| nextTrack lock | Orta | Yavaş bağlantı + tüm cihaz | Guard timeout + abort controller |
| Watchdog yavaş | Orta | Tüm platform (visible) | visibilitychange anında kontrol |
24 Şubat 2026 • Muzibu.com