6 ポイント 投稿者 GN⁺ 2025-02-17 | 1件のコメント | WhatsAppで共有
  • 問題の発見: 新しいノートPCで、スピーカーから断続的にホワイトノイズが発生する問題を見つけた。静かな部屋でのみ聞こえるものだった。

  • 原因の分析: PulseAudio のオーディオシンク状態を確認した結果、SUSPENDED 状態では音は出ないが、IDLE または RUNNING 状態ではホワイトノイズが発生することを突き止めた。

  • Firefoxの問題: Firefox がオーディオシンクを使用しているプログラムとして表示され、開いているタブの中に音を再生しているものがないにもかかわらず、ホワイトノイズが発生していた。

  • 原因: outlook.office.com の通知音が問題の原因であることが判明した。メールを受信するたびにホワイトノイズが始まり、タブを再読み込みするか Firefox を再起動しないと止まらなかった。

  • バッテリー消耗: ホワイトノイズが発生している間は、CPU とバッテリーの消費が増加した。

  • 解決策の試行: メール通知を無効化して問題を解決しようとしたが、他のWebサイトでも似た問題が発生した。

  • HTML/JavaScript のオーディオ処理: オーディオを再生する方法としては `` タグと WebAudio API がある。問題の原因は AudioContext を生成するときに発生することが確認された。

  • FirefoxとChromeの違い: Chrome は一定時間が経つとバッテリーや CPU の浪費を自動的に止めるが、Firefox はそうではない。

  • 解決策: AudioContext を自動的に停止し、必要なときに再開する拡張機能を開発した。完璧ではないが、十分に効果的である。

1件のコメント

 
GN⁺ 2025-02-17
Hacker Newsのコメント
  • この問題は計画済みで重要。まもなく修正予定。優先順位の問題でまだ直っていないことを謝罪する。個人的には優先度が高い

    • Audio Context を一定時間後に停止するより複雑だが、解決は可能。他の人たちが実装しているので可能。妥協する用意はある
    • 出典: Firefox 実装者および Web Audio API 標準エディタ
  • Audio Context を開いて何も再生しないウェブサイトは、おそらくボット検出をしている可能性がある

    • 他のブラウザエンジンや OS はオーディオ処理を異なる方法で実装している。まったく聞こえない音を再生して再録音すると、シグネチャが生成される
    • このシグネチャを使って、ブラウザがユーザーエージェントについて嘘をついているか、ヘッドレスモードで動作しているか、実際のユーザーではないかを確認できる
  • 同じ問題が Android デバイスでも発生するのか気になる

  • このホワイトノイズには長い間悩まされていたが、原因を突き止められなかった

    • タブに「再生中」アイコンが表示されず、タブをミュートしてもノイズは止まらない
    • Windows のボリュームミキサーで Firefox をミュートしてもノイズは止まらない
    • 編集: デスクトップユーザーにとっては、ホワイトノイズが何度も開始・停止して非常にいら立たしい
  • 出力がアイドル状態になると、デジタル SPDIF 信号は同期を失う。再生が始まると再同期に時間がかかり、最初の数秒の音声を失うことになる。出力をアイドル状態にしないために、データをラインに流さずに出力を開いたままにするプログラムを書いた

    • ノートPCでは省電力のほうが重要
  • Android Firefox で、ときどきスマートフォンが1日に 10GB のデータを消費する問題の説明になるかもしれない。ニュースサイトが音声を再生し、広告を繰り返し読み込み、タブがオーディオのせいでスリープ状態に入らなかった。繰り返し発生するデータ料金のせいで Chrome に乗り換えなければならなかった

  • Chromium でこの中断を処理するコードはここにある

    • 基本的に、約30秒の無音を検出した後、OS のオーディオデバイスがサポートするシンクから null シンクに切り替える
    • 参考: オーディオデバイスとは別のクロックを使うため、コンテキストが最終的に使われる際に特定のトーンで歪みが発生することがある。回避策は、サイトが記事で言及されている suspend resume API を使うこと
  • macOS でも似た問題を見つけた(オーディオ起因の電力消費、ホワイトノイズなし)

    • 現在、Mac の coreaudiod が何も再生していないのに CPU の 20% を使用している。この問題が解決するまでは別のブラウザに切り替えるつもりだが、Firefox を手放したくはない
    • 更新: 関連はあるが別のバグのようだ
  • この問題により https://www.dr.dk/ のトップページが修正された

  • audioContext の実装方法はよく分からないが、非常に賢く動的だ。通知音を再生することは、D3 で SVG を描くのに似ている。より効率的な API で、通知ハンドラのような単純な繰り返し処理を登録できる serviceWorker フックがあるのか気になる