מנת צליל

ב-Android 14 יש תמיכה במסגרת האודיו וב-Audio HAL למדידת רמת החשיפה לקול. התמיכה הזו מאפשרת לעקוב באופן שוטף אחרי מדידות של רמת החשיפה לקול ולהציג למשתמשים אזהרות לגבי רמות חשיפה מזיקות.

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

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

הפונקציה 'מנה של צליל' מאפשרת ליצרני ציוד מקורי לעמוד בתקנות החדשות בנושא שמירה על בריאות השמיעה. כדי לתמוך ב-Sound Dose, יצרני ציוד מקורי חייבים לפעול בהתאם למפרטים ולתקנות של הממשק בכל ההתאמות האישיות והאישורים. הטמעה מותאמת אישית של OEM יכולה לעקוף או לשנות את ההטמעה שמוגדרת כברירת מחדל ב-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, ועל הפריימים שנשלחים ל-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). יצרני ציוד מקורי יכולים להשתמש ב-MelProcessor בהטמעת ה-HAL שלהם במקרה הצורך.

הכיתה MelAggregator מקבלת את ערכי ה-MEL משקעי אודיו שונים ומחשבת את ערך ה-CSD באמצעות חלון נע של שבעה ימים. השיטה MelAggregator::aggregateAndAddNewMelRecord_l(MelRecord mel) מבצעת את הלוגיקה. התוצאות נשלחות לכיתה SoundDoseManager לצורך תקשורת עם AudioService.

הטמעה

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

תמיכה עצמאית ב-AIDL של Sound dose

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

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

ממשק המינון של הצליל נתמך לטווח ארוך כחלק מ-HAL של אודיו AIDL, על ידי הרחבת הממשק 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. במכשירים שתומכים בפענוח אופלורד ולא מטמיעים את ממשקי ה-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 להטמעת HAL של אודיו ב-AIDL ב-IModule, או ב-VtsHalSoundDoseFactoryTargetTest להטמעת HAL של AIDL לחשיפה לרעש עצמאית.