6 puan yazan GN⁺ 2025-02-17 | 1 yorum | WhatsApp'ta paylaş
  • Linux dizüstü bilgisayardaki white noise izlenince, gerçekte ses olmasa bile Firefox sekmelerinin PulseAudio ses sink’ini sürekli uyanık tuttuğu bir sorun ortaya çıktı
  • module-suspend-on-idle, 10 saniye sonra ses aygıtını durduracak şekilde ayarlanmıştı; ancak bir web sitesi AudioContext oluşturduğunda sink IDLE/SUSPENDED durumuna inmiyor
  • Outlook web bildirimleri, x.com’da tıklama, Google Translate ses oynatma ve Discord web uygulamasında aynı durum görüldü; hatta yalnızca new AudioContext() bile gürültünün başlamasına yetiyor
  • Ölçümlerde gürültü yokken pulseaudio CPU kullanımı %0.0’dı; gürültü varken %4.7’ye çıktı ve sistem gücü yaklaşık 1.5W arttı
  • AudioContext.suspend(), ses donanımı erişimini durdurarak CPU/batarya kullanımını azaltabiliyor; ancak Firefox, Chrome gibi belli bir süre sonra bu israfı otomatik olarak durdurmuyor

Ses sink’inin uykuya geçmemesi sorunu

  • Yeni dizüstü bilgisayarda müzik ya da ses çalınmadığında bile hoparlörlerden hafif ama rahatsız edici bir white noise duyuluyordu
  • Linux’ta PulseAudio durumunu kontrol etmek için pactl list sinks short kullanıldı
    • Ses sink’i durumu IDLE, SUSPENDED, RUNNING değerlerinden biri olarak görünür
    • Sink SUSPENDED durumundayken hoparlörler sessizdi
    • IDLE veya RUNNING durumundayken, gerçekten oynatılan bir ses olmasa bile white noise oluşabiliyordu
  • /etc/pulse/default.pa ve /etc/pulse/system.pa içinde module-suspend-on-idle yüklüydü
    • Ayara göre 10 saniye boyunca etkinlik olmazsa ses sink’inin otomatik olarak durması gerekiyordu
    • Ancak bazı durumlarda sink IDLE durumuna geçmediği için SUSPENDED durumuna da ulaşamıyordu

Boştaki sesin neden güç tükettiği

  • module-suspend-on-idle, belirli bir süre boyunca stream’e bağlı olmayan sink ve source’ları backend’den ayırır
  • Temel etkisi güç tasarrufudur
    • PulseAudio boşta bile ses kartına boş veri gönderirse ALSA daha fazla CPU çevrimi kullanır
    • Sürekli etkin bir stream tutma planı yoksa zamanlayıcıyı düşük ayarlamak güç tasarrufu açısından daha avantajlıdır

Neden Firefox sekmeleri ve web sitelerine kadar daraltıldı

  • White noise duyulduğunda pactl list sink-inputs ile hangi programın ses sink’ini kullandığı kontrol edildi
  • Neden her zaman Firefox çıktı
    • Açık sekmeler arasında gerçekten ses çalması gereken bir sekme yoktu
    • Sessize alınmış video da yoktu
  • i3 durum çubuğuna küçük bir script eklenerek ses sink’i RUNNING olduğunda kırmızı bir işaret görünmesi sağlandı
  • İlk başta sabitlenmiş sekme olarak açık duran outlook.office.com bildirim sesleri sorumlu gibi görünüyordu
    • E-posta geldiğinde white noise başlıyordu
    • Sekme yenilenene veya Firefox yeniden başlatılana kadar durmuyordu
  • Daha sonra aynı durumun başka web sitelerinde de olduğu görüldü
    • x.com üzerinde herhangi bir yere tıklanır tıklanmaz gürültü başlıyordu
    • translate.google.com üzerinde çeviri sesi dinlenirken de gürültü oluşuyordu
    • Discord web uygulaması yalnızca açık durduğunda bile aynı etki ortaya çıkıyordu

CPU ve güç ölçüm sonuçları

  • White noise yokken pulseaudio CPU kullanımı %0.0 olarak görünüyordu
  • Aynı ortamda güç ölçümleri çoğunlukla 4.2~5.1W aralığındaydı
  • White noise varken pulseaudio CPU kullanımı %4.7 seviyesine çıkıyordu
  • Bu sırada güç ölçümleri çoğunlukla 5.8~6.7W aralığındaydı
  • Fark “önemsiz” düzeyde değildi; yaklaşık 1.5W artış olarak özetleniyordu

