מנה של צליל

‫Android 14 מספק תמיכה במינון רעש במסגרת האודיו וב-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 של האודיו.

באיור 1 מוצגים שני רכיבים של מינון הרעש, SoundDoseHelper ו-SoundDoseManager,:

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.

הטמעה

החל מ-Android 14, תוספים לממשקי HIDL הוצאו משימוש. לכן, ממשק 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 החדש מיישם קריאות חוזרות (callbacks) שמעדכנות את המסגרת לגבי החשיפה הרגעית ומספקות ערכי MEL בכל פעם שרמת הפלט חורגת מ-RS1. כשמטמיעים את הממשקים האלה, המסגרת משתמשת בהם לדיווח על CSD. אם לא מטמיעים את הקוד הזה של הקריאה החוזרת, המערכת משתמשת בהטמעה חלופית ב-AudioFlinger כדי לחשב אומדנים של ערכי CSD.

תמיכה ב-AIDL עצמאי למדידת עוצמת הקול

עד שיצרני ציוד מקורי יוכלו לשלב את המינון של הצליל ב-HAL של AIDL Audio, הם יכולים להשתמש ב-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);
}

תמיכה ב-HAL של אודיו ב-AIDL Sound dose

הממשק של מינון הקול נתמך לטווח ארוך כחלק מ-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 שפונים אל מחוץ למערכת.

יצרני ציוד מקורי יכולים לקבל אישור למכשירים שלהם על ידי הטמעה של ממשקי 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 להטמעה של standalone sound dose AIDL HAL.