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,:

איור 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. בלי הטמעה של קריאה חוזרת (callback) כזו, המערכת משתמשת בהטמעה חלופית ב-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. במכשירים שתומכים בפיענוח offload ולא מטמיעים את ממשקי HAL של מינון קול, אסור להגדיר אתconfig_safe_sound_dosage_enabledל-true. במקרים כאלה, הגדרתconfig_safe_sound_dosage_enabledל-trueעלולה להוביל לערכי CSD לא מדויקים ולבעיות באישור של תקני בטיחות.
בתרשים הבא מתואר הלוגיקה שקובעת אם רמות הבטיחות של השמיעה ב-CSD או בגרסה הקודמת (שיושמה לפני Android 14) מחושבות, על סמך ההגבלות במדינה והערכים של הדגלים.

איור 2. הפעלת החישוב של מינון הרעש (הלוגיקה נוספת ב-Android 14-QPR1).
אימות
כשמטמיעים את ממשק ה-HAL של מינון הקול, יצרני ציוד מקורי (OEM) צריכים לבצע אימות מול מקרי הבדיקה של VTS שמוגדרים על ידי VtsHalAudioCoreTargetTest להטמעה של IModule AIDL Audio HAL, או על ידי VtsHalSoundDoseFactoryTargetTest להטמעה של מינון קול עצמאי של AIDL HAL.