WebAudio API ve AudioContext

  • HTML/JavaScript’te ses çalma yöntemleri ikiye ayrılır: <audio> etiketi ve WebAudio API
  • Outlook gibi sesi dinamik olarak çalan durumlarda WebAudio API kullanılır ve ses işlemleri için önce AudioContext oluşturmak gerekir
  • Sorun şu ki yalnızca const audioCtx = new AudioContext(); çalıştırmak bile hoparlörlerde white noise oluşmasına neden oluyor
  • Test sayfası olarak https://editor.43z.one/sqare/i sunuluyor
  • AudioContext.suspend(), ses bağlamındaki zaman ilerlemesini durdurur ve ses donanımı erişimini geçici olarak askıya alarak CPU/batarya kullanımını azaltır
  • AudioContext.resume(), durdurulmuş ses bağlamındaki zaman ilerlemesini yeniden başlatır

Firefox ve Chrome farkı

  • Birçok web sitesi, hemen ses çıkarması gerekmese bile AudioContext oluşturuyor ve sonrasında bunu suspend etmiyor
  • Chrome belli bir süre sonra CPU/batarya israfını otomatik olarak durduruyor
  • Firefox ise otomatik olarak durmuyor ve white noise üretmeye devam eden durumu koruyor
  • Doğrudan sebep web siteleri olsa da Firefox’un kullanıcıyı bu tür kaynak israfından koruyamadığı yönünde bir şikâyet kalıyor
  • Bluetooth kulaklık bağlıyken de x.com’a tıkladıktan sonra white noise iletiminin başlayıp kulaklık bataryasını boşa harcayabileceğinden şüpheleniliyor

Geçici önlem: AudioContext Suspender

