جرعة الصوت

يوفر Android 14 دعمًا لجرعة الصوت في إطار الصوت وAudio HAL من خلال مراقبة قياسات جرعة الصوت بشكل مستمر وإصدار تحذيرات للمستخدمين بشأن مستويات التعرض الضارة.

الجرعة الصوتية هي قياس مستويات ضغط الصوت على مدى فترة من الزمن. ومن خلال مراقبة جرعة الصوت، يمكننا المساعدة في حماية المستخدمين من التأثيرات الضارة الناجمة عن التعرض المفرط أو المطول للصوت، وبالتالي توفير حماية أفضل للسمع عند استخدام سماعات الرأس على أجهزة Android المحمولة وتقليل فرصة الإصابة بضعف السمع.

تتوافق المعايير الجديدة لأجهزة الاستماع الآمنة مع المتطلبات التنظيمية لحماية السمع في الإصدار الثالث من IEC62368-1 (يتطلب تسجيل الدخول) و EN50332-3 (الوصول يقتصر على المشتركين)، والذي يقدم مفهوم الجرعة الصوتية.

تتيح وظيفة الجرعة الصوتية لمصنعي المعدات الأصلية اتباع لوائح سلامة السمع الجديدة. لدعم جرعة الصوت، يجب على مصنعي المعدات الأصلية اتباع مواصفات ولوائح الواجهة لجميع التخصيصات والشهادات. يمكن لتطبيق OEM المخصص تجاوز أو تعديل تطبيق AOSP الافتراضي لجرعة الصوت. ومع ذلك، يوصى بشدة باستخدام تطبيق AOSP.

حساب الجرعة الصوتية

تعمل المعايير الواردة في الإصدار الثالث من IEC62368-1 وEN50332-3 على زيادة دقة قياس التعرض للصوت عن طريق حساب جرعة الصوت المحسوبة (CSD). يتم حساب CSD من خلال دمج مستويات التعرض اللحظية (MEL) مع مرور الوقت. يتم الاحتفاظ بنافذة متجددة بشكل مستمر لمدة سبعة أيام لقيم CSD المتراكمة لحساب الجرعة السليمة.

وفقًا للقسم 10.6.3.2 من الإصدار الثالث IEC62368-1، إذا وصلت قيمة CSD إلى حد 100%، يقوم النظام بتنبيه المستخدم حول مستويات الصوت عند كل زيادة بنسبة 100%. إذا لم يقر المستخدم بالتحذير، ينخفض ​​الحجم إلى قيمة مصدر الطاقة الإشعاعية المحددة مسبقًا فئة 1 (RS1) في الجدول 39 في IEC62368-1.

كما هو مذكور في القسم 10.6.3.3 من الإصدار الثالث من IEC62368-1، إلى جانب تحذيرات الجرعة الصوتية، يجب أن يبدأ النظام تحذيرًا قائمًا على التعرض في كل مرة تتجاوز فيها قيمة 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
  • تشغيل إشعارات واجهة مستخدم النظام
  • خفض الحجم

SoundDoseManager

تقوم فئة SoundDoseManager ، التي تعيش في عملية audioserver وهي جزء من فئة AudioFlinger ، بجمع بيانات جرعة الصوت من HAL أو تحسبها داخليًا، كاحتياطي، من الإطارات المرسلة إلى HAL. ترسل فئة SoundDoseManager بيانات جرعة الصوت إلى فئة SoundDoseHelper .

MelProcessor وMelAggregator

إذا لم يتمكن HAL من توفير قيم MEL، فسيتم استخدام الأدوات المساعدة MelProcessor و MelAggregator في libaudioutils لحساب جرعة الصوت الداخلية.

في فئة MelProcessor ، يتم إجراء الحساب الرئيسي على مخزن مؤقت يحتوي على عينات صوتية عن طريق استدعاء MelProcessor::process(const void* buffer, size_t bytes) . يمكن لمصنعي المعدات الأصلية استخدام 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. عند تنفيذ هذه الواجهات، يستخدمها إطار العمل لإعداد تقارير لجنة التنمية المستدامة. بدون تنفيذ رد الاتصال هذا، يتم استخدام التنفيذ الاحتياطي على AudioFlinger لحساب تقديرات قيم CSD.

جرعة الصوت دعم AIDL مستقل

وإلى أن يتمكن مصنعو المعدات الأصلية من دمج جرعة الصوت في 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 وEN50332-3، لذلك لا توجد واجهات برمجة تطبيقات خارجية.

يمكن لمصنعي المعدات الأصلية اعتماد أجهزتهم من خلال تنفيذ واجهات 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 لجرعة الصوت، يجب على مصنعي المعدات الأصلية التحقق من صحة حالات اختبار VTS المحددة بواسطة VtsHalAudioCoreTargetTest لتطبيق IModule AIDL Audio HAL، أو بواسطة VtsHalSoundDoseFactoryTargetTest لتطبيق AIDL HAL لجرعة الصوت المستقلة.