PLAN v1 8 ADIM

RAM-Dostu Şarkı Geçiş İyileştirmesi

Mobil arka plan, eski cihaz ve iOS Safari'de sorunsuz şarkı geçişi

Basit Anlatım (Herkes İçin)

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.

1 Dosya
player-core.js (~8,967 satır)
8 Adım
4 sıfır-RAM + 4 RAM-azaltma
-18MB
Zayıf cihazlarda RAM tasarrufu
ADIM 1 RAM: 0 Satır 8551-8557

syncPlayerState() → Tam Recovery

SIFIR RİSK

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:

// Mevcut: sadece 2 satır sync
// Yeni: 3 kontrol katmanı
  • Şarkı bitmişseonTrackEnded(true) ile geçiş tetikle
  • Beklenmedik pause → resume dene, başarısızsa playSongFromQueue()
  • Preload yoksapreloadNextSong() tetikle

getActiveHlsAudio() ile doğru audio element referansını alır (HLS mode'da this.audio undefined olabiliyor).

ADIM 2 RAM: 0 Satır ~5656 & ~4730

BUFFER_EOS → Yedek Preload Trigger

SIFIR RİSK

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.

// BUFFER_EOS handler başına eklenir:
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.

ADIM 3 RAM: 0 Satır 3634, 8580

MediaSession playbackState Sync

SIFIR RİSK

iOS Safari ve bazı Android tarayıcılarda navigator.mediaSession.playbackState set edilmezse, kilit ekranındaki kontroller kaybolabiliyor veya arka plan çalma durduruluyor.

updateMediaSession() sonuna:
navigator.mediaSession.playbackState = 'playing';
$watch('isPlaying') içine:
playbackState = isPlaying ? 'playing' : 'paused';
ADIM 4 RAM: 0 Satır 3365, 3388

Watchdog Timeout Azaltma

SIFIR RİSK

Takılma/donma algılama sürelerini kısaltarak daha hızlı müdahale:

Pause Detection
30sn15sn
Freeze Detection
30sn20sn
RAM Azaltma Adımları
ADIM 5 RAM: +6KB Yeni metot

Stream URL Ön-Cacheleme

DÜŞÜK RİSK

Ş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
ADIM 6 RAM: -12MB Satır ~1184

Zayıf Cihazlarda HlsPool 3→2

DÜŞÜK RİSK

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;
ADIM 7 RAM: -4~7MB/instance Satır ~624

Çok Zayıf Cihazlarda Buffer Azaltma

DÜŞÜK RİSK

getAdaptiveHlsConfig() içinde RAM ≤2GB veya (RAM ≤4GB + CPU ≤2) cihazlar için buffer limitleri düşürülecek:

maxBufferLength
15-308
maxMaxBufferLength
30-6012
maxBufferSize
20-60MB6MB
ADIM 8 RAM: -12MB+ Satır ~7864

Zayıf Cihazlarda Preload → Sadece URL Cache

DÜŞÜK RİSK

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
}

Toplam RAM Etkisi

Cihaz Tipi Mevcut Sonrası Fark
Güçlü (8GB+) ~36MB ~36MB 0
Normal (4GB) ~36MB ~24MB -12MB
Zayıf (≤2GB) ~30MB ~12MB -18MB

Uygulama Sırası

1. syncPlayerState 2. BUFFER_EOS 3. MediaSession 4. Watchdog
5. URL Cache 6. Pool 3→2 7. Buffer ↓ 8. No Preload
Sıfır RAM, sıfır risk RAM azaltma

Test Kontrol Listesi

Masaüstü
Normal geçiş çalışıyor mu? Preload tetikleniyor mu?
Mobil (ekran kapalı)
2-3 şarkı otomatik geçiyor mu? Sessizlik var mı?
iOS Safari
Kilit ekranı kontrolleri çalışıyor mu?
Console Log
syncPlayerState:, BUFFER_EOS: preload, poolSize=2
24 Şubat 2026 • Muzibu.com