6 पॉइंट द्वारा GN⁺ 2025-02-17 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • Linux लैपटॉप में white noise का पता लगाते हुए यह सामने आया कि असली आवाज़ न होने पर भी Firefox टैब PulseAudio audio sink को लगातार जगाए रखता है
  • module-suspend-on-idle इस तरह सेट था कि 10 सेकंड बाद audio device रुक जाए, लेकिन अगर कोई वेबसाइट AudioContext बनाती है तो sink IDLE/SUSPENDED में नहीं जाता
  • Outlook वेब नोटिफिकेशन, x.com पर क्लिक, Google Translate में voice playback, और Discord वेब ऐप में वही व्यवहार दिखा, और सिर्फ new AudioContext() से भी noise शुरू हो गया
  • माप में noise न होने पर pulseaudio का CPU उपयोग 0.0% था, लेकिन noise होने पर 4.7% था और सिस्टम पावर लगभग 1.5W बढ़ी
  • AudioContext.suspend() audio hardware access रोककर CPU/बैटरी उपयोग घटा सकता है, लेकिन Firefox, Chrome की तरह कुछ समय बाद अपने-आप इस बर्बादी को नहीं रोकता

audio sink के sleep में न जाने की समस्या

  • नए लैपटॉप में संगीत या audio न चलने पर भी स्पीकर से हल्की लेकिन परेशान करने वाली white noise सुनाई देती थी
  • Linux में PulseAudio की स्थिति देखने के लिए pactl list sinks short का उपयोग किया गया
    • audio sink की स्थिति IDLE, SUSPENDED, RUNNING में से एक के रूप में दिखती है
    • sink SUSPENDED होने पर स्पीकर शांत थे
    • IDLE या RUNNING होने पर असली playback न होने पर भी white noise हो सकती थी
  • /etc/pulse/default.pa और /etc/pulse/system.pa में module-suspend-on-idle लोड था
    • सेटिंग के मुताबिक 10 सेकंड तक निष्क्रिय रहने पर audio sink अपने-आप रुक जाना चाहिए था
    • लेकिन कुछ स्थितियों में sink IDLE में नहीं जाता था, इसलिए SUSPENDED तक भी नहीं पहुँच पाता था

idle audio बिजली क्यों खाता है

  • module-suspend-on-idle कुछ समय तक किसी stream से न जुड़े sink और source को backend से अलग कर देता है
  • इसका मुख्य प्रभाव पावर बचत है
    • अगर PulseAudio idle अवस्था में भी sound card को खाली डेटा भेजता रहे, तो ALSA ज्यादा CPU cycles इस्तेमाल करता है
    • अगर हमेशा active stream बनाए रखने की योजना न हो, तो timer को कम रखना पावर बचत के लिए बेहतर है

वजह Firefox टैब और वेबसाइटों तक सीमित हुई

  • जब भी white noise सुनाई देती थी, pactl list sink-inputs से देखा गया कि कौन-सा प्रोग्राम audio sink का उपयोग कर रहा है
  • वजह हमेशा Firefox ही निकला
    • खुले टैब में ऐसा कोई टैब नहीं था जिसे वास्तव में आवाज़ चलानी चाहिए थी
    • कोई muted वीडियो भी नहीं था
  • i3 status bar में एक छोटा script जोड़ा गया ताकि audio sink RUNNING होते ही लाल संकेत दिखे
  • शुरुआत में pinned टैब के रूप में खुले outlook.office.com के notification sound को कारण माना गया
    • ईमेल आते ही white noise शुरू हो जाती थी
    • टैब refresh करने या Firefox restart करने तक यह बंद नहीं होती थी
  • बाद में दूसरे वेबसाइटों में भी यही व्यवहार मिला
    • x.com में कहीं भी क्लिक करते ही noise शुरू हो जाती थी
    • translate.google.com में अनुवाद की आवाज़ सुनने पर भी noise होती थी
    • Discord वेब ऐप केवल खुला रहने पर भी वही असर दिखाता था

CPU और पावर माप के नतीजे

  • white noise न होने पर pulseaudio का CPU उपयोग 0.0% दिखा
  • उसी माहौल में पावर माप आम तौर पर 4.2~5.1W के बीच था
  • white noise होने पर pulseaudio का CPU उपयोग 4.7% तक बढ़ गया
  • उस समय पावर माप आम तौर पर 5.8~6.7W के बीच था
  • यह अंतर “लगभग कुछ भी नहीं” जैसा नहीं था, बल्कि लगभग 1.5W बढ़ोतरी के रूप में सामने आया

