מנת צליל

מערכת Android 14 תומכת במנות אודיו אודיו framework ו-Audio HAL על ידי מעקב מתמשך אחר מדידות מנת הקול ושליחת אזהרות למשתמשים לגבי פגיעה ברמות החשיפה.

מנה צליל היא מדידה של רמות הלחץ הקול לאורך פרק זמן מסוים. על ידי מעקב אחרי מינון הקול, אנחנו יכולים להגן על המשתמשים מפני ההשפעות המזיקות חשיפה ממושכת או ממושכת לרעש, ובכך מציעה הגנה טובה יותר לשמיעה כשמשתמשים באוזניות במכשירי Android ניידים, ומפחיתים את הסיכוי ליקוי שמיעה.

התקנים החדשים למכשירי האזנה בטוחה עומדים בדרישות הרגולטוריות הדרישות להגנה על שמיעה במהדורה השלישית של IEC62368-1 (נדרשת התחברות) ו-EN50332-3 (הגישה מוגבלת למנויים), כדי להציג את המושג 'מנות קול'.

פונקציית מינון הצליל מאפשרת ליצרני ציוד מקורי לפעול בהתאם לתקנות החדשות של בטיחות שמיעה. שפת תרגום מנת צליל תמיכה, יצרני ציוד מקורי חייבים לפעול בהתאם לתקנות ולמפרטים של הממשק לכל ההתאמות האישיות וההסמכות. יישום מותאם אישית של OEM (יצרן ציוד מקורי) יכול לעקוף או לשנות את הטמעת ברירת המחדל של ה-AOSP של מינון הצליל. אבל, לפעמים מומלץ מאוד להשתמש בהטמעת AOSP.

חישוב של מנת האודיו

הסטנדרטים ב-IEC62368-1 במהדורה השלישית וב-EN50332-3 משפרים את הדיוק מדידה של החשיפה לרעש באמצעות חישוב מנת הקול המחושבת (CSD). CSD הוא מחושב על ידי שילוב רמות חשיפה רגעית (MEL) לאורך זמן. A7 ימים נשמר חלון רציף של ערכי 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.

MelCPUor ו- 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, Stalone Sound dose 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 החדש מוטמע קריאות חוזרות (callback) שמעבירים למסגרת את המידע לגבי חשיפה זמנית ומספקים ערכי MEL בכל פעם שרמת הפלט חורגת מ-RS1. כשהממשקים האלה מוטמעים, ה-framework משתמש בהם לדיווח CSD. ללא ההטמעה של הקריאה החוזרת (callback), הטמעה חלופית ב-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, כך שאין ממשקי 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. במכשירים שתומכים בפענוח קוד של עומסי עבודה ולא מטמיעים את sound dose HAL Interfaces, אין להגדיר את config_safe_sound_dosage_enabled כ-true. במקרים כאלה, הגדרה של config_safe_sound_dosage_enabled לערך true עלולה להוביל להצגת נתוני CSD לא מדויקים והערכים של בעיות באישורים בנוגע לתקני שמיעה בנושא בטיחות.

בתרשים ההחלטות הבא מתואר הלוגיקה שקובעת אם, על סמך הגבלות על מדינות וערכים של דגלים, ה-CSD או הדגלים רמות בטיחות השמיעה (שהושמו לפני Android 14) נספרים.

הפעלה_csd

איור 2. הפעלת החישוב של מנת הקול (הלוגיקה מתווספת Android 14-QPR1).

אימות

כשמטמיעים ממשק HAL למינון צלילים, יצרני ציוד מקורי חייבים לבצע אימות מול מקרי הבדיקה של VTS שמוגדרים על ידי VtsHalAudioCoreTargetTest להטמעה של IModule AIDL Audio HAL, או של VtsHalSoundDoseFactoryTargetTest להטמעה הנפרדת של מנת האודיו AIDL HAL.