ปริมาณเสียง

Android 14 รองรับปริมาณการรับเสียงในเฟรมเวิร์กเสียงและ HAL ด้านเสียงโดยการตรวจสอบการวัดปริมาณการรับเสียงอย่างต่อเนื่อง และออกคำเตือนแก่ผู้ใช้เกี่ยวกับระดับการรับเสียงที่อาจเป็นอันตราย

ปริมาณเสียงคือการวัดระดับความดันเสียงในช่วงระยะเวลาหนึ่ง การตรวจสอบปริมาณเสียงจะช่วยปกป้องผู้ใช้จากผลเสียที่เกิดจาก การสัมผัสเสียงมากเกินไปหรือเป็นเวลานาน ซึ่งจะช่วยให้การป้องกันการได้ยินดีขึ้น เมื่อใช้หูฟังในอุปกรณ์ Android แบบพกพา และลดโอกาสที่ การได้ยินจะบกพร่อง

มาตรฐานใหม่สำหรับอุปกรณ์การฟังที่ปลอดภัยเป็นไปตามข้อกำหนดด้านกฎระเบียบ สำหรับการป้องกันการได้ยินใน IEC62368-1 ฉบับที่ 3 (ต้องเข้าสู่ระบบ) และ EN50332-3 (จำกัดการเข้าถึงสำหรับสมาชิก) ซึ่งนำเสนอแนวคิดเกี่ยวกับปริมาณเสียง

ฟังก์ชันปริมาณเสียงช่วยให้ OEM ปฏิบัติตามกฎระเบียบใหม่ด้านความปลอดภัยในการฟังได้ หากต้องการรองรับปริมาณเสียงที่ปลอดภัย OEM ต้องปฏิบัติตามข้อกำหนดของอินเทอร์เฟซและกฎระเบียบ สำหรับการปรับแต่งและการรับรองทั้งหมด การติดตั้งใช้งาน OEM ที่ปรับแต่งแล้ว สามารถข้ามหรือแก้ไขการติดตั้งใช้งานปริมาณเสียงเริ่มต้นของ AOSP ได้ อย่างไรก็ตาม เราขอแนะนำอย่างยิ่งให้ใช้การติดตั้งใช้งาน AOSP

การคำนวณปริมาณเสียง

มาตรฐานใน IEC62368-1 ฉบับที่ 3 และ EN50332-3 ช่วยเพิ่มความแม่นยำในการ วัดปริมาณการรับเสียงโดยการคำนวณปริมาณการรับเสียงที่คำนวณแล้ว (CSD) CSD คำนวณโดยการรวมระดับการสัมผัสชั่วขณะ (MEL) เมื่อเวลาผ่านไป ระบบจะรักษากรอบเวลาแบบต่อเนื่อง 7 วันของค่า CSD ที่สะสมไว้สำหรับการคำนวณปริมาณเสียง

ตามส่วนที่ 10.6.3.2 ของ IEC62368-1 ฉบับที่ 3 หากค่า CSD ถึงขีดจำกัด 100% ระบบ จะแจ้งเตือนผู้ใช้เกี่ยวกับระดับเสียงทุกครั้งที่เพิ่มขึ้น 100% หากผู้ใช้ไม่รับทราบคำเตือน ระบบจะลดระดับเสียงลงเป็นค่าแหล่งพลังงานรังสี (RS1) ที่กำหนดไว้ล่วงหน้าของตารางที่ 39 ของ IEC62368-1

ตามที่ระบุไว้ในส่วน 10.6.3.3 ของ IEC62368-1 ฉบับที่ 3 พร้อมกับคำเตือนเกี่ยวกับปริมาณเสียงสะสม ระบบต้องเริ่มคำเตือนตามการสัมผัสทุกครั้งที่ค่า MEL เกินค่าแหล่งพลังงานรังสีคลาส 2 (RS2) ของตาราง 39 ของ IEC62368-1

สำหรับการรับรองตามกฎระเบียบเหล่านี้และเพื่อให้ค่า CSD มีความเกี่ยวข้องมากขึ้น ระบบต้องใช้ค่าเอาต์พุตที่ถูกต้องตามที่ผู้ใช้รับรู้ (เช่น เอาต์พุตการเล่นสื่อ) การคำนวณ CSD ควรใช้ค่าที่ใกล้เคียงกับระดับความดันเสียงจริงที่ผู้ใช้ได้รับ

สถาปัตยกรรม

