دوز صدا

Android 14 با نظارت مستمر اندازه‌گیری‌های دوز صدا و اخطار دادن به کاربران در مورد سطوح آسیب‌دیدگی، از دوز صدا در چارچوب صوتی و Audio HAL پشتیبانی می‌کند.

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

استانداردهای جدید برای دستگاه های شنود ایمن مطابق با الزامات نظارتی برای محافظت از شنوایی در نسخه سوم IEC62368-1 (نیاز به ورود به سیستم) و 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 ذکر شد، به همراه هشدارهای دوز صدا، سیستم باید هر بار که مقدار 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) روی یک بافر با نمونه های صوتی انجام می شود. OEM ها می توانند در صورت نیاز 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 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 جدید تماس‌هایی را پیاده‌سازی می‌کند که چارچوب را در مورد نوردهی لحظه‌ای مطلع می‌کند و هر زمان که سطح خروجی از RS1 بیشتر شود، مقادیر MEL را ارائه می‌کند. هنگامی که این رابط ها پیاده سازی می شوند، چارچوب از آنها برای گزارش CSD استفاده می کند. بدون اجرای این فراخوان، یک پیاده سازی بازگشتی در AudioFlinger برای محاسبه برآورد مقادیر CSD استفاده می شود.

دوز صدا پشتیبانی AIDL مستقل

تا زمانی که OEM ها نتوانند دوز صدا را در HAL صوتی AIDL ادغام کنند، می توانند از API مستقل 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 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 شرح داده شده است، بنابراین هیچ API خارجی وجود ندارد.

OEM ها می توانند دستگاه های خود را با اجرای رابط های HAL جدید و ارائه داده های MEL دقیق برای CSD به چارچوب صوتی (توصیه می شود)، یا با ارائه یک اجرای دوز صدای سفارشی تأیید کنند.

محاسبه دوز صدا را فعال کنید

به طور پیش فرض، AOSP از منطق ایمنی شنوایی پشتیبانی می کند که گواهینامه را با استانداردهای موجود EN50332-2 و IEC62368-1 10.6.5 تضمین می کند.

در اندروید 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 قرار دهند. برای دستگاه‌هایی که از رمزگشایی offload پشتیبانی می‌کنند و رابط‌های 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 تعریف شده است، اعتبارسنجی کنند.