دوز صدا

‫Android 14 با پایش مداوم اندازه‌گیری‌های دوز صدا و صدور هشدار به کاربران درباره سطوح مواجهه آسیب‌زا، از دوز صدا در چارچوب صوتی و «لایه انتزاعی سخت‌افزار صدا» پشتیبانی می‌کند.

دوز صدا اندازه‌گیری سطح فشار صدا در یک دوره زمانی است. با پایش دوز صدا، می‌توانیم به محافظت از کاربران دربرابر اثرات مخرب قرار گرفتن درمعرض صدای بیش‌ازحد یا طولانی‌مدت کمک کنیم و درنتیجه هنگام استفاده از هدفون در دستگاه‌های قابل‌حمل Android، محافظت بهتری از شنوایی ارائه دهیم و احتمال اختلال شنوایی را به حداقل برسانیم.

استانداردهای جدید برای دستگاه‌های شنیداری ایمن با الزامات نظارتی حفاظت از شنوایی در IEC62368-1 نسخه ۳ (ورود به سیستم الزامی است) و EN50332-3 (دسترسی محدود به مشترکین است) مطابقت دارد که مفهوم دوز صدا را معرفی می‌کنند.

عملکرد دوز صدا به تولیدکنندگان تجهیزات اصلی (OEM) امکان می‌دهد از مقررات جدید ایمنی شنوایی پیروی کنند. برای پشتیبانی از دوز صدا، سازندگان تجهیزات اصلی باید از مشخصات و مقررات میانای مربوط به همه سفارشی‌سازی‌ها و گواهینامه‌ها پیروی کنند. پیاده‌سازی سفارشی OEM می‌تواند پیاده‌سازی پیش‌فرض AOSP برای دوز صدا را دور بزند یا اصلاح کند. بااین‌حال، استفاده از پیاده‌سازی AOSP به‌شدت توصیه می‌شود.

محاسبه دوز صدا

استانداردهای IEC62368-1 ویرایش سوم و EN50332-3 دقت اندازه‌گیری قرار گرفتن درمعرض صدا را با محاسبه دوز صدای محاسبه‌شده (CSD) افزایش می‌دهند. ‫CSD با ادغام سطوح نوردهی لحظه‌ای (MEL) درطول زمان محاسبه می‌شود. یک پنجره هفت روزه پیوسته چرخشی از مقادیر CSD انباشته‌شده برای محاسبه دوز صدا حفظ می‌شود.

مطابق با بخش ۱۰.۶.۳.۲ از ویرایش سوم IEC62368-1، اگر مقدار «دز صدای تجمعی» به حد ۱۰۰٪ برسد، سیستم با هر افزایش ۱۰۰٪ به کاربر درباره سطح صدا هشدار می‌دهد. اگر کاربر هشدار را تأیید نکند، میزان صدا به مقدار ازپیش‌تعیین‌شده کلاس منبع انرژی تابشی ۱ (RS1) در جدول ۳۹ استاندارد IEC62368-1 کاهش می‌یابد.

همان‌طور که در بخش ۱۰.۶.۳.۳ از IEC62368-1 نسخه سوم ذکر شده است، همراه با هشدارهای دوز صدا، سیستم باید هر بار که مقدار MEL از مقدار کلاس ۲ منبع انرژی تابشی (RS2) در جدول ۳۹ از IEC62368-1 فراتر می‌رود، هشدار مبتنی بر مواجهه را آغاز کند.

برای دریافت گواهی این مقررات و مرتبط‌تر کردن مقادیر CSD، سیستم باید از مقادیر برونداد دقیق که کاربران درک می‌کنند (مثل برونداد بازپخش رسانه) استفاده کند. مهم است که در محاسبه «دُز صدای تجمعی» از مقادیری استفاده شود که به سطح فشار صدای واقعی که کاربر درمعرض آن قرار دارد نزدیک باشد.

معماری

بسته به اینکه قاب‌ها کجا ضبط می‌شوند، ویژگی‌های سخت‌افزاری و تأثیرات مبدل‌ها می‌توانند بر سطح قدرت قاب‌های پردازش‌شده تأثیر بگذارند. برای داشتن اندازه‌گیری دقیق سطح فشار صدای برونداد، «لایه انتزاع سخت‌افزار» را گسترش دادیم تا مقادیر MEL را مستقیماً از سخت‌افزار زیرین دریافت کنیم و اثرات احتمالی اعمال‌شده توسط پردازنده سیگنال دیجیتال (DSP) یا ویژگی‌های بلندگو، مانند امپدانس، حساسیت، و پاسخ فرکانسی را درنظر بگیریم.

اگر HAL نتواند مقادیر MEL را ارائه دهد، به‌عنوان سازوکار بازگشت، چارچوب صوتی CSD را تجزیه و تحلیل و محاسبه می‌کند. این محاسبات در چارچوب صوتی براساس اطلاعات مربوط به برونداد پردازش‌شده گزارش‌شده از HAL و قاب‌هایی است که به DSP صوتی ارسال می‌شوند.

«دوز صدا» دو مؤلفه، SoundDoseHelper و SoundDoseManager,، را معرفی می‌کند که در «شکل ۱» نشان داده شده است:

sound_dose_arch

شکل ۱. عناصر معماری ویژگی دوز صدا.

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) منطق را اجرا می‌کند. نتایج برای ارتباط با AudioService به کلاس SoundDoseManager ارسال می‌شود.

پیاده‌سازی

افزونه‌های میانای HIDL از Android 14 منسوخ شده‌اند، بنابراین میانای HAL جدید برای بازیابی مقادیر MEL محاسبه‌شده و صدور هشدارهای قرار گرفتن درمعرض صدا، به‌نام ISoundDose، به‌عنوان بخشی از AIDL Audio HAL تعریف شده است. بااین‌حال، برای پیاده‌سازانی که برای ادغام AIDL Audio HAL به زمان بیشتری نیاز دارند، لایه انتزاعی سخت‌افزار AIDL دوز صدا مستقل داریم که 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 توابع برگشتی را پیاده‌سازی می‌کند که چارچوب را درباره قرار گرفتن لحظه‌ای درمعرض صدا مطلع می‌کند و هرگاه سطح برونداد از RS1 فراتر رود، مقادیر MEL را ارائه می‌دهد. وقتی این میاناهای کاربری پیاده‌سازی می‌شوند، چارچوب از آن‌ها برای گزارش‌دهی «داده‌های حساس مشتری» استفاده می‌کند. بدون این پیاده‌سازی فراخوانی، از پیاده‌سازی بازگشتی در AudioFlinger برای محاسبه تخمین‌های مقادیر CSD استفاده می‌شود.

پشتیبانی مستقل از 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);
}

پشتیبانی از «لایه انتزاع سخت‌افزار صدا» در AIDL برای دوز صدا

میانای دوز صدا به‌عنوان بخشی از 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

شکل ۲. محاسبه دوز صدا را فعال کنید (منطق در Android 14 QPR1 اضافه شده است).

اعتبارسنجی

هنگام پیاده‌سازی میانای HAL برای دوز صدا، OEMها باید دربرابر چارچوب‌های تست VTS تعریف‌شده توسط VtsHalAudioCoreTargetTest برای پیاده‌سازی IModule AIDL Audio HAL، یا توسط VtsHalSoundDoseFactoryTargetTest برای پیاده‌سازی مستقل دوز صدا AIDL HAL اعتبارسنجی کنند.