- 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 sinkIDLE/SUSPENDEDdurumuna 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
pulseaudioCPU 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 shortkullanıldı- Ses sink’i durumu
IDLE,SUSPENDED,RUNNINGdeğerlerinden biri olarak görünür - Sink
SUSPENDEDdurumundayken hoparlörler sessizdi IDLEveyaRUNNINGdurumundayken, gerçekten oynatılan bir ses olmasa bile white noise oluşabiliyordu
- Ses sink’i durumu
/etc/pulse/default.pave/etc/pulse/system.paiçindemodule-suspend-on-idleyüklüydü- Ayara göre 10 saniye boyunca etkinlik olmazsa ses sink’inin otomatik olarak durması gerekiyordu
- Ancak bazı durumlarda sink
IDLEdurumuna geçmediği içinSUSPENDEDdurumuna 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-inputsile 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
RUNNINGolduğ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
pulseaudioCPU 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
pulseaudioCPU 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
AudioContextoluş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ırAudioContext.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
AudioContextoluş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
- Sorunu hafifletmek için
AudioContexti otomatik olarak askıya alan ve web sitesi ses çalmaya çalıştığında yeniden başlatmayı deneyen bir eklenti geliştirildi - Eklenti kusursuz değil
- Yeniden başlatma biraz zaman alıyor
- Sesi başlatan birden fazla yol olduğu için her zaman yeniden devreye girmeyebilir
- Yine de kullanım amacı için yeterli
- İlgili bağlantılar
- İlgili Bugzilla kayıtları
1 yorum
Hacker News yorumları
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 varKaynak: Firefox’ta bu civardaki işlevlerin çoğunu ben uyguladım ve aynı zamanda Web Audio API standardının editörüyüm
Ç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
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...
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
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
Windows sürücüsünde stream’i Always On olarak ayarlama seçeneği var. Keşke macOS’te de olsa
play -qn &çalışacak şekilde ayarlamıştımBir 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
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
coreaudiodCPU’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 istemiyorumGüncelleme: İlgili ama farklı bir hata gibi görünüyor
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 *.svgyerine D3 ile SVG çizmek gibi hissettiriyorBildirim 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
MacOS’te Firefox 134.0.1’de hiç ses duymuyorum