6 poin oleh GN⁺ 2025-02-17 | 1 komentar | Bagikan ke WhatsApp
  • Saat menelusuri white noise pada laptop Linux, terungkap masalah bahwa tab Firefox terus membuat sink audio PulseAudio tetap aktif meski tidak ada suara nyata
  • module-suspend-on-idle telah dikonfigurasi untuk menghentikan perangkat audio setelah 10 detik, tetapi ketika situs web membuat AudioContext, sink tidak turun ke IDLE/SUSPENDED
  • Fenomena yang sama muncul pada notifikasi web Outlook, klik di x.com, pemutaran suara Google Translate, dan aplikasi web Discord; bahkan new AudioContext() saja sudah memulai noise
  • Dalam pengukuran, saat tidak ada noise penggunaan CPU pulseaudio adalah 0,0%, tetapi saat ada noise menjadi 4,7%, dan daya sistem naik sekitar 1,5W
  • AudioContext.suspend() dapat menghentikan akses ke hardware audio dan mengurangi penggunaan CPU/baterai, tetapi Firefox tidak otomatis menghentikan pemborosan setelah beberapa waktu seperti Chrome

Masalah sink audio yang tidak tidur

  • Pada laptop baru, bahkan saat musik atau audio tidak diputar, terdengar white noise yang samar tetapi mengganggu dari speaker
  • Untuk memeriksa status PulseAudio di Linux, digunakan pactl list sinks short
    • Status sink audio muncul sebagai salah satu dari IDLE, SUSPENDED, atau RUNNING
    • Saat sink berada di SUSPENDED, speaker senyap
    • Saat IDLE atau RUNNING, white noise bisa muncul meski tidak ada suara yang benar-benar diputar
  • Di /etc/pulse/default.pa dan /etc/pulse/system.pa, module-suspend-on-idle telah dimuat
    • Berdasarkan konfigurasi, sink audio seharusnya otomatis dihentikan jika tidak aktif selama 10 detik
    • Namun dalam beberapa situasi, sink tidak masuk ke IDLE sehingga juga tidak bisa mencapai SUSPENDED

Mengapa audio idle mengonsumsi daya

  • module-suspend-on-idle memutus sink dan source yang tidak terhubung ke stream selama jangka waktu tertentu dari backend
  • Efek utamanya adalah penghematan daya
    • Jika PulseAudio mengirim data kosong ke sound card meski dalam keadaan idle, ALSA menggunakan lebih banyak siklus CPU
    • Jika tidak berencana mempertahankan stream yang selalu aktif, mengatur timer lebih rendah lebih menguntungkan untuk penghematan daya

Penyebab dipersempit ke tab Firefox dan situs web

  • Setiap kali white noise terdengar, pactl list sink-inputs digunakan untuk memeriksa program mana yang memakai sink audio
  • Penyebabnya selalu Firefox
    • Tidak ada tab terbuka yang seharusnya memutar suara nyata
    • Tidak ada video yang di-mute
  • Sebuah skrip kecil ditambahkan ke status bar i3 agar menampilkan penanda merah ketika sink audio menjadi RUNNING
  • Awalnya, bunyi notifikasi dari outlook.office.com yang dibuka sebagai tab tetap tampak seperti penyebabnya
    • Saat menerima email, white noise mulai muncul
    • Tidak berhenti sampai tab di-refresh atau Firefox di-restart
  • Setelah itu, fenomena yang sama juga dikonfirmasi di situs web lain

Hasil pengukuran CPU dan daya

  • Saat tidak ada white noise, penggunaan CPU pulseaudio ditampilkan sebagai 0,0%
  • Dalam lingkungan yang sama, nilai pengukuran daya umumnya berada di kisaran 4,2–5,1W
  • Saat ada white noise, penggunaan CPU pulseaudio naik menjadi 4,7%
  • Pada saat itu, nilai pengukuran daya umumnya berada di kisaran 5,8–6,7W
  • Perbedaannya bukan “nyaris tidak berarti”, dan dapat dirangkum sebagai kenaikan sekitar 1,5W