ลักษณะฮาร์ดแวร์และเอฟเฟกต์ของทรานสดิวเซอร์อาจส่งผลต่อระดับพลังงานของเฟรมที่เรนเดอร์ ทั้งนี้ขึ้นอยู่กับตำแหน่งที่จับภาพเฟรม เราได้ขยาย HAL เพื่อให้ได้ค่า MEL โดยตรงจากฮาร์ดแวร์พื้นฐานและพิจารณาเอฟเฟกต์ที่อาจเกิดขึ้นซึ่งใช้โดยตัวประมวลสัญญาณดิจิทัล (DSP) หรือคุณสมบัติของลำโพง เช่น อิมพีแดนซ์ ความไว และการตอบสนองความถี่ เพื่อให้ได้การวัดระดับความดันเสียงเอาต์พุตที่แม่นยำ

หาก HAL ระบุค่า MEL ไม่ได้ เฟรมเวิร์กเสียงจะวิเคราะห์และคำนวณ CSD เป็นกลไกสำรอง การคำนวณนี้ในเฟรมเวิร์กเสียงจะ อิงตามข้อมูลเกี่ยวกับเอาต์พุตที่แสดงผลซึ่งรายงานจาก HAL และเฟรม ที่ส่งไปยัง DSP เสียง

Sound Dose มี 2 องค์ประกอบ ได้แก่ SoundDoseHelper และ SoundDoseManager, ดังที่แสดงในรูปที่ 1

sound_dose_arch

รูปที่ 1 องค์ประกอบทางสถาปัตยกรรมของฟีเจอร์ปริมาณเสียง

SoundDoseHelper

คลาส SoundDoseHelper ซึ่งอยู่ในกระบวนการ systemserver เป็นจุดรวบรวมหลักสำหรับข้อมูลการให้ยาเสียงที่เกี่ยวข้องทั้งหมด คลาส AudioService จัดการคลาส SoundDoseHelper

SoundDoseHelper คลาสมีหน้าที่รับผิดชอบในเรื่องต่อไปนี้

  • การจัดการข้อมูลขนาดยาใหม่
  • การคงค่าปริมาณเสียงสะสม
  • การกู้คืนสถานะในกรณีที่ audioserver ขัดข้อง
  • การเรียกให้แสดงการแจ้งเตือน UI ของระบบ
  • การลดระดับเสียง

SoundDoseManager

คลาส SoundDoseManager ซึ่งอยู่ในกระบวนการ audioserver และเป็นส่วนหนึ่งของคลาส AudioFlinger จะรวบรวมข้อมูลปริมาณเสียงจาก HAL หรือคำนวณข้อมูลดังกล่าวภายในเป็นทางเลือกสำรองจากเฟรมที่ส่งไปยัง HAL SoundDoseManager คลาสจะส่ง ข้อมูลปริมาณเสียงไปยังคลาส SoundDoseHelper

MelProcessor และ MelAggregator

หาก HAL ระบุค่า MEL ไม่ได้ ระบบจะใช้ยูทิลิตี MelProcessor และ MelAggregator ใน libaudioutils เพื่อคำนวณปริมาณเสียงภายใน

ในMelProcessor คลาส การคำนวณหลักจะดำเนินการในบัฟเฟอร์ที่มี ตัวอย่างเสียงโดยการเรียกใช้ MelProcessor::process(const void* buffer, size_t bytes) OEM สามารถใช้ MelProcessor ในการติดตั้งใช้งาน HAL ได้หากจำเป็น

คลาส MelAggregator จะรับค่า MEL จากพอร์ตเสียงต่างๆ และ คำนวณค่า CSD โดยใช้หน้าต่างแบบเลื่อน 7 วัน เมธอด MelAggregator::aggregateAndAddNewMelRecord_l(MelRecord mel) จะเรียกใช้ตรรกะ ระบบจะส่งผลลัพธ์ไปยังคลาส SoundDoseManager เพื่อ สื่อสารกับ AudioService

การใช้งาน

ส่วนขยายอินเทอร์เฟซ HIDL จะเลิกใช้งานตั้งแต่ Android 14 ดังนั้นอินเทอร์เฟซ HAL ใหม่สำหรับการดึงค่า MEL ที่คำนวณแล้วและการออกคำเตือนเรื่องการสัมผัส ที่ชื่อ ISoundDose จึงได้รับการกำหนดให้เป็นส่วนหนึ่งของ AIDL Audio HAL อย่างไรก็ตาม สำหรับผู้ติดตั้งใช้งานที่ต้องการเวลาเพิ่มเติมในการผสานรวม AIDL Audio HAL เรามี AIDL HAL สำหรับปริมาณเสียงแบบสแตนด์อโลน ซึ่งมีอินเทอร์เฟซ ISoundDoseFactory ซึ่งจะ เลิกใช้งานในอนาคต

วิธีการ HAL สำหรับการรองรับปริมาณเสียงจะแสดงในตัวอย่างโค้ดต่อไปนี้

/**
 * This interface provides functions related to sound exposure control required for compliance to
 * EN/IEC 62368-1 3rd edition. Implementing this interface is mandatory for devices for which
 * compliance to this standard is mandated and implementing audio offload decoding or other direct
 * playback paths where volume control happens below the audio HAL.
 */
