ב-Android מגרסה 13 ומטה, ממשק ה-HAL של האודיו מוגדר באמצעות HIDL בקובצי HIDL HAL (עם התוסף .hal
) וסכימות XSD עבור קובצי התצורה, כמו שמוצג בהמשך.
איור 1. ממשק Audio HAL.
קובצי תצורה
קובצי הגדרות XML של מדיניות אודיו ואפקטים קוליים נחשבים לחלק מממשק Audio HIDL HAL. הקבצים האלה צריכים להתאים לסכימות שלהם, וההתאמה מאומתת על ידי בדיקות VTS.
כחלק מההטמעה של audio HIDL HAL, צריך ליצור קובץ הגדרות של מדיניות אודיו שמתאר את טופולוגיית האודיו. כדי שהמסגרת תוכל להשתמש ביכולות של Audio HAL, צריך להצהיר עליהן בקובץ audio_policy_configuration.xml
.
Audio HIDL HAL API
בקטע הזה מתוארים ממשקי ה-API של Core, Effects ו-Common HAL ל-HIDL.
Core HAL
אלה כמה מהממשקים העיקריים של Core HAL, באמצעות HIDL:
-
IDeviceFactory.hal
היא נקודת הכניסה ל-API. -
IDevice.hal
וגםIPrimaryDevice.hal
מכילים שיטות כמוsetMasterVolume
אוopenInputStream
. - הסטרימים הם חד-כיווניים, ומשמשים את AudioFlinger לשליחה או לקבלה של אודיו אל ומ-HAL דרך
IStream.hal
, IStreamOut.hal
ו-IStreamIn.hal
.
בטבלה הבאה מפורט המיקום של רכיבי HIDL שימושיים של Core HAL:
רכיב ה-HAL המרכזי | מיקום |
---|---|
הגרסה האחרונה של ה-API | /hardware/interfaces/audio/6.0
|
סוגים שספציפיים לגרסה האחרונה של Core HAL API | /hardware/interfaces/audio/6.0/types.hal
|
סכימת XSD של קובץ הגדרת מדיניות האודיו | /hardware/interfaces/audio/6.0/config/audio_policy_configuration.xsd
|
ההטמעה שמוגדרת כברירת מחדל של Core HAL API (/hardware/interfaces/audio/core/all-versions/default/
) היא wrapper סביב ההטמעה של HAL לפני Treble, באמצעות ספריות משותפות מדור קודם.
אפשר גם להשתמש בהטמעה שמוגדרת כברירת מחדל כהפניה כשמטמיעים גרסאות חדשות של Audio HALs שפועלות באינטראקציה ישירה עם מנהלי התקנים של ליבת המערכת.
Effects HAL
בטבלה הבאה מפורט המיקום של רכיבי HAL שימושיים של אפקטים באמצעות HIDL:
רכיב HAL של אפקטים | מיקום |
---|---|
הגרסה האחרונה של ה-API | /hardware/interfaces/audio/effect/6.0/
|
סכימת XSD של קובץ תצורת האפקט | /hardware/interfaces/audio/effect/6.0/xml/audio_effects_conf.xsd
|
מידע נוסף זמין במאמר /hardware/interfaces/audio/effect/all-versions/default/
שכולל הטמעה לדוגמה של Effects HAL API ובקטע Audio Effects.
Common HAL
ה-Common HAL API באמצעות HIDL מכיל את הרכיבים הבאים:
- הגדרות (
/hardware/interfaces/audio/common/6.0/types.hal
) שמשותפות לממשקי ה-API של Core ו-Effect. - כלי עזר (
/hardware/interfaces/audio/common/all-versions
) שמשמשים לכתיבת קוד מול ממשקי HIDL API להטמעות, ללקוחות ולבדיקות.
עדכונים ב-Audio HAL V7
יש שינויים משמעותיים בגרסה 7 של Audio HAL ב-Android 12, כפי שמפורט בקטע הזה. ה-HAL V7 של האודיו מבצע את הפעולות הבאות:
- מאחד את מודלי הנתונים שמשמשים את המסגרת ואת HAL.
- מצמצם את הכפילות בין סוגי הנתונים של HIDL (מספורים) לבין סכמת ה-XML שמשמשת להגדרת מדיניות האודיו.
באופן ספציפי, בוצעו שינויים באזורים הבאים ב-Audio HAL V7:
השינויים האלה מוסברים בפירוט בקטעים הרלוונטיים.
ערכי ספירה
החל מ-Audio HAL V7, סוגים ממוספרים שמשמשים בקובץ Audio Policy Configuration מוגדרים רק בסכימת ה-XSD ולא ב-HIDL.
ב-Audio HAL V6, הערכים של סוגי enum (כמו AudioFormat
) ב-types.hal
מוגדרים גם בסכימת ה-XSD של קובץ התצורה של מדיניות האודיו, וכך נוצר כפילות. כדי למנוע את הבעיה הזו בגרסה 7, סוגי ה-enum השתנו ל-string
וכל ערכי ה-enum האפשריים מפורטים בסכימת ה-XSD.
באיור 2 מוצגת השוואה בין חלק מהשינויים בסוג ה-enum AudioFormat
בגרסה 7:
איור 2. השוואה בין חלק מהשינויים ב-enum AudioFormat.
בטבלה הבאה מפורטים סוגי ה-enum שהומרו ל-string
:
AudioChannelMask
AudioContentType
AudioDevice
: ספק ניתן להרחבהAudioFormat
: ספק ניתן להרחבהAudioGainMode
AudioSource
AudioStreamType
AudioUsage
העברת ערכי enum של מחרוזות
ערכי מחרוזת משמשים להעברת מידע כערכי ספירה מעבר לגבול של ממשק HAL. גם במסגרת וגם ב-wrapper של HAL נעשה שימוש בערכי enum של מספרים שלמים כדי להטמיע לוגיקה עסקית, ונעשה שימוש בגישת ההמרה שמתוארת באיור 3:
איור 3. העברת ערכי enum של מחרוזות.
לדוגמה, כדי להעביר ערך של סוג פורמט אודיו מהמסגרת לספק:
- הערך של enum
AudioFormat
מומר לערך מחרוזת ב-libaudiohal
ומועבר ל-HAL. - בצד HAL, העטיפה שמוגדרת כברירת מחדל ממירה את המחרוזת לערך enum, שמועבר ל-HAL מדור קודם.
שינויים בסכימת XML
הגדרת רשימות מלאות של ערכי enum בהגדרת סכימת ה-XML (XSD) מאפשרת ל-VTS לבצע אימות טוב יותר של קובץ ה-XML של מדיניות האודיו. ביצענו שינויים בקובץ התצורה של מדיניות האודיו שמשמש עם HAL V7 כדי לעמוד בדרישות של XSD.
בגרסה 7, נעשה שימוש בתו ␣
(רווח) סטנדרטי כדי לתחום רשימות של ערכים במאפיינים (כמו שיעורי דגימה, מסכות ערוצים ודגלים), במקום בסימנים ,
(פסיק) ו-|
(קו אנכי) שנעשה בהם שימוש בגרסה 6 ובגרסאות קודמות. כפי שאפשר לראות בדוגמה הבאה, הרווח משמש להפרדה בין הערכים ברשימה של channelMasks
:
<profile channelMasks="AUDIO_CHANNEL_OUT_STEREO AUDIO_CHANNEL_OUT_MONO" … />
כדי לשנות את הסמלים, משתמשים בסקריפט המרה אוטומטי שנקרא update_audio_policy_config.sh
. הפקודה הבאה ממירה קובץ תצורה של מדיניות אודיו מגרסה V6 לגרסה V7 עבור מכשיר Pixel 5 (Redfin):
hardware/interfaces/audio/7.0/config/update_audio_policy_config.sh \
device/google/redfin/audio/audio_policy_configuration.xml 6.0
סוגי הנתונים
הגדרנו מחדש כמה מבני נתונים בגרסה 7 כדי לצמצם את ההגדרות הכפולות. טפלים חוזרים של פריטי נתונים מקובצים יחד למבנים שאפשר לעשות בהם שימוש חוזר. מבני הנתונים האלה משתמשים בתכונות העדכניות ביותר של HIDL, כמו איגודים בטוחים.
לדוגמה, בגרסה V6 ומטה, משתמשים לעתים קרובות בשלשה של <format, sampling rate, channel mask>
בממשקי HIDL ובסוגים. כדי להסיר את הכפילות הזו, בגרסה 7, AudioConfigBase
סוג הנתונים וסוגי נתונים אחרים מוגדרים באופן הבא:
AudioConfigBase := <format, sampling rate, channel mask>
AudioConfigBaseOptional := <[fmt], [sampl. rate], [chan. mask]>
בשימוש על ידי
AudioConfig
,AudioOffloadInfo
,AudioPortConfig
AudioProfile := <format, {sampling rates}, {channel masks}>
מחליף אוספים לא מאורגנים ב-
AudioPort/PortConfig
AudioPortExtendedInfo := device | mix | session
מחליף את האיגודים ב-
AudioPort/PortConfig
תגי ספקים
בנוסף לסוגי מכשירים ולפורמטים, ספקים יכולים להוסיף תגים מותאמים אישית למטא-נתונים של רצועות אודיו.
כדי להפעיל השמעה ולהקליט מטא-נתונים של טראקים, ספקים יכולים להעביר תגים משלהם, שמשמשים להוספת מאפיינים לזרמי קלט/פלט של אודיו, מהאפליקציות ל-HAL.
תגי ספק של מטא-נתונים של רצועות להפעלה מתווספים כמו בדוגמה הבאה:
struct PlaybackTrackMetadata {
…
/** Tags from AudioTrack audio attributes */
vec<AudioTag> tags;
};
המבנה RecordTrackMetadata
מיושם באופן דומה על ידי הוספת תגים ספציפיים למטא-נתונים של רצועת ההקלטה.
מרחב שמות של תוספים של ספקים
החל מ-HAL V7, לתוספים של ספקים נדרש קידומת {vendor}
נוספת שלא נדרשת ב-V6. כדי שהקידומת {vendor}
תהיה תקינה, היא צריכה לכלול שלושה תווים אלפאנומריים או יותר.
בגרסה 7, צריך להשתמש בפורמט הבא:
VX_{vendor}_{letters/numbers}
ריכזנו כאן כמה דוגמאות לתוספים תקפים של ספקים בגרסה 7:
VX_GOOGLE_VR
VX_QCI_AMBIENT_MIC
פרטי הגרסה
בטבלה הבאה מפורט מספר הגרסה של HAL לכל מהדורה של Android:
גרסת Android | גרסת HIDL HAL |
---|---|
Android 13 | 7.1 |
12 Android | 7.0 |
Android 11 | 6.0 |
Android 10 | 5.0 |
Android 9 | 4.0 |
Android 8 | 2.0 |