WebAudio API और AudioContext

  • HTML/JavaScript में audio चलाने के तरीके broadly <audio> टैग और WebAudio API में बँटते हैं
  • Outlook जैसे मामलों में, जहाँ आवाज़ dynamically चलाई जाती है, WebAudio API का उपयोग होता है, और audio काम करने से पहले AudioContext बनाना पड़ता है
  • समस्या यह है कि सिर्फ const audioCtx = new AudioContext(); चलाने से भी स्पीकर में white noise आ जाती है
  • टेस्ट पेज के रूप में https://editor.43z.one/sqare/i दिया गया है
  • AudioContext.suspend() audio context में समय की प्रगति रोकता है और audio hardware access अस्थायी रूप से बंद कर CPU/बैटरी उपयोग घटाता है
  • AudioContext.resume() रुके हुए audio context में समय की प्रगति फिर शुरू करता है

Firefox और Chrome का अंतर

  • कई वेबसाइटें तुरंत आवाज़ निकालने की जरूरत न होने पर भी AudioContext बना लेती हैं, और बाद में उसे suspend नहीं करतीं
  • Chrome कुछ समय बाद CPU/बैटरी की बर्बादी अपने-आप रोक देता है
  • Firefox अपने-आप नहीं रुकता और white noise जारी रखने वाली स्थिति में बना रहता है
  • सीधा कारण वेबसाइटें हैं, लेकिन शिकायत यह है कि Firefox इस तरह की resource waste से उपयोगकर्ताओं को बचा नहीं पाता
  • यह भी शक है कि Bluetooth headphones जुड़े होने पर x.com पर क्लिक के बाद white noise भेजना शुरू हो सकता है, जिससे headphones की बैटरी भी बर्बाद हो सकती है

अस्थायी उपाय: AudioContext Suspender

  • समस्या कम करने के लिए एक extension बनाया गया है, जो AudioContext को अपने-आप suspend करने और वेबसाइट द्वारा आवाज़ चलाने की कोशिश पर उसे फिर शुरू करने की कोशिश करता है
  • extension पूरी तरह perfect नहीं है
    • दोबारा शुरू होने में थोड़ा समय लग सकता है
    • audio शुरू करने के कई रास्ते होने के कारण यह हमेशा resume न हो पाए
    • फिर भी बताए गए उपयोग के लिए यह काफी है
  • संबंधित लिंक
  • संबंधित Bugzilla issues