@VintfStability
interface ISoundDose {
    /**
     * Max value in dBA used for momentary exposure warnings as defined by IEC62368-1
     * 3rd edition. This value represents the default RS2 upper bound.
     */
    const int DEFAULT_MAX_RS2 = 100;
    /** Min value of the RS2 threshold in dBA as defined by IEC62368-1 3rd edition. */
    const int MIN_RS2 = 80;

    /**
     * Sets the RS2 upper bound used for momentary exposure warnings. Default value is
     * DEFAULT_MAX_RS2 as specified in IEC62368-1 3rd edition.
     *
     * @param rs2ValueDbA custom RS2 upper bound to use
     * @throws EX_ILLEGAL_ARGUMENT if rs2ValueDbA is greater than DEFAULT_MAX_RS2 or lower
     *                             than MIN_RS2
     */
    void setOutputRs2UpperBound(float rs2ValueDbA);

    /**
     * Gets the RS2 upper bound used for momentary exposure warnings.
     *
     * @return the RS2 upper bound in dBA
     */
    float getOutputRs2UpperBound();

    /**
     * Registers the HAL callback for sound dose computation. If sound dose is supported
     * the MEL values and exposure notifications will be received through this callback
     * only. The internal framework MEL computation will be disabled.
     * It is not possible to unregister the callback. The HAL is responsible to provide
     * the MEL values throughout its lifecycle.
     *
     * @param callback to use when new updates are available for sound dose
     */
    void registerSoundDoseCallback(in IHalSoundDoseCallback callback);

    @VintfStability
    oneway interface IHalSoundDoseCallback {
        /**
         * Called whenever the current MEL value exceeds the set RS2 upper bound.
         *
         * @param currentDbA the current MEL value which exceeds the RS2 upper bound
         * @param audioDevice the audio device where the MEL exposure warning was recorded
         */
        void onMomentaryExposureWarning(float currentDbA, in AudioDevice audioDevice);

        @VintfStability
        parcelable MelRecord {
            /**
             * Array of continuously recorded MEL values >= MIN_RS2 (1 per second).
             * First value in the array was recorded at 'timestamp'.
             */
            float[] melValues;
            /**
             * Corresponds to the time in seconds, as reported by CLOCK_MONOTONIC, when
             * the first MEL entry in melValues was recorded. The timestamp values have
             * to be consistent throughout all audio ports, equal timestamp values will
             * be aggregated.
             */
            long timestamp;
        }

        /**
         * Provides a MelRecord containing continuous MEL values sorted by timestamp.
         * Note that all the MEL values originate from the audio device specified by audioDevice.
         * In case values from multiple devices need to be reported, the caller should execute
         * this callback once for every device.
         *
         * @param melRecord contains the MEL values used for CSD
         * @param audioDevice the audio device where the MEL values were recorded
         */
        void onNewMelValues(in MelRecord melRecord, in AudioDevice audioDevice);
    }
}

อินเทอร์เฟซ HAL ใหม่ใช้การเรียกกลับ ที่แจ้งให้เฟรมเวิร์กทราบเกี่ยวกับการเปิดรับแสงชั่วขณะและให้ค่า MEL เมื่อใดก็ตามที่ระดับเอาต์พุตสูงกว่า RS1 เมื่อมีการติดตั้งใช้งานอินเทอร์เฟซเหล่านี้ เฟรมเวิร์กจะใช้อินเทอร์เฟซดังกล่าวสำหรับการรายงาน CSD หากไม่มีการติดตั้งใช้งานการเรียกกลับนี้ ระบบจะใช้การติดตั้งใช้งานสำรองใน AudioFlinger เพื่อคำนวณค่า CSD โดยประมาณ

การรองรับ AIDL แบบสแตนด์อโลนสำหรับปริมาณเสียง

จนกว่า OEM จะผสานรวมปริมาณเสียงใน AIDL Audio HAL ได้ OEM สามารถใช้ API AIDL แบบสแตนด์อโลน ISoundDoseFactory เป็นวิธีแก้ปัญหาชั่วคราวได้ ISoundDoseFactory ใช้อินเทอร์เฟซ ISoundDose ดังที่แสดงใน ตัวอย่างโค้ดต่อไปนี้

@VintfStability
interface ISoundDoseFactory {
    /**
     * Retrieve the sound dose interface for a given audio HAL module name.
     *
     * If a device must comply to IEC62368-1 3rd edition audio safety requirements and is
     * implementing audio offload decoding or other direct playback paths where volume control
     * happens below the audio HAL, it must return an instance of the ISoundDose interface.
     * The same instance must be returned during the lifetime of the HAL module.
     * If the HAL module does not support sound dose, null must be returned, without throwing
     * any errors.
     *
     * @param module for which we trigger sound dose updates.
     * @return An instance of the ISoundDose interface implementation.
     * @throws EX_ILLEGAL_STATE If there was an error creating an instance.
     */
    @nullable ISoundDose getSoundDose(in @utf8InCpp String module);
}

