ב-Android 14 יש תמיכה במסגרת האודיו וב-Audio HAL למדידת רמת החשיפה לקול. התמיכה הזו מאפשרת לעקוב באופן שוטף אחרי מדידות של רמת החשיפה לקול ולהציג למשתמשים אזהרות לגבי רמות חשיפה מזיקות.
מנה של צליל היא מדידה של רמות לחץ הקול לאורך תקופת זמן מסוימת. בעזרת מעקב אחר המינון של הצליל, אנחנו יכולים להגן על המשתמשים מההשפעות המזיקות של חשיפה ממושכת או מוגזמת לקול, וכך לספק הגנה טובה יותר על השמיעה בזמן השימוש באוזניות במכשירי Android ניידים, ולצמצם את הסיכוי לנזק לשמיעה.
הסטנדרטים החדשים למכשירי האזנה בטוחים תואמים לדרישות הרגולטוריות להגנה על השמיעה שמפורטות ב-IEC62368-1 מהדורה שלישית (נדרשת כניסה) וב-EN50332-3 (הגישה מוגבלת למנויים), שבהם מופיע המונח 'מנה קול'.
פונקציית מינון הצליל מאפשרת ליצרני ציוד מקורי לפעול בהתאם לתקנות החדשות של בטיחות שמיעה. שפת תרגום מנת צליל תמיכה, יצרני ציוד מקורי חייבים לפעול בהתאם לתקנות ולמפרטים של הממשק לכל ההתאמות האישיות וההסמכות. הטמעה מותאמת אישית של 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:
איור 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
.
הטמעה
תוספי ממשק 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. כשמטמיעים את ממשקי ה-API האלה, המערכת משתמשת בהם לדיווח על CSD. ללא ההטמעה של הקריאה החוזרת (callback),
הטמעה חלופית ב-AudioFlinger
משמש לחישוב אומדנים של ערכי CSD.
תמיכה עצמאית ב-AIDL של Sound dose
עד שיצרני ציוד מקורי יוכלו לשלב את מנת האודיו ב-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);
}
תמיכה ב-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 ובמהדורה השלישית של 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) נספרים.
איור 2. הפעלת החישוב של מנת הקול (הלוגיקה מתווספת Android 14-QPR1).
אימות
כשמטמיעים ממשק HAL למינון צלילים, יצרני ציוד מקורי חייבים לבצע אימות מול
מקרי הבדיקה של VTS שהוגדרו על ידי VtsHalAudioCoreTargetTest
להטמעה של IModule AIDL Audio HAL, או של VtsHalSoundDoseFactoryTargetTest
להטמעה הנפרדת של מנת האודיו AIDL HAL.