🧹 Madde 6: Şarkı Değişiminde Temizlik

Neden şarkı değiştikçe telefon yavaşlıyor?

⚠️ Bu sorun HENÜZ düzeltilmedi - Analiz aşamasında

📝 Basit Anlatım (Herkes İçin)

🍽️ Restoran Benzetmesi

❌ Şu anki durum

Bir restoran düşünün. Her müşteri yemek bitirdiğinde garson kirli tabakları masada bırakıyor. Yeni müşteri gelince yanına yeni tabak koyuyor.

🍽️🍽️🍽️🍽️🍽️

Masada 5 kirli tabak birikiyor!

✅ Olması gereken

Her müşteri bitirdiğinde garson önce kirli tabakları topluyor, sonra yeni müşteriye temiz tabak getiriyor.

🍽️

Her zaman sadece 1 tabak!

🎵

Şarkı 1 çalıyor

Player bellekte bir "ses kutusu" (audio element) oluşturuyor

⏭️

Şarkı 2'ye geçiyorsun

Player yeni bir "ses kutusu" oluşturuyor AMA eskisini tam temizlemiyor

📈

10 şarkı sonra...

Bellekte 10 tane yarı-temizlenmiş "ses kutusu" birikmiş. Telefon yavaşlıyor.

🎬 Görsel Gösterim

Bellek Kullanımı Simülasyonu

Şarkı 1
15 MB
Şarkı 5
45 MB
Şarkı 10
70 MB
Şarkı 20
95 MB 🔥

⚠️ Eski telefonlarda 100 MB = Donma başlangıcı

❌ Tam Temizlenmeyen Şeyler

  • Audio Element - Ses çalan kutu
  • HLS Instance - Stream yöneticisi
  • Event Listener - Dinleyiciler
  • Blob URL - Geçici adresler

✅ Düzeltme Sonrası

  • Eski audio element DOM'dan kaldırılır
  • HLS destroy() tam çağrılır
  • Tüm listener'lar kaldırılır
  • Blob URL'ler revoke edilir

🔧 Teknik Detaylar (Geliştiriciler İçin)

Mevcut Temizlik Kodu (player-core.js satır 4000-4029)

// 🧹 Mevcut temizlik - setTimeout ile 100ms gecikme
setTimeout(() => {
    // ❌ Sorun 1: Sadece ID kontrolü yapılıyor
    if (oldAudioId && oldAudioId !== currentActiveAudioId) {
        const oldAudio = document.getElementById(oldAudioId);
        if (oldAudio) {
            safeAudioCleanup(oldAudio);
            // ⚠️ removeChild YOK - DOM'da kalıyor!
        }
    }

    // ✅ Blob URL temizleniyor
    if (self._currentBlobUrl) {
        revokeBlobUrl(self._currentBlobUrl);
    }

    // ⚠️ HLS destroy çağrılıyor AMA...
    oldHls.destroy();
    // ❌ Buffer'lar hemen serbest kalmıyor
}, 100);

Tespit Edilen Sorunlar

1. Audio Element DOM'da Kalıyor

safeAudioCleanup() sadece src ve event'leri temizliyor, removeChild() çağrılmıyor.

// safeAudioCleanup içeriği (satır 130-149):
audio.pause();
audio.removeAttribute('src');
audio.load();
// ❌ document.body.removeChild(audio) YOK!

2. HLS Buffer'lar Gecikmeli Serbest

hls.destroy() çağrılsa bile MediaSource buffer'ları garbage collector'ı bekliyor. Eski telefonlarda GC yavaş çalışıyor.

3. Crossfade Sırasında Çift Kaynak

Crossfade aktifken 2 audio element aynı anda çalıyor. Her biri ~20MB buffer kullanıyor. Eski şarkının crossfade bitişi beklenmiyor, direkt yeni şarkı başlıyor.

İlgili Dosya ve Fonksiyonlar

Fonksiyon Dosya:Satır Görevi
safeAudioCleanup() player-core.js:130 Audio element temizleme
playSongFromQueue() player-core.js:3531 Şarkı çalma başlatma
completeCrossfade() player-core.js:2290 Crossfade sonlandırma
stopPlayback() player-core.js:4340 Player durdurma
_cleanupPreloadedNext() player-core.js:6970 Preload temizleme

✅ Önerilen Çözüm

1. Audio Element'i DOM'dan Kaldır

// safeAudioCleanup sonrasına eklenecek:
if (oldAudio && oldAudio.parentNode) {
    oldAudio.parentNode.removeChild(oldAudio);
}

2. Merkezi Cleanup Fonksiyonu

// Tüm temizliği tek noktada yapan fonksiyon:
fullCleanupOldSong(oldHls, oldAudioId, oldBlobUrl) {
    // 1. HLS destroy (buffer'ları serbest bırakır)
    if (oldHls) oldHls.destroy();

    // 2. Audio element'i DOM'dan kaldır
    const oldAudio = document.getElementById(oldAudioId);
    if (oldAudio) {
        safeAudioCleanup(oldAudio);
        if (oldAudio.parentNode) {
            oldAudio.parentNode.removeChild(oldAudio);
        }
    }

    // 3. Blob URL'yi revoke et
    if (oldBlobUrl) URL.revokeObjectURL(oldBlobUrl);
}

3. Agresif GC Tetikleme (Mobil için)

// Mobil cihazlarda GC'yi zorlama:
if (isMobileDevice()) {
    // Boş array oluşturup hemen sil - GC tetikler
    setTimeout(() => {
        let temp = new Array(1000);
        temp = null;
    }, 200);
}

📊 Özet

🎯
Problem
Eski şarkı kalıntıları bellekte birikiyor
📱
Etki
20+ şarkı sonra donma başlıyor
Çözüm
Merkezi cleanup + DOM kaldırma

📋 Tüm Maddeler Durumu

Madde 1: Buffer boyutu küçültüldü (60MB → 30MB)
Madde 2: Back buffer azaltıldı (30sn → 5sn)
Madde 3: Stream cache LRU limiti (max 30)
Madde 4: Queue refill race condition önlendi
Madde 5: Tek HLS instance (henüz yapılmadı)
Madde 6: Şarkı değişiminde temizlik (BU SAYFA)
Madde 7: CSS animasyonu (düşük öncelik, %1-5 etki)
18 Şubat 2026 • Muzibu.com