การรองรับ AIDL Audio HAL สำหรับปริมาณเสียง

อินเทอร์เฟซปริมาณเสียงจะได้รับการรองรับในระยะยาวโดยเป็นส่วนหนึ่งของ AIDL Audio HAL โดยการขยายอินเทอร์เฟซ IModule ดังที่แสดงในตัวอย่างโค้ดต่อไปนี้

@VintfStability
interface IModule {

    /**
     * Retrieve the sound dose interface.
     *
     * If a device must comply to IEC62368-1 3rd edition audio safety requirements and is
     * implementing audio offload decoding or other direct playback paths where volume control
     * happens below the audio HAL, it must return an instance of the ISoundDose interface.
     * The same instance must be returned during the lifetime of the HAL module.
     * If the HAL module does not support sound dose, null must be returned, without throwing
     * any errors.
     *
     * @return An instance of the ISoundDose interface implementation.
     * @throws EX_ILLEGAL_STATE If there was an error creating an instance.
     */
    @nullable ISoundDose getSoundDose();
}

ฟีเจอร์นี้เป็นการใช้งานกฎระเบียบใหม่ที่อธิบายไว้ใน IEC62368-1 ฉบับที่ 3 และ EN50332-3 จึงไม่มี API ที่หันหน้าออกภายนอก

OEM สามารถรับรองอุปกรณ์ของตนได้โดยการใช้ HAL Interface ใหม่และ ระบุข้อมูล MEL ที่ถูกต้องสำหรับ CSD ไปยังเฟรมเวิร์กเสียง (แนะนำ) หรือโดย ระบุการใช้งานปริมาณเสียงที่กำหนดเอง

เปิดใช้การคำนวณปริมาณเสียง

โดยค่าเริ่มต้น AOSP รองรับตรรกะด้านความปลอดภัยในการฟังที่ช่วยให้มั่นใจได้ว่าการรับรอง เป็นไปตามมาตรฐาน EN50332-2 และ IEC62368-1 10.6.5 ที่มีอยู่

ใน Android 14 ระบบจะปิดใช้การคำนวณปริมาณเสียงโดยค่าเริ่มต้น

ใช้หลักเกณฑ์ต่อไปนี้เพื่อเปิดใช้การคำนวณปริมาณเสียง ตั้งแต่ Android 14-QPR1 เป็นต้นไป

  • หากประเทศของคุณบังคับใช้กฎระเบียบเกี่ยวกับปริมาณเสียง ให้ตรวจสอบว่า config_safe_media_volume_enabled ใน config.xml ตั้งค่าเป็น true หรือไม่

  • ผู้ให้บริการต้องซ้อนทับconfig_safe_sound_dosage_enabledในconfig.xmlกับtrueเพื่อให้เป็นไปตามข้อกำหนด EN50332-3 และ IEC62368-1 10.6.3 สำหรับอุปกรณ์ที่รองรับการถอดรหัสแบบออฟโหลดและไม่ได้ใช้ อินเทอร์เฟซ HAL ของปริมาณเสียง ต้องไม่ตั้งค่า config_safe_sound_dosage_enabled เป็น true ในกรณีดังกล่าว การตั้งค่า config_safe_sound_dosage_enabled เป็น true อาจทำให้ค่า CSD ไม่ถูกต้องและเกิดปัญหาการรับรองตามมาตรฐานการได้ยินเพื่อความปลอดภัย

กราฟการตัดสินใจต่อไปนี้อธิบายตรรกะที่กำหนดว่าระบบจะคำนวณ CSD หรือระดับความปลอดภัยในการฟังแบบเดิม (ที่ใช้ก่อน Android 14) หรือไม่ โดยอิงตามข้อจำกัดของประเทศและค่าของ Flag

enable_csd

รูปที่ 2 เปิดใช้การคำนวณปริมาณเสียง (เพิ่มตรรกะใน Android 14-QPR1)

การตรวจสอบความถูกต้อง

เมื่อใช้ HAL Interface สำหรับปริมาณเสียง ผู้ผลิตอุปกรณ์ต้องตรวจสอบกับ กรณีทดสอบ VTS ที่กำหนดโดย VtsHalAudioCoreTargetTest สำหรับการใช้งาน IModule AIDL Audio HAL หรือโดย VtsHalSoundDoseFactoryTargetTest สำหรับการใช้งาน AIDL HAL ของปริมาณเสียงแบบสแตนด์อโลน