Tamamlandi

Gapless Playback Optimizasyonu

29 Aralik 2025 - Muzik calar iyilestirmeleri

Basit Anlatim (Herkes Icin)

Sarkilar arasindaki bosluk (sessizlik) kaldirildi! Artik bir sarki bittiginde sonraki sarki aninda basliyor, kesinti yok.

Ne Degisti?

  • + Sarki bitislerinde artik kesinti yok
  • + Sonraki sarki onceden yukleniyor (2 saniye sonra)
  • + Gecisler cok daha akici
  • + Muzik deneyimi kesintisiz

Teknik Detaylar (Gelistiriciler Icin)

Onceki Durum (Gap Vardi)

  1. Sarki bitiyor
  2. Eski audio PAUSE ediliyordu
  3. Eski HLS destroy ediliyordu
  4. SONRA yeni audio baslatiliyordu
  5. = ~100-300ms GAP!

Yeni Durum (Gapless)

  1. Sarki bitiyor (dogal bitis)
  2. Preloaded audio HEMEN basliyor
  3. 100ms SONRA eski kaynaklar async temizleniyor
  4. = GAP YOK!

Kod Degisiklikleri

Dosya: public/themes/muzibu/js/player/core/player-core.js

  • - Eski referanslar onceden saklanıyor (oldHls, oldHowl, oldAudioId)
  • - play() basarili olduktan SONRA setTimeout(100ms) ile async cleanup
  • - this.howl = null explicit set edildi
  • - fromNaturalEnd=true ile stopCurrentPlayback() atlaniyor

Preload Sistemi

Ne Zaman Preload?

  • Sarki basladiktan 2 saniye sonra
  • _nextSongPreloaded flag ile kontrol
  • HLS: Ilk segment preload (bandwidth tasarrufu)
  • Safari: Native audio preload

Preload State

  • _preloadedNext: { songId, hls, audioId, ready }
  • _preloadNextInProgress: Boolean
  • _nextSongPreloaded: Boolean
  • streamUrlCache: Map (10 sarki limit)

Gapless Flow

Sarki Oynatilirken:
  ontimeupdate -> currentTime >= 2s -> preloadNextSong()
                                           |
                                           v
                                    _preloadedNext = {
                                      songId, hls, audioId, ready: true
                                    }

Sarki Bitince:
  audio.onended -> onTrackEnded()
                        |
                        v
                   nextTrack(true)  // fromNaturalEnd=true
                        |
                        v
                   (skip stopCurrentPlayback!)
                        |
                        v
                   playSongFromQueue()
                        |
                        v
                   playHlsStream()
                        |
                        v
                   if (_preloadedNext.ready) {
                     preloadedAudio.play()  // INSTANT!
                     setTimeout(100ms) {
                       cleanup oldHls/oldHowl
                     }
                   }
                

Onceki Temizlikler (Bu Session)

Silinen/Devre Disi

  • - keyboard.js (kaldirildi)
  • - shuffle mode (kaldirildi)
  • - repeat mode (kaldirildi)
  • - B2B mode (kaldirildi)
  • - Crossfade (devre disi: false)

Aktif Kalan

  • + Play/Pause/Next/Prev
  • + Queue yonetimi
  • + Auto-refill (sonsuz dinleme)
  • + Favorites
  • + HLS + MP3 streaming
  • + Preload sistemi
  • + GAPLESS playback

Git Commit

66ea8dee3

GAPLESS: True gapless playback optimization