HIDL Audio HAL

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

audio_hal

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

קובצי תצורה

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

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

Audio HIDL HAL API

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

אפקטים עם HAL

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

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

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

HAL משותף

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

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

עדכונים ל-Audio HAL V7

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

  • מאחד את מודלי הנתונים שבהם משתמשים המסגרת ו-HAL.
  • מזעור הכפילויות בין סוגי נתונים מסוג HIDL (טיפוסים) לבין סכימת ה-XML שמשמשת להגדרת מדיניות האודיו.

באופן ספציפי, שינויים מבוצעים באזורים הבאים ב-Audio HAL V7:

השינויים האלה מוסברים בפירוט רב יותר בקטעים הרלוונטיים.

ערכים ממוספרים

החל מגרסה 7 של Audio HAL, הסוגים המנויים שמשמשים בקובץ התצורה של מדיניות האודיו מוגדרים רק בסכימה של XSD ולא ב-HIDL.

ב-Audio HAL V6, ערכים של סוגי enum (כמו AudioFormat) ב-types.hal מוגדרים גם בסכימת ה-XSD של קובץ התצורה של מדיניות האודיו, וכך נוצרת כפילות. כדי להימנע מכך ב-V7, סוגי ה-enum משתנים ל-string וכל ערכי המספור האפשריים מפורטים בסכימת XSD במקום זאת.

באיור 2 מוצגת השוואה בין חלק מהשינויים בסוג המניין AudioFormat בגרסה 7:

audioformat-change

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

ברשימה הבאה מפורטים סוגי המאפיינים של enum שהומרו ל-string:

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

העברת ערכי 'טיפוסים בני מנייה (enum)'

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

audio-passing-values

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

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

  1. ערך המאפיין enum של AudioFormat מומר לערך מחרוזת ב-libaudiohal ומוענק ל-HAL.
  2. בצד ה-HAL, מעטפת ברירת המחדל ממירה את המחרוזת לערך enum, שמוענק ל-HAL הקודם.

שינויים בסכימת XML

רשימות מלאות של ערכי enum בהגדרת הסכימה של XML‏ (XSD) מאפשרות לבצע אימות טוב יותר של קובץ ה-XML של הגדרת מדיניות האודיו על ידי VTS. ביצענו שינויים בקובץ התצורה של מדיניות האודיו שמשמש ב-HAL V7 כדי לעמוד בדרישות של XSD.

בגרסה 7, נעשה שימוש בתו (רווח) סטנדרטי כדי להפריד בין רשימות ערכים במאפיינים (כמו שיעורי דגימה, מסיכות ערוצים ודגלים), במקום בסמלים , (פסיק) ו-| (קו אנכי) שנעשה בהם שימוש בגרסה 6 ובגרסאות קודמות. כמו שאפשר לראות בדוגמה הבאה, רווח משמש להפרדה בין רשימת הערכים של channelMasks:

<profile channelMasks="AUDIO_CHANNEL_OUT_STEREO AUDIO_CHANNEL_OUT_MONO" … />

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

לדוגמה, בגרסה 6 ואילך, משתמשים לעיתים קרובות ב-triple של <format, sampling rate, channel mask> בממשקים ובסוגים של HIDL. כדי להסיר את היתירות הזו, ב-V7, סוג הנתונים 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} תהיה תקינה, היא צריכה לכלול שלושה תווים אלפאנומריים או יותר.

ב-V7, צריך להשתמש בפורמט הבא:

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
9 Android 4.0
Android 8 2.0