โดสเสียง

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

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

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

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

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

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

ตามส่วนที่ 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 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 แบบสแตนด์อโลนของ Sound Dose

ในระหว่างนี้ OEM สามารถใช้ AIDL API แบบสแตนด์อโลน 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);
}

Sound dose รองรับ 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 หรือไม่

  • ผู้ให้บริการต้องวางซ้อนธงใน config.xml บน true เพื่อให้เป็นไปตามข้อกำหนด EN50332-3 และ IEC62368-1 10.6.3config_safe_sound_dosage_enabled สำหรับอุปกรณ์ที่รองรับการถอดรหัสแบบออฟโหลดและไม่ได้ใช้อินเทอร์เฟซ 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 สำหรับปริมาณเสียง OEM ต้องตรวจสอบกับกรณีทดสอบ VTS ที่ระบุโดย VtsHalAudioCoreTargetTest สำหรับการติดตั้งใช้งาน IModule AIDL Audio HAL หรือโดย VtsHalSoundDoseFactoryTargetTest สำหรับการติดตั้งใช้งาน AIDL HAL ปริมาณเสียงแบบสแตนด์อโลน