ปริมาณเสียง

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

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

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

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

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

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

ปริมาณเสียงแนะนำสององค์ประกอบ 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 โดยมีกรอบเวลาเจ็ดวัน เมธอด 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 ได้ พวกเขาจึงสามารถใช้ 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);
}

รองรับปริมาณเสียง 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 แบบสแตนด์อโลน