WebAudio API dan AudioContext

  • Cara memutar audio di HTML/JavaScript terbagi menjadi dua: tag <audio> dan WebAudio API
  • Untuk kasus pemutaran suara secara dinamis seperti Outlook, digunakan WebAudio API, dan untuk melakukan pekerjaan audio harus membuat AudioContext terlebih dahulu
  • Masalahnya, hanya dengan menjalankan const audioCtx = new AudioContext();, white noise sudah muncul dari speaker
  • Halaman uji disediakan di https://editor.43z.one/sqare/i
  • AudioContext.suspend() menghentikan progres waktu audio context dan menangguhkan akses ke hardware audio, sehingga mengurangi penggunaan CPU/baterai
  • AudioContext.resume() memulai kembali progres waktu audio context yang dihentikan

Perbedaan Firefox dan Chrome

  • Banyak situs web membuat AudioContext meski tidak perlu segera mengeluarkan suara, lalu setelah itu tidak melakukan suspend
  • Chrome otomatis menghentikan pemborosan CPU/baterai setelah beberapa waktu
  • Firefox tidak berhenti secara otomatis dan tetap mempertahankan kondisi yang terus menghasilkan white noise
  • Situs web memang menjadi penyebab langsung, tetapi masih ada keluhan bahwa Firefox gagal melindungi pengguna dari pemborosan resource seperti ini
  • Ada dugaan bahwa ketika headphone Bluetooth terhubung, setelah klik di x.com transmisi white noise juga mulai terjadi dan dapat memboroskan baterai headphone

Penanganan sementara: AudioContext Suspender

