ปริมาณเสียง

Android 14 รองรับปริมาณการรับเสียงในเฟรมเวิร์กด้านเสียงและ Audio 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% หากผู้ใช้ไม่รับทราบคำเตือน ระดับเสียงจะลดลงเป็นค่าแหล่งที่มาของพลังงานรังสีคลาส 1 (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 ด้านเสียง

ปริมาณการรับเสียงมีคอมโพเนนต์ 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 HAL ปริมาณการรับเสียงแบบสแตนด์อโลนซึ่งมีอินเทอร์เฟซ ISoundDoseFactory สำหรับผู้ติดตั้งใช้งานที่ต้องการเวลาเพิ่มเติมในการผสานรวม AIDL Audio HAL ระบบจะเลิกใช้งานอินเทอร์เฟซนี้ในอนาคต

เมธอด 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 ใหม่และระบุข้อมูล MEL ที่ถูกต้องสำหรับ CSD ไปยังเฟรมเวิร์กด้านเสียง (แนะนำ) หรือโดยการระบุการติดตั้งใช้งานปริมาณการรับเสียงที่กำหนดเอง

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

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

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

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

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

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

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

enable_csd

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

การตรวจสอบ

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