Mobil arka plan, eski cihaz ve iOS Safari'de sorunsuz şarkı geçişi
Sorun ne? Telefonunuzda ekranı kapattığınızda veya başka uygulamaya geçtiğinizde, şarkı bitince bir sonraki şarkıya geçerken 5-15 saniye sessizlik oluyor. Özellikle eski veya zayıf telefonlarda bu daha da belirgin.
Neden oluyor? Tarayıcılar, ekran kapalıyken pil tasarrufu için bazı zamanlayıcıları (timer) yavaşlatıyor veya durduruyor. Player "şarkı bitti mi?" kontrolünü bu zamanlayıcılarla yapıyor, onlar çalışmayınca geçiş gecikiyor.
Ne yapacağız? Zamanlayıcılara bağımlılığı azaltıp, arka planda çalışmaya devam eden HLS altyapısının kendi sinyallerini (buffer bitti, parça yüklendi) kullanacağız. Ayrıca zayıf cihazlarda bellek tüketimini azaltacağız.
Kullanıcı ne hissedecek? Şarkılar arası geçiş daha hızlı ve kesintisiz olacak. Eski telefonlarda player daha az bellek kullanacak = daha az takılma.
Sayfa tekrar görünür olduğunda (visibility change) çağrılan bu fonksiyon şu anda sadece pause/time sync yapıyor. Yeni hali:
onTrackEnded(true) ile geçiş tetikleplaySongFromQueue()preloadNextSong() tetikle getActiveHlsAudio() ile doğru audio element referansını alır (HLS mode'da this.audio undefined olabiliyor).
Mevcut preload trigger'ı timeupdate event'ine bağlı. Arka planda bu event throttle ediliyor. BUFFER_EOS ise HLS.js worker thread'inden gelir ve arka planda da çalışır.
if (!self._nextSongPreloaded && !self._preloadNextInProgress) {
self._nextSongPreloaded = true;
self.preloadNextSong();
}
İki BUFFER_EOS handler var: biri normal path (~5656), biri preloaded path (~4730). İkisine de eklenir.
iOS Safari ve bazı Android tarayıcılarda navigator.mediaSession.playbackState set edilmezse, kilit ekranındaki kontroller kaybolabiliyor veya arka plan çalma durduruluyor.
navigator.mediaSession.playbackState = 'playing';
playbackState = isPlaying ? 'playing' : 'paused';
Takılma/donma algılama sürelerini kısaltarak daha hızlı müdahale:
Şarkı başladığında sonraki 2-3 şarkının stream URL'sini arka planda fetch edip streamUrlCache'e yazacak. Audio element veya HLS instance oluşturulmayacak — sadece URL string'leri (~2KB/adet).
_prefetchUpcomingStreamUrls()
→ playSongFromQueue() içinde, 2sn delay ile çağrılır
HlsPool normalde 3 HLS instance tutar (current + next + spare). RAM ≤4GB veya CPU ≤2 core cihazlarda 2'ye düşürülecek.
const ram = navigator.deviceMemory || 8;
const cores = navigator.hardwareConcurrency || 4;
if (ram <= 4 || cores <= 2) HlsPool._poolSize = 2;
getAdaptiveHlsConfig() içinde RAM ≤2GB veya (RAM ≤4GB + CPU ≤2) cihazlar için buffer limitleri düşürülecek:
RAM ≤4GB veya CPU ≤2 cihazlarda sonraki şarkının tamamını preload etmek yerine sadece stream URL'ini cache'e yazıp erken çıkacak. HLS instance oluşturulmayacak → büyük RAM tasarrufu.
if (_ram <= 4 || _cores <= 2) {
self._preloadNextInProgress = false;
return; // URL cache var, HLS yok
}
| Cihaz Tipi | Mevcut | Sonrası | Fark |
|---|---|---|---|
| Güçlü (8GB+) | ~36MB | ~36MB | 0 |
| Normal (4GB) | ~36MB | ~24MB | -12MB |
| Zayıf (≤2GB) | ~30MB | ~12MB | -18MB |
syncPlayerState:, BUFFER_EOS: preload, poolSize=2