جرعة الصوت

يتيح نظام التشغيل Android 14 إمكانية قياس جرعة الصوت في إطار عمل الصوت وطبقة تجريد الأجهزة (HAL) الخاصة بالصوت من خلال المراقبة المستمرة لقياسات جرعة الصوت وإصدار تحذيرات للمستخدمين بشأن مستويات التعرّض الضارة.

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

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

تتيح وظيفة "جرعة الصوت" لمصنّعي المعدات الأصلية الالتزام باللوائح التنظيمية الجديدة المتعلّقة بسلامة السمع. لإتاحة ميزة "الجرعة الصوتية"، على الشركات المصنّعة للأجهزة الأصلية اتّباع مواصفات الواجهة واللوائح التنظيمية لجميع عمليات التخصيص والشهادات. يمكن أن تتجاوز عملية التنفيذ المخصّصة من قِبل مصنّع الأجهزة الأصلية أو تعدّل عملية التنفيذ التلقائية لجرعة الصوت في 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، وإلى اللقطات التي يتم إرسالها إلى معالج الإشارات الرقمية للصوت.

تتضمّن جرعة الصوت مكوّنَين، SoundDoseHelper وSoundDoseManager,، كما هو موضّح في الشكل 1:

sound_dose_arch

الشكل 1. المكوّنات المعمارية لميزة "جرعة الصوت"

SoundDoseHelper

فئة SoundDoseHelper، التي تقع في عملية systemserver، هي نقطة التجميع الرئيسية لجميع بيانات جرعات الصوت ذات الصلة. يدير صف AudioService الصف SoundDoseHelper.

تتحمّل فئة SoundDoseHelper المسؤولية عن ما يلي:

  • التعامل مع معلومات الجرعات الجديدة
  • الاحتفاظ بقيم جرعة الصوت
  • استرداد الحالة في حال تعذُّر audioserver
  • عرض إشعارات واجهة مستخدم النظام
  • خفض مستوى الصوت

SoundDoseManager

تجمع الفئة SoundDoseManager، التي تقع ضمن عملية audioserver وجزء من الفئة AudioFlinger، بيانات جرعة الصوت من طبقة تجريد الأجهزة (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. عند تنفيذ هذه الواجهات، يستخدمها إطار العمل لإعداد تقارير CSD. في حال عدم تنفيذ وظيفة ردّ الاتصال هذه، سيتم استخدام عملية تنفيذ احتياطية في AudioFlinger لاحتساب تقديرات قيم الإحالات الناجحة المحدودة.

إتاحة ميزة "جرعة الصوت" المستقلة في AIDL

إلى أن يتمكّن مصنّعو المعدات الأصلية من دمج ميزة "جرعة الصوت" في طبقة تجريد الأجهزة الصوتية (HAL) المستندة إلى AIDL، يمكنهم استخدام واجهة برمجة التطبيقات المستقلة المستندة إلى 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);
}

إتاحة 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 وEN50332-3، لذا لا تتوفّر واجهات برمجة تطبيقات خارجية.

يمكن لمصنّعي المعدات الأصلية الحصول على شهادة اعتماد لأجهزتهم من خلال تنفيذ واجهات HAL الجديدة وتقديم بيانات دقيقة عن مستوى التعرّض للصوت (MEL) إلى إطار عمل الصوت (يُنصح بذلك)، أو من خلال تقديم عملية تنفيذ مخصّصة لمستوى التعرّض للصوت.

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

يتوافق 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 المستقلة الخاصة بجرعة الصوت.