1 yorum

 
GN⁺ 2025-02-17
Hacker News yorumları
  • Bu planlanmış ve önemli; mümkünse yakında düzeltilecek. Zaten uzun süredir ertelendi ve hâlâ ele alınamamış olması için üzgünüm. Her zaman bir öncelik savaşı var; herkesi zamanında memnun etmek zor, ama kişisel öncelik listemde oldukça üst sıralarda
    Tahmin edebileceğiniz gibi, belirli bir süre sessizlik olduğunda AudioContexti askıya almaktan çok daha karmaşık; yine de düzeltilebileceğini düşünüyorum. Çünkü diğer tarayıcılar bunu zaten yaptı ve kabul edilebilir ödünler de var
    Kaynak: Firefox’ta bu civardaki işlevlerin çoğunu ben uyguladım ve aynı zamanda Web Audio API standardının editörüyüm
    • Umarım bu eleştiriyi kişisel algılamazsınız. Yakın zamanda bir açık kaynak bakımcısının bu tür eleştirileri hayal kırıklığı olarak algılayıp büyük bir patlama yaşadığı bir olay oldu
      Çoğu kişi burada anlatılan durumu anlıyor. Yapılacak çok iş var, zaman ise sınırlı
      Firefox geliştiricilerinin yoğun kullanılan sitelerin kullanıcılar için düzgün çalışması adına beklentinin ötesine geçtiğini bizzat deneyimledim. Bir sorun kullanıcıyı etkilediğinde ne kadar ileri gittiğinizi bildiğim için, lütfen moralinizi bozmayın
    • Firefox’u daha iyi kullanan bir kullanıcı olmak istiyorum; yerelde bulduğum sorunları debug etmek isterim. Nereden başlamam gerektiği konusunda yönlendirmeye ihtiyacım var
  • Web sitelerinin gerçek bir oynatma olmadan audio context açması muhtemelen bot tespiti yüzündendir
    Tarayıcı motorları ve işletim sistemleri ses işlemeyi farklı şekillerde uyguladığı için, tamamen duyulmayacak bir sesi çalıp API ile geri kaydedince bir imza oluşur
    Bu imza ile tarayıcının user agent’ı sahteleyip sahtelemediği, headless modda olup olmadığı ya da gerçek bir kullanıcının ürün satın aldığı bir durum olmayan türlü uç senaryolar kontrol edilebilir
    https://github.com/fingerprintjs/fingerprintjs/blob/3201a7d6...
    • Tarayıcı/web standartları tarafı API’leri fazla rastgele çoğalttı ve dünyanın bunları bu şekilde kötüye kullanacağını yeterince düşünmemiş gibi görünüyor
    • Gerçekte dolaşımda olan bot eklentileri arasında, bot tespitini kandırmak için Audio Context’i simüle edenler bile zaten var. Delilik
    • Cloudflare’ın bunu devreye alıp gezinme özgürlüğünü daha da engelleyeceği ve CPU döngülerini boşa harcatacağı günü şimdiden iple çekiyorum
  • Bu beyaz gürültü yüzünden uzun süre çıldıracak gibi oldum ama nedenini hiç bulamıyordum
    Sekmede oynatılıyor simgesi görünmüyor, sekmeyi sessize alsam da gürültü durmuyor
    Windows ses karıştırıcısında Firefox’u sessize alsam da ses durmuyor
    Düzeltme: Masaüstü kullanıcıları için bu uzantı aslında pek iyi değil. Beyaz gürültünün sürekli açılıp kapanması çok daha rahatsız edici
    • Windows ses karıştırıcısıyla Firefox’u sessize almak bile durdurmuyorsa, bu Firefox’tan daha derindeki bir hata değil mi diye düşünüyorum
    • Masaüstünde o uzantıyı sorunsuz kullanıyorum. Ziyaret edilen siteye göre değişiyor gibi. Sık sık ses çalıp durduran sitelerde uzantıyı kapatmak yeterli olabilir
  • Çıkış boşa düştüğünde dijital SPDIF sinyali senkronizasyonu kaybediyor. Oynatma başladığında yeniden senkronize olmak anında olmuyor ve sesin ilk yaklaşık 1 saniyesi kayboluyor
    Bu yüzden hatta veri akıtmayan ama çıkışı açık tutan bir programı kendim yazdım; böylece çıkışın boşta duruma geçmesini engelledim
    Ancak dizüstü bağlamında pek mantıklı değil; orada enerji tasarrufu makul
    • MacBook’ta FiiO K3 DAC kullanırken bu gerçekten durmadan sinir bozucuydu. Bildirim sesi gibi sistem sesleri gecikme yüzünden fiilen çalınmıyordu
      Windows sürücüsünde stream’i Always On olarak ayarlama seçeneği var. Keşke macOS’te de olsa
    • Eskiden USB DAC’ta aynısını yaptım. Sadece oturum açınca play -qn & çalışacak şekilde ayarlamıştım
  • Android Firefox’ta bazen telefonun bir günde rastgele 10 GB veri tüketmesi sorununu bu açıklıyor gibi. Fatura akıl almaz gelmişti
    Bir haber sitesi ses çalarken yeni reklamları tekrar tekrar yüklüyordu; ses yüzünden de sekme güç tasarrufu durumuna geçmiyordu sanırım. Beklenmedik veri ücretleri çıkmaya devam ettiği için sonunda Chrome’a geçmek zorunda kaldım
  • macOS’te de eskiden bunun aynısını ya da çok benzerini görmüştüm. Sitenin gerçekten audio context’i açık tutup tutmadığından mı, yoksa Firefox içi bir sorun mu olduğundan emin değilim. Web Audio API kullanmayan Youtube gibi sitelerde de olduğu için
    Yani beyaz gürültü yoktu ama sesten kaynaklanan güç tüketimi vardı: https://bugzilla.mozilla.org/show_bug.cgi?id=1821102
    Şu anda da Mac’te hiçbir şey çalmamasına rağmen coreaudiod CPU’nun %20’sini kullanıyor. Pil ömrünü gerçekten mahvediyor; düzeltilene kadar başka bir tarayıcıya geçmeyi düşünüyorum ama bu kadar küçük görünen bir şey yüzünden Firefox’tan vazgeçmek istemiyorum
    Güncelleme: İlgili ama farklı bir hata gibi görünüyor
  • Chromium’da bu askıya alma işlemini yapan kod burada:
    https://source.chromium.org/chromium/chromium/src/+/main:med...
    Temel olarak yaklaşık 30 saniye sessizlik algıladığında, işletim sistemi ses aygıtının desteklediği sink’ten null sink’e geçiyor
    Not olarak, bu yöntem ses aygıtından farklı bir saat kullandığı için, context daha sonra gerçekten kullanıldığında belirli tonlarda bozulma oluştuğuna dair birkaç rapor vardı. Geçici çözüm, sitenin yazıda bahsedilen suspend/resume API’sini kullanması
  • audioContextin içeride nasıl uygulandığını ayrıntılı bilmiyorum, ama oldukça akıllı ve dinamik davranmaya çalışan birçok unsur içeriyor gibi. Bildirim sesi çalmak, img href *.svg yerine D3 ile SVG çizmek gibi hissettiriyor
    Bildirim işleyicisi gibi basit ve tekrarlanabilir şeyleri daha alt seviyede verimli API’lere kaydetmeyi sağlayan bir Service Worker hook’u olup olmadığını merak ediyorum
  • Gerçekten bir şey duyulması mı gerekiyor?
    MacOS’te Firefox 134.0.1’de hiç ses duymuyorum
    • Benim tarafta da ses yok, ama yazarın demo sayfasında sesi çalma düğmesine basınca güç tüketimi yaklaşık 1 W artıyor
    • Android Firefox’ta hafif bir beyaz gürültü duyuluyor
  • Bu, https://www.dr.dk/ ana sayfasındaki sorunu düzeltti