Spotify/YouTube tarzı havuz yönetimi ile şarkı geçişlerinde sıfır gecikme
Problem: Şu an her şarkı değiştiğinde player, HLS oynatıcısını (ses akışını yöneten parça) tamamen yıkıp sıfırdan yenisini oluşturuyor. Bu tıpkı her yeni şarkı için araba motorunu kapatıp yeniden çalıştırmak gibi — gereksiz zaman ve enerji kaybı.
Çözüm: Spotify ve YouTube'un yaptığı gibi, 2 tane HLS oynatıcısı baştan hazır tutulacak. Şarkı değiştiğinde mevcut oynatıcı "temizlenip" havuza geri konacak, yeni şarkı için havuzdan hazır bir oynatıcı alınacak. Motor hiç kapanmayacak, sadece vites değişecek.
Neden önemli? Şarkı geçişleri daha hızlı olacak, tarayıcı daha az bellek harcayacak ve özellikle uzun dinleme seanslarında donma/takılma riski azalacak.
new Hls()hls.destroy()HlsPool yöneticisiacquire() / release()public/themes/muzibu/js/player/core/player-core.js
~satır 260 civarı, utility fonksiyonların altına
init(config)
→ 2 instance oluştur
acquire()
→ Boş instance al
release(hls)
→ Temizle + havuza geri koy
taint(hls)
→ Kirli işaretle
destroyAll()
→ Sayfa kapanışı temizlik
~satır 795, Hls.isSupported() kontrolü içinde
if (Hls.isSupported()) { HlsPool.init(HLS_SHARED_CONFIG); }
window.addEventListener('beforeunload', () => HlsPool.destroyAll());
new Hls() → HlsPool.acquire()3 noktada değişiklik, ~90 satır inline config kaldırılır
| Fonksiyon | Satır | Kaldırılan | Yeni Kod |
|---|---|---|---|
playHlsStream() |
~4596 | 70 satır config | this.hls = HlsPool.acquire() |
preloadNextSong() |
~6928 | 10 satır config | hlsPreload = HlsPool.acquire() |
createNextHlsPlayer() |
~2209 | Config bloğu | this.hlsNext = HlsPool.acquire() |
destroy() → HlsPool.release()7 noktada destroy çağrısı release ile değiştirilir
| Fonksiyon | Açıklama |
|---|---|
createNextHlsPlayer error |
Crossfade hata → release(hlsNext) |
completeCrossfade |
Fade bitti → eski release(this.hls) |
stopCurrentPlayback (hls) |
Durdur → release(this.hls) |
stopCurrentPlayback (hlsNext) |
Next durdur → release(this.hlsNext) |
| Gapless old HLS cleanup | Eski HLS → release(oldHls) |
_cleanupPreloadedNext |
Preload temizle → release(preloadInfo.hls) |
taint() + release()Kurtarılamaz hatalarda instance kirli işaretlenip havuza geri verilir, release sırasında destroy + yenisi oluşturulur
Reuse edilen instance'ta eski listener'ların kalmaması garantilenir
release() her zaman removeAllListeners() çağırır
playHlsStream() yeni playSessionId closure oluşturur
playSessionId karşılaştırmasıyla filtrelenir
┌─────────────────────────────────────────────────┐
│ HlsPool (2 slot) │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ Instance │ │ Instance │ │ Overflow │ │
│ │ #1 │ │ #2 │ │ (gerekirse│ │
│ │ ● idle │ │ ● idle │ │ oluşur) │ │
│ └────┬─────┘ └────┬─────┘ └───────────┘ │
│ │ │ │
└───────┼──────────────┼───────────────────────────┘
│ │
acquire() acquire()
│ │
▼ ▼
┌──────────┐ ┌──────────┐
│ Ana │ │ Preload / │
│ Player │ │ Crossfade │
│ (this.hls)│ │ │
└────┬─────┘ └────┬─────┘
│ │
release() release()
┌────┘ └────┐
│ removeAllListeners() │
│ stopLoad() │
│ detachMedia() │
└────────┬───────────────┘
│
Havuza geri koy
│
┌─────┴─────┐
│ tainted? │
├─ Hayır ────→ Direkt geri koy
└─ Evet ─────→ destroy() + new Hls() → havuza koy