1 komentar

 
GN⁺ 2025-02-17
Komentar Hacker News
  • Ini sudah direncanakan dan penting, dan akan diperbaiki segera jika memungkinkan. Ini memang sudah lama tertunda, dan maaf karena belum tertangani. Ini selalu soal perebutan prioritas, jadi sulit memuaskan semua pihak tepat waktu, tetapi di daftar prioritas pribadi saya posisinya cukup tinggi
    Seperti yang bisa dibayangkan, ini jauh lebih rumit daripada sekadar menjeda AudioContext setelah beberapa waktu hening, tetapi saya rasa tetap bisa diperbaiki. Alasannya, browser lain sudah melakukannya, dan ada kompromi yang bisa diterima
    Sumber: saya banyak mengimplementasikan fitur di sekitar ini di Firefox dan juga editor standar Web Audio API
    • Saya harap kritik seperti ini tidak dianggap secara pribadi. Baru-baru ini ada seorang maintainer open source yang menerima kritik seperti ini sebagai rasa frustrasi lalu situasinya meledak besar
      Sebagian besar orang memahami kondisi yang dijelaskan di sini. Banyak yang harus dikerjakan dan waktu terbatas
      Saya sendiri pernah mengalami bahwa developer Firefox berusaha melampaui ekspektasi agar situs yang banyak dipakai berjalan dengan benar untuk pengguna. Saya tahu sejauh apa mereka akan bergerak ketika masalah berdampak pada pengguna, jadi semoga tetap semangat
    • Saya ingin menjadi pengguna Firefox yang lebih baik, jadi ingin mencoba men-debug masalah yang saya temukan secara lokal. Perlu panduan tentang dari mana sebaiknya mulai
  • Situs web membuka audio context tanpa benar-benar memutar audio kemungkinan besar karena deteksi bot
    Karena tiap mesin browser dan sistem operasi mengimplementasikan pemrosesan audio secara berbeda, jika memutar suara yang sepenuhnya tidak terdengar lalu merekamnya kembali melalui API, akan muncul sebuah signature
    Dengan signature itu bisa diperiksa apakah browser memalsukan user agent, berjalan dalam mode headless, atau berbagai kasus aneh lain yang bukan situasi pengguna sungguhan sedang membeli produk
    https://github.com/fingerprintjs/fingerprintjs/blob/3201a7d6...
    • Pihak browser/standar web sepertinya terlalu sembarangan menambah API, dan kurang memikirkan bahwa dunia akan menyalahgunakannya dengan cara seperti ini
    • Di antara plugin bot yang benar-benar beredar, sudah ada yang mensimulasikan Audio Context untuk mengecoh deteksi bot. Ini gila
    • Saya sudah tidak sabar menunggu hari ketika Cloudflare mengadopsi ini, semakin menghambat kebebasan browsing dan membuat siklus CPU terbuang
  • White noise ini sudah lama membuat saya hampir gila, tetapi sama sekali tidak bisa menemukan penyebabnya
    Tidak ada ikon sedang memutar di tab, dan meski tab di-mute, bunyinya tidak berhenti
    Meski Firefox di-mute lewat Windows Volume Mixer, suaranya tetap tidak berhenti
    Koreksi: untuk pengguna desktop, ekstensi ini sebenarnya cukup buruk. White noise yang terus menyala dan mati justru jauh lebih mengganggu
    • Kalau mem-mute Firefox lewat Windows Volume Mixer pun tidak menghentikannya, rasanya ini bug di lapisan yang lebih dalam daripada Firefox
    • Saya memakai ekstensi itu di desktop tanpa masalah. Sepertinya tergantung situs yang dikunjungi. Untuk situs yang sering memutar/menghentikan suara, mungkin tinggal matikan ekstensinya
  • Saat output menjadi idle, sinyal digital SPDIF kehilangan sinkronisasi. Saat pemutaran dimulai lagi, sinkronisasi ulang tidak terjadi seketika, dan sekitar 1 detik pertama audio hilang
    Jadi saya membuat sendiri program yang tidak mengalirkan data ke line, tetapi tetap membiarkan output terbuka agar output tidak masuk ke kondisi idle
    Namun dalam konteks laptop ini kurang masuk akal, jadi penghematan energi memang tepat di sana
    • Saat memakai DAC FiiO K3 di MacBook, ini benar-benar mengganggu tanpa henti. Suara sistem seperti notifikasi pada dasarnya tidak terputar karena delay
      Di driver Windows ada opsi untuk mengatur stream menjadi Always On. Andai ada juga di macOS
    • Dulu saya melakukan hal yang sama pada USB DAC. Hanya saja saya membuat play -qn & dijalankan saat login
  • Rasanya ini menjelaskan masalah di Android Firefox ketika ponsel kadang secara acak menghabiskan 10GB data dalam sehari. Tagihan operator jadi tidak masuk akal
    Sepertinya sebuah situs berita memutar audio sambil berulang-ulang memuat iklan baru, dan karena audio itu tab tidak masuk mode hemat daya. Karena terus muncul biaya data tak terduga, akhirnya saya harus pindah ke Chrome
  • Di macOS dulu saya juga pernah melihat fenomena yang sama atau sangat mirip. Saya tidak yakin apakah situs benar-benar membiarkan audio context terbuka, atau ini masalah internal Firefox. Sebab ini juga terjadi di situs seperti Youtube yang tidak memakai Web Audio API
    Artinya tidak ada white noise, tetapi ada konsumsi daya akibat audio: https://bugzilla.mozilla.org/show_bug.cgi?id=1821102
    Bahkan sekarang di Mac, saat tidak ada apa pun yang diputar, coreaudiod memakai CPU 20%. Ini benar-benar merusak daya tahan baterai, jadi saya sempat berpikir pindah ke browser lain sampai diperbaiki, tetapi saya tidak ingin meninggalkan Firefox hanya karena hal yang tampak sepele seperti ini
    Pembaruan: sepertinya terkait, tetapi merupakan bug yang berbeda
  • Kode yang menangani penjedaan ini di Chromium ada di sini:
    https://source.chromium.org/chromium/chromium/src/+/main:med...
    Pada dasarnya, setelah mendeteksi keheningan sekitar 30 detik, ia beralih dari sink yang didukung perangkat audio sistem operasi ke null sink
    Sebagai catatan, karena cara ini memakai clock yang berbeda dari perangkat audio, beberapa kali ada laporan bahwa distorsi muncul pada nada tertentu ketika context kemudian benar-benar dipakai. Solusinya adalah situs memakai suspend/resume API yang disebutkan dalam artikel
  • Saya tidak tahu detail bagaimana audioContext diimplementasikan secara internal, tetapi tampaknya ada banyak elemen yang mencoba menanganinya secara cukup cerdas dan dinamis. Memutar suara notifikasi terasa mirip seperti menggambar SVG dengan D3 alih-alih img href *.svg
    Saya penasaran apakah ada semacam hook Service Worker untuk mendaftarkan hal-hal sederhana dan berulang seperti handler notifikasi ke API lapisan lebih rendah yang efisien
  • Apakah seharusnya benar-benar ada sesuatu yang terdengar?
    Di Firefox 134.0.1 pada MacOS, saya tidak mendengar suara apa pun
    • Di sisi saya juga tidak ada suara, tetapi ketika menekan tombol putar suara di halaman demo penulis, konsumsi daya naik sekitar 1W
    • Di Android Firefox terdengar white noise kecil
  • Ini memperbaiki masalah halaman depan https://www.dr.dk/