1 टिप्पणियां

 
GN⁺ 2025-02-17
Hacker News की टिप्पणियां
  • यह planned और important है, और संभव हो तो जल्द ठीक करने का इरादा है। यह पहले ही काफी समय से pending है, और अब तक address न हो पाने के लिए माफ़ी। हमेशा priorities की लड़ाई रहती है, इसलिए सभी को समय पर संतुष्ट करना मुश्किल है, लेकिन मेरी personal priority list में यह काफी ऊपर है
    जैसा आप कल्पना कर सकते हैं, कुछ समय तक silence रहने पर AudioContext को pause करने से यह कहीं ज़्यादा जटिल है, लेकिन फिर भी मुझे लगता है कि इसे ठीक किया जा सकता है। क्योंकि दूसरे browsers यह पहले ही कर चुके हैं, और कुछ trade-offs भी हैं जिन्हें स्वीकार किया जा सकता है
    स्रोत: मैंने Firefox में इसके आसपास की बहुत-सी functionality implement की है और Web Audio API standard का editor भी हूं
    • उम्मीद है कि आप ऐसी आलोचना को personally नहीं लेंगे। हाल ही में एक open source maintainer ने ऐसी आलोचना को frustration की तरह लिया और मामला काफी बड़ा हो गया था
      ज़्यादातर लोग यहां बताई गई परिस्थितियां समझते हैं। काम बहुत है और समय सीमित है
      मैंने खुद अनुभव किया है कि Firefox developers high-usage sites को users के लिए सही ढंग से चलाने के लिए expected से ज़्यादा मेहनत करते हैं। जब कोई issue users को प्रभावित करता है तो आप लोग कितनी दूर तक जाते हैं, यह पता है, इसलिए हिम्मत बनाए रखें
    • मैं Firefox का बेहतर user बनना चाहता हूं, इसलिए local पर मिले issues को debug करके देखना चाहता हूं। कहां से शुरू करूं, इस पर guidance चाहिए
  • Websites का actual playback के बिना audio context खोलना शायद bot detection की वजह से होने की संभावना ज्यादा है
    Browser engines और operating systems में audio handling अलग-अलग तरीके से implement होती है, इसलिए पूरी तरह inaudible sound play करके उसे API से फिर record करने पर एक signature बनता है
    उस signature से यह जांचा जा सकता है कि browser user agent spoof कर रहा है या नहीं, headless mode में है या नहीं, या कोई ऐसा odd edge case तो नहीं जहां कोई real user product खरीद नहीं रहा
    https://github.com/fingerprintjs/fingerprintjs/blob/3201a7d6...
    • Browser/web standards वालों ने APIs बहुत बेधड़क बढ़ा दीं, और शायद पर्याप्त रूप से नहीं सोचा कि दुनिया उनका इस तरह abuse करेगी
    • असल में चल रहे bot plugins में से कुछ bot detection को चकमा देने के लिए Audio Context simulate भी करते हैं। पागलपन है
    • अब बस उस दिन का इंतज़ार है जब Cloudflare इसे adopt करेगा, browsing freedom में और बाधा डालेगा और CPU cycles waste करवाएगा
  • इस white noise की वजह से मैं लंबे समय से पागल होने की हालत में था, लेकिन कारण बिल्कुल नहीं मिल रहा था
    Tab में playing icon नहीं दिखता, और tab को mute करने पर भी noise बंद नहीं होता
    Windows volume mixer में Firefox को mute करने पर भी आवाज़ बंद नहीं होती
    सुधार: desktop users के लिए यह extension सच में काफी खराब है। white noise का बार-बार on/off होना उससे कहीं ज़्यादा परेशान करने वाला है
    • अगर Windows volume mixer से Firefox को mute करने पर भी यह नहीं रुकता, तो लगता है यह Firefox से भी नीचे की layer का bug है
    • मैं desktop पर वह extension बिना समस्या के इस्तेमाल कर रहा हूं। लगता है यह आपके visit किए जाने वाले sites पर निर्भर करता है। जो sites बार-बार sound play/stop करती हैं, वहां extension बंद कर देना चाहिए
  • Output idle होने पर digital SPDIF signal sync खो देता है। Playback शुरू होने पर फिर से sync होना instant नहीं होता, और audio का शुरुआती करीब 1 second खो जाता है
    इसलिए मैंने खुद एक program बनाया जो line पर data तो नहीं भेजता, लेकिन output को लगातार open रखता है, ताकि output idle state में न जाए
    हालांकि laptop context में यह ज्यादा समझ नहीं आता, इसलिए वहां energy saving उचित है
    • MacBook पर FiiO K3 DAC इस्तेमाल करते समय यह सच में अंतहीन रूप से परेशान करता था। notification sounds जैसे system sounds delay की वजह से practically play ही नहीं होते थे
      Windows driver में stream को Always On set करने का option है। काश macOS में भी होता
    • मैंने पहले USB DAC पर यही किया था। बस login के समय play -qn & start करा दिया था
  • Android Firefox में कभी-कभी phone का एक दिन में randomly 10GB data खर्च कर देना शायद इससे explain होता है। Mobile bill बेहिसाब आया था
    लगता है कोई news site audio play करते हुए नए ads बार-बार load कर रही थी, और audio की वजह से tab power-saving state में नहीं जा रहा था। Unexpected data charges लगातार आते रहे, इसलिए आखिरकार Chrome पर switch करना पड़ा
  • macOS पर भी मैंने पहले यही या बहुत similar behavior देखा था। पक्का नहीं कि site सच में audio context open रख रही थी या यह Firefox internal issue था। क्योंकि यह Youtube जैसी sites पर भी हुआ था, जो Web Audio API इस्तेमाल नहीं करतीं
    यानी white noise नहीं था, लेकिन audio की वजह से power usage था: https://bugzilla.mozilla.org/show_bug.cgi?id=1821102
    अभी भी Mac पर कुछ भी play नहीं हो रहा, फिर भी coreaudiod CPU का 20% इस्तेमाल कर रहा है। यह battery life सच में खराब कर रहा है, इसलिए fix होने तक किसी दूसरे browser पर जाने का मन है, लेकिन ऐसी छोटी दिखने वाली चीज़ की वजह से Firefox छोड़ना नहीं चाहता
    Update: related है, लेकिन अलग bug लगता है
  • Chromium में इस suspend को handle करने वाला code यहां है:
    https://source.chromium.org/chromium/chromium/src/+/main:med...
    मूल रूप से, करीब 30 seconds की silence detect होने पर यह operating system audio device-backed sink से null sink पर switch कर देता है
    संदर्भ के लिए, यह approach audio device से अलग clock इस्तेमाल करती है, इसलिए कुछ reports आई हैं कि context को बाद में सच में इस्तेमाल करने पर कुछ tones में distortion होता है। workaround यह है कि site article में mentioned suspend/resume API का इस्तेमाल करे
  • audioContext internally कैसे implement होता है, इसके details नहीं जानता, लेकिन लगता है कि इसमें काफी clever और dynamic handling करने वाली चीज़ें शामिल हैं। Notification sound play करना img href *.svg के बजाय D3 से SVG draw करने जैसा लगता है
    सोच रहा हूं कि क्या notification handler जैसी simple और repeatable चीज़ों को किसी lower-level efficient API में register करने के लिए कोई Service Worker hook जैसा कुछ है
  • क्या सच में कुछ सुनाई देना चाहिए?
    MacOS के Firefox 134.0.1 में मुझे कोई आवाज़ नहीं सुनाई देती
    • मेरी तरफ भी sound नहीं आता, लेकिन author के demo page पर sound play button दबाने पर power consumption करीब 1W बढ़ जाता है
    • Android Firefox में हल्का white noise सुनाई देता है
  • इससे https://www.dr.dk/ के front page की समस्या ठीक हो गई