HIDL Audio HAL

ב-Android מגרסה 13 ומטה, ממשק ה-HAL של האודיו מוגדר באמצעות HIDL בקובצי HIDL HAL (עם התוסף .hal) וסכימות XSD לקובצי התצורה, כמו שמוצג בהמשך.

audio_hal

איור 1. ממשק HAL של אודיו.

קובצי תצורה

קובצי תצורה של XML של מדיניות אודיו ואפקטים של אודיו נחשבים לחלק מממשק ה-HAL של Audio HIDL. הקבצים האלה צריכים להתאים לסכימות שלהם, וההתאמה מאומתת על ידי בדיקות VTS.

כחלק מההטמעה של ה-HAL של אודיו HIDL, צריך ליצור קובץ תצורה של מדיניות אודיו שמתאר את טופולוגיית האודיו. כדי שהמסגרת תוכל להשתמש ביכולות של Audio HAL, צריך להצהיר עליהן בקובץ audio_policy_configuration.xml.

Audio HIDL HAL API

בקטע הזה מתוארים ממשקי Core,‏ Effects ו-Common HAL API של HIDL.

Core HAL

אלה כמה מהממשקים העיקריים של Core HAL, באמצעות HIDL:

  • IDeviceFactory.hal היא נקודת הכניסה ל-API.
  • IDevice.hal ו-IPrimaryDevice.hal מכילים שיטות כמו setMasterVolume או openInputStream.
  • הסטרימינג הוא חד-כיווני, ומשמש את AudioFlinger לשליחה או לקבלה של אודיו אל ומ-HAL דרך IStream.hal, ‏ IStreamOut.hal ו-IStreamIn.hal.

בטבלה הבאה מפורטים המיקומים של רכיבי Core HAL HIDL שימושיים:

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

Effects HAL

בטבלה הבאה מפורט המיקום של רכיבי HAL שימושיים של אפקטים באמצעות HIDL:

רכיב HAL של אפקטים מיקום
הגרסה האחרונה של ה-API /hardware/interfaces/audio/effect/6.0/
סכימת XSD של קובץ התצורה של האפקט /hardware/interfaces/audio/effect/6.0/xml/audio_effects_conf.xsd

מידע נוסף זמין במאמר בנושא Audio Effects ובדוגמה להטמעה של Effects HAL API בכתובת /hardware/interfaces/audio/effect/all-versions/default/.

Common HAL

ממשק ה-API של Common HAL באמצעות HIDL מכיל את הרכיבים הבאים:

  • הגדרות (/hardware/interfaces/audio/common/6.0/types.hal) שמשותפות לממשקי ה-API של Core ו-Effect.
  • כלי עזר (/hardware/interfaces/audio/common/all-versions) שמשמשים לכתיבת קוד מול ממשקי HIDL API לצורך הטמעות, לקוחות ובדיקות.

עדכונים ב-HAL V7 של אודיו

יש שינויים משמעותיים בגרסה 7 של Audio HAL ב-Android 12, כפי שמפורט בקטע הזה. ‫Audio HAL V7 מבצע את הפעולות הבאות:

  • מאחד את מודלי הנתונים שמשמשים את המסגרת ואת HAL.
  • מצמצם את הכפילות בין סוגי הנתונים של HIDL (מספרי enum) לבין סכמת ה-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:

audioformat-change

איור 2. השוואה בין חלק מהשינויים ב-enum‏ AudioFormat.

בהמשך מופיעה רשימה של סוגי ה-enum שהומרו ל-string:

  • AudioChannelMask
  • AudioContentType
  • AudioDevice: ספק ניתן להרחבה
  • AudioFormat: ניתן להרחבה על ידי ספק
  • AudioGainMode
  • AudioSource
  • AudioStreamType
  • AudioUsage

העברת ערכי enum של מחרוזות

ערכי מחרוזת משמשים להעברת מידע כערכי ספירה מעבר לגבול של ממשק HAL. גם המסגרת וגם ה-wrapper של HAL משתמשים בערכי enum של מספרים שלמים כדי להטמיע לוגיקה עסקית, ומיישמים את גישת ההמרה שמתוארת באיור 3:

audio-passing-values

איור 3. העברת ערכי enum של מחרוזות.

לדוגמה, כדי להעביר ערך של סוג פורמט אודיו מהמסגרת לספק:

  1. הערך של ה-enum‏ AudioFormat מומר לערך מחרוזת ב-libaudiohal ומועבר ל-HAL.
  2. בצד 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