6 คะแนน โดย GN⁺ 2025-02-17 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • การค้นพบปัญหา: พบปัญหาที่ลำโพงของโน้ตบุ๊กเครื่องใหม่มีเสียง white noise ดังเป็นช่วง ๆ ได้ยินเฉพาะในห้องที่เงียบเท่านั้น

  • การวิเคราะห์สาเหตุ: เมื่อตรวจสอบสถานะ audio sink ของ PulseAudio พบว่าในสถานะ SUSPENDED จะไม่มีเสียง แต่ในสถานะ IDLE หรือ RUNNING จะเกิดเสียง white noise

  • ปัญหาของ Firefox: พบว่า Firefox เป็นโปรแกรมที่กำลังใช้งาน audio sink และแม้ในแท็บที่เปิดอยู่จะไม่มีแท็บไหนเล่นเสียงอยู่ ก็ยังเกิดเสียง white noise

  • สาเหตุ: พบว่าเสียงแจ้งเตือนของ outlook.office.com เป็นต้นเหตุของปัญหา ทุกครั้งที่มีอีเมลเข้าจะเริ่มเกิดเสียง white noise และจะหยุดได้ก็ต่อเมื่อรีเฟรชแท็บหรือรีสตาร์ต Firefox

  • การใช้แบตเตอรี่: เมื่อเกิดเสียง white noise การใช้ CPU และการกินแบตเตอรี่จะเพิ่มขึ้น

  • ความพยายามแก้ปัญหา: พยายามแก้ปัญหาด้วยการปิดการแจ้งเตือนอีเมล แต่พบว่าเว็บไซต์อื่นก็มีปัญหาคล้ายกัน

  • การจัดการเสียงด้วย 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 แล้วไม่เล่นอะไรเลย มีโอกาสสูงว่าอาจกำลังทำ bot detection

    • เอนจินเบราว์เซอร์และระบบปฏิบัติการแต่ละตัวติดตั้งการประมวลผลเสียงต่างกัน หากเล่นเสียงที่ไม่ได้ยินเลยแล้วอัดกลับมา จะได้ลายเซ็นขึ้นมา
    • สามารถใช้ลายเซ็นนี้เพื่อตรวจสอบได้ว่าเบราว์เซอร์กำลังโกหกเกี่ยวกับ user agent หรือไม่, กำลังรันใน headless mode หรือไม่, และเป็นผู้ใช้จริงหรือไม่
  • สงสัยว่าปัญหาเดียวกันนี้เกิดบนอุปกรณ์ Android ด้วยหรือไม่

  • white noise นี้ทำให้ผมหงุดหงิดมานานมาก แต่ตามต้นตอไม่เจอ

    • ไม่มีไอคอน "กำลังเล่น" แสดงบนแท็บ และต่อให้ปิดเสียงแท็บ เสียงรบกวนก็ไม่หยุด
    • ต่อให้ใช้ Windows volume mixer ปิดเสียง Firefox เสียงรบกวนก็ยังไม่หยุด
    • แก้ไข: สำหรับผู้ใช้เดสก์ท็อป white noise เริ่ม/หยุดอยู่เรื่อย ๆ น่ารำคาญมาก
  • เมื่อเอาต์พุตว่างอยู่ สัญญาณดิจิทัล SPDIF จะสูญเสียการซิงก์ พอเริ่มเล่นก็ต้องใช้เวลาซิงก์ใหม่ ทำให้เสียงช่วงไม่กี่วินาทีแรกหายไป ผมจึงเขียนโปรแกรมที่เปิดเอาต์พุตค้างไว้โดยไม่ทิ้งข้อมูลลงในสาย เพื่อไม่ให้เอาต์พุตเข้าสู่สถานะว่าง

    • แต่บนโน้ตบุ๊ก การประหยัดพลังงานสำคัญกว่า
  • นี่น่าจะอธิบายปัญหาที่บางครั้ง Firefox บน Android ทำให้โทรศัพท์ใช้ข้อมูลถึง 10GB ต่อวันได้ เว็บข่าวเล่นเสียงและโหลดโฆษณาซ้ำ ๆ และแท็บก็ไม่เข้าสู่โหมดประหยัดพลังงานเพราะเสียง สุดท้ายต้องย้ายไปใช้ Chrome เพราะค่าเน็ตที่เพิ่มขึ้นซ้ำ ๆ

  • โค้ดใน Chromium ที่จัดการการขัดจังหวะนี้อยู่ที่นี่

    • โดยพื้นฐานแล้วจะตรวจจับความเงียบราว 30 วินาที แล้วสลับจาก sink ที่รองรับโดยอุปกรณ์เสียงของ OS ไปเป็น null sink
    • หมายเหตุ: เนื่องจากใช้สัญญาณนาฬิกาคนละตัวกับอุปกรณ์เสียง เมื่อมีการใช้ context ในภายหลังอาจเกิดความเพี้ยนในบางโทนเสียง วิธีแก้คือให้เว็บไซต์ใช้ suspend resume API ที่กล่าวถึงในบทความ
  • พบปัญหาคล้ายกันบน macOS เช่นกัน (การใช้พลังงานจากเสียง, ไม่มี white noise)

    • ตอนนี้ coreaudiod บน Mac ของผมใช้ CPU 20% ทั้งที่ไม่ได้เล่นอะไรเลย คงต้องย้ายไปใช้เบราว์เซอร์อื่นจนกว่าปัญหานี้จะถูกแก้ แต่ก็ไม่อยากเลิกใช้ Firefox
    • อัปเดต: ดูเหมือนจะเป็นบั๊กที่เกี่ยวข้องกัน แต่เป็นคนละตัว
  • ปัญหานี้แก้ไขหน้าแรกของ https://www.dr.dk/

  • ผมไม่ค่อยรู้ว่า audioContext ติดตั้งอย่างไร แต่ดูฉลาดและไดนามิกมาก การเล่นเสียงแจ้งเตือนก็เหมือนการวาด SVG ด้วย D3 เลย เลยสงสัยว่ามี serviceWorker hook ใน API ที่มีประสิทธิภาพกว่านี้ไหม ที่ให้ลงทะเบียนงานซ้ำ ๆ แบบง่าย ๆ เช่น notification handler ได้