בקטעים הבאים מוסבר איך לעבוד עם שכבת הפשטת החומרה (HAL) כדי להטמיע רדיו לשידור.
ממשק HAL של שידורי רדיו
שכבת ה-HAL של רדיו השידור מספקת מבני נתונים וממשקים ברמת החומרה כדי להטמיע רדיו שידור, כמו רדיו AM/FM ו-DAB.
ממשקי HIDL 2.0 ו-AIDL
שכבת ה-HAL של רדיו השידור משתמשת בממשקים שמתוארים בקטעים הבאים.
IAnnouncementListener
IAnnouncementListener הוא ממשק הקריאה החוזרת של ה-listener להודעות, שאפשר לרשום אותו ב-HAL של רדיו השידור כדי לקבל הודעות. לממשק יש את השיטות הבאות:
| IAnnouncementListener | ||
|---|---|---|
| תיאור: מופעל בכל פעם שרשימת ההודעות משתנה. | ||
| HIDL 2.0 | oneway onListUpdated(vec<Announcement> announcements) |
|
| AIDL | oneway void onListUpdated(in Announcement[] announcements) |
|
ICloseHandle
ICloseHandle הוא ה-handle הכללי לסגירה שמשמש להסרת callback שלא צריך ממשק פעיל.
| ICloseHandle | ||
|---|---|---|
| תיאור: סוגרים את הידית. | ||
| HIDL 2.0 | close() |
|
| AIDL | void close() |
|
ITunerCallback
ITunerCallback הוא ממשק הקריאה החוזרת שמופעל על ידי HAL של רדיו השידור כדי לשלוח עדכונים לשירות הלקוח של HAL.
| ITunerCallback | ||
|---|---|---|
| תיאור: הפונקציה הזו מופעלת על ידי HAL כשפעולת כוונון (tune, seek (in AIDL) or scan (in HIDL) and step succeeds) נכשלת באופן אסינכרוני. | ||
| HIDL 2.0 | oneway onCurrentProgramInfoChanged(ProgramInfo info) |
|
| AIDL | void onCurrentProgramInfoChanged(in ProgramInfo info) |
|
| תיאור: מופעל כשפעולות כמו כוונון, חיפוש (ב-AIDL) או סריקה (ב-HIDL) או מעבר שלב מצליחות. | ||
| HIDL 2.0 | oneway onTuneFailed(Result result, ProgramSelector selector) |
|
| AIDL | void onTuneFailed(in Result result, in ProgramSelector selector) |
|
| תיאור: מופעל כשפעולות כמו כוונון, חיפוש (ב-AIDL) או סריקה (ב-HIDL) או מעבר שלב מצליחות. | ||
| HIDL 2.0 | oneway onCurrentProgramInfoChanged(ProgramInfo info) |
|
| AIDL | void onCurrentProgramInfoChanged(in ProgramInfo info) |
|
| תיאור: מופעל כשרשימת התוכניות מתעדכנת. הגודל של כל נתח צריך להיות מוגבל ל-500KiB. | ||
| HIDL 2.0 | oneway onProgramListUpdated(ProgramListChunk chunk) |
|
| AIDL | void onProgramListUpdated(ProgramListChunk chunk) |
|
| תיאור: מופעל כשהאנטנה מחוברת או מנותקת. | ||
| HIDL 2.0 | oneway onAntennaStateChange(bool connected) |
|
| AIDL | void onCurrentProgramInfoChanged(in ProgramInfo info) |
|
תיאור: מופעל כשערכי פרמטרים ספציפיים לספק מתעדכנים באופן פנימי ב-HAL (לא מופעל אחרי קריאה ל-setParameters על ידי לקוח HAL). |
||
| HIDL 2.0 | oneway onParametersUpdated(vec<VendorKeyValue> parameters) |
|
| AIDL | void onParametersUpdated(in VendorKeyValue[] parameters) |
|
תיאור: תכונה חדשה ב-AIDL. הפונקציה מופעלת כשהדגל של ההגדרה מתעדכן באופן פנימי ב-HAL (לא אמורה להיות הפעלה אחרי קריאה ל-setConfigFlag על ידי לקוח HAL). |
||
| HIDL 2.0 | לא ישים. | |
| AIDL | void onConfigFlagUpdated(in ConfigFlag flag, in boolean value) |
|
IBroadcastRadio
IBroadcastRadio הוא הממשק הראשי של HAL של רדיו השידור. ב-HIDL
2.0 HAL, משתמשים בממשק ITunerSession של הטיונר כדי להפעיל פעולות. עם זאת, לכל היותר טיונר אחד פעיל בכל פעם (בתנאי שלכל מופע HAL של רדיו שידור יש רק שבב טיונר אחד).
ITunerSession הוסר מהממשקים של AIDL והממשקים שלו הועברו אל IBroadcastRadio.
| IBroadcastRadio | ||
|---|---|---|
| תיאור: קבלת תיאור של מודול והיכולות שלו. | ||
| HIDL 2.0 | getProperties() generates (Properties properties) |
|
| AIDL | Properties getProperties() |
|
| תיאור: אחזור של הגדרות האזור הנוכחיות או האפשריות של AM/FM. | ||
| HIDL 2.0 | getAmFmRegionConfig(bool full) generates (Result result, AmFmRegionConfig
config) |
|
| AIDL | AmFmRegionConfig getAmFmRegionConfig(bool full) |
|
| תיאור: אחזור של הגדרות האזור הנוכחיות של DAB. | ||
| HIDL 2.0 | getDabRegionConfig() generates (Result result, vec<DabTableEntry>
config) |
|
| AIDL | DabTableEntry[] getDabRegionConfig() |
|
| תיאור: מקבל תמונה מהמטמון של מודול הרדיו. ב-AIDL, גודל התמונה חייב להיות קטן מ-1MB בגלל מגבלה קשיחה על מאגר העסקאות של ה-binder. | ||
| HIDL 2.0 | getImage(uint32_t id) generates (vec<uint8_t> image) |
|
| AIDL | byte[] getImage(in int id) |
|
| תיאור: רישום של מעבד האירוע של ההודעה. | ||
| HIDL 2.0 | registerAnnouncementListener(vec<AnnouncementType>
enabled,IAnnouncementListener listener) generates (Result result, ICloseHandle
closeHandle) |
|
| AIDL | ICloseHandle registerAnnouncementListener(in IAnnouncementListener listener, in
AnnouncementType[] enabled) |
|
תיאור:
|
||
| HIDL 2.0 | openSession(ITunerCallback callback) יוצר
(Result result, ITunerSession session) |
|
| AIDL | void setTunerCallback(in ITunerCallback callback) |
|
תיאור:
|
||
| HIDL 2.0 | close() |
|
| AIDL | unsetTunerCallback() |
|
| תיאור: מעבר לערוץ של תוכנית ספציפית. | ||
| HIDL 2.0 | tune(ProgramSelector program) generates (Result result) |
|
| AIDL | void tune(in ProgramSelector program) |
|
תיאור: המערכת מחפשת את התוכנית התקפה הבאה בשידור. כדי למנוע בלבול ב-AIDL,
השם scan משתנה ל-seek.
|
||
| HIDL 2.0 | scan(bool directionUp, bool skipSubChannel) generates (Result result) |
|
| AIDL | void seek(in boolean directionUp, in boolean skipSubChannel) |
|
| תיאור: שלבים להגעה לערוץ הסמוך, שאולי לא מוצגת בו תוכנית. | ||
| HIDL 2.0 | step(bool directionUp) generates (Result result) |
|
| AIDL | void step(in boolean directionUp) |
|
| תיאור: ביטול של פעולות בהמתנה של כוונון, סריקה (ב-HIDL) או חיפוש (ב-AIDL) או פעולות של מעבר שלב. | ||
| HIDL 2.0 | cancel() |
|
| AIDL | void cancel() |
|
תיאור: מחיל מסנן על רשימת הערוצים ומתחיל לשלוח עדכונים של רשימת הערוצים באמצעות קריאה חוזרת (callback) של onProgramListUpdated. |
||
| HIDL 2.0 | startProgramListUpdates(ProgramFilter filter) generates (Result result) |
|
| AIDL | void startProgramListUpdates(in ProgramFilter filter) |
|
| תיאור: מפסיק את השליחה של עדכונים לרשימת התוכניות. | ||
| HIDL 2.0 | stopProgramListUpdates() |
|
| AIDL | void stopProgramListUpdates() |
|
| תיאור: אחזור ההגדרה הנוכחית של דגל תצורה נתון. | ||
| HIDL 2.0 | isConfigFlagSet(ConfigFlag flag) generates (Result result, bool value) |
|
| AIDL | boolean isConfigFlagSet(in ConfigFlag flag) |
|
| תיאור: מגדיר את דגל ההגדרה שצוין. | ||
| HIDL 2.0 | setConfigFlag(ConfigFlag flag, bool value) generates (Result result) |
|
| AIDL | void setConfigFlag(in ConfigFlag flag, boolean value) |
|
| תיאור: הגדרת ערכי פרמטרים ספציפיים לספק. | ||
| HIDL 2.0 | setParameters(vec<VendorKeyValue> parameters)
יוצר, (vec<VendorKeyValue> results) |
|
| AIDL | VendorKeyValue[] setParameters(in VendorKeyValue[] parameters) |
|
| תיאור: מאחזר ערכי פרמטרים ספציפיים לספק. | ||
| HIDL 2.0 | getParameters(vec<string> keys) generates (vec<VendorKeyValue>
parameters) |
|
| AIDL | VendorKeyValue[] getParameters(in String[] keys) |
|
הבהרות בנוגע לממשק
התנהגות אסינכרונית
מכיוון שכל פעולת כוונון (לדוגמה, כוונון, סריקה (ב-HIDL) או חיפוש (ב-AIDL) וצעד) עשויה להיות ארוכה, והשרשור לא צריך להיות חסום למשך זמן רב, הפעולה צריכה לתזמן פעולות ארוכות למועד מאוחר יותר ולהחזיר במהירות סטטוס או תוצאה. בפירוט, כל פעולה צריכה:
- ביטול כל פעולות ההתאמה שממתינות.
- בודקים אם אפשר לעבד את הפעולה על סמך נתוני הקלט של השיטה והסטטוס של מכוון התדרים.
- מתזמנים את משימת הכוונון ומחזירים את
Result(ב-HIDL) או אתstatus(ב-AIDL) באופן מיידי. אם הערך שלResultאוstatusהואOK, צריך לקרוא ל-callback של המקלטtuneFailedאוcurrentProgramInfoChangedכשתהליך הכוונון נכשל (למשל, בגלל פסק זמן) או כשהוא מסתיים.
באופן דומה, השיטה startProgramListUpdates מתזמנת את המשימה של עדכון רשימת התוכניות למועד מאוחר יותר, כדי להחזיר במהירות סטטוס או תוצאה. השיטה הזו מבטלת קודם בקשות עדכון בהמתנה, ואז מתזמנת את משימת העדכון ומחזירה את התוצאה במהירות.
מרוץ תהליכים
בגלל ההתנהגות האסינכרונית של פעולות כוונון (לדוגמה, כוונון, סריקה (ב-HIDL) או חיפוש (ב-AIDL) וצעד), קיים מצב של תחרות בין ביטול הפעולה לבין פעולות הכוונון. אם מתבצעת קריאה ל-cancel אחרי ש-HAL משלים פעולת כוונון ולפני שהקריאה החוזרת מסתיימת, אפשר להתעלם מהביטול והקריאה החוזרת צריכה להסתיים ולהתקבל על ידי לקוח HAL.
באופן דומה, אם מתבצעת קריאה ל-stopProgramListUpdates אחרי ש-HAL משלים עדכון של רשימת התוכניות ולפני שהקריאה החוזרת onCurrentProgramInfoChanged מסתיימת, אפשר להתעלם מ-stopProgramListUpdates והקריאה החוזרת צריכה להסתיים.
מגבלת גודל הנתונים
מכיוון שיש מגבלה קשיחה על מאגר הנתונים הזמני של עסקאות Binder, מגבלת הנתונים של חלק מהשיטות בממשק שמעבירות נתונים בגודל גדול פוטנציאלי מובהרת ב-AIDL HAL.
-
getImageדורש שהתמונה תהיה קטנה מ-1MB. onProgramListUpdateמחייב שכלchunkיהיה קטן מ-500kiB. רשימות תוכניות גדולות יותר צריכות להיות מחולקות על ידי הטמעת ה-HAL למספר מקטעים, ולהישלח באמצעות מספר קריאות חוזרות.
שינויים במבני הנתונים של AIDL HAL
בנוסף לשינויים בממשקי המשתמש, השינויים האלה חלים על מבני הנתונים שמוגדרים ב-HAL של AIDL לרדיו לשידור, שמנצל את ה-AIDL.
- הספירה
Constantהוסרה מ-AIDL ומוגדרת כ-const int ב-IBroadcastRadio. במקביל, השם שלANTENNA_DISCONNECTED_TIMEOUT_MSמשתנה ל-ANTENNA_STATE_CHANGE_TIMEOUT_MS. נוסף קבוע חדש מסוג intTUNER_TIMEOUT_MS. כל הפעולות של כוונון, חיפוש ודילוג חייבות להסתיים בתוך הזמן הזה. - הערכים
RDSו-Deemphasisמסוג Enum הוסרו ב-AIDL והוגדרו כ-const int ב-AmFmRegionConfig. בהתאם לכך, גםfmDeemphasisוגםfmRdsב-ProgramInfoמוצהרים כ-int, תוצאה של חישוב ביטים של הדגלים המתאימים. בינתיים, השמות שלD50ו-D75ישתנו ל-DEEMPHASIS_D50ו-DEEMPHASIS_D75, בהתאמה. - הספירה
ProgramInfoFlagsהוסרה מ-AIDL והוגדרה כ-const int ב-ProgramInfoעם הקידומתFLAG_. בהתאם לכך,infoFlagsב-ProgramInfoמוצהר כ-int, תוצאה של חישוב ביטים של דגלים. גם השםTUNEDשונה ל-FLAG_TUNABLE, כדי לתאר טוב יותר את ההגדרה שלו, שלפיה אפשר לכוון את התחנה. - ב-
AmFmBandRange, השם שלscanSpacingמשתנה ל-seekSpacing, כי השם שלscanמשתנה ל-seekב-AIDL. - מאחר שהמושג union הוצג ב-AIDL, כבר לא נעשה שימוש ב-
MetadataKeyוב-Metadataשהוגדרו ב-HIDL HAL. AIDL unionMetadataמוגדר ב-AIDL HAL. כל ערך enum שהיה קודם ב-MetadataKeyהוא עכשיו שדה ב-Metadataעם סוג של מחרוזת או int, בהתאם להגדרות שלו.
תמיכה ברדיו DAB
בקטע הזה מוסבר על תמיכה ברדיו DAB.
מזהים
סוג המזהה הראשי של רדיו DAB ו-DMB ב-AIDL Broadcast Radio HAL הוא DAB_SID_EXT. אפליקציית DAB_SID_EXT משתמשת במזהי שירות (SID) של 32 ביט כדי לייצג את ה-SID של רדיו DAB ו-DMB.
בנוסף למזהים העיקריים, יש תמיכה גם במזהים משניים כמו DAB_ENSEMBLE ו-DAB_FREQUENCY_KHZ. זה חשוב כי כמה תחנות DAB יכולות לשתף DAB_SID_EXT, אבל להשתמש בערכים שונים של DAB_ENSEMBLE או DAB_FREQUENCY_KHZ. כדי לוודא שרשימת התוכניות מתעדכנת בצורה מדויקת, תחנות עם אותו DAB_SID_EXT מתעדכנות יחד באמצעות ITunerCallback#onProgramListUpdated. העדכון הזה מועבר לשירות הרדיו של Broadcast ולמנהל הרדיו, ולבסוף לאפליקציית הרדיו דרך android.hardware.radio.ProgramList.
Metadata
בטבלה הבאה מוצגים המטא-נתונים הספציפיים ל-DAB שנתמכים ב-AIDL Broadcast Radio HAL:
| שדה מטא-נתונים | תיאור |
|---|---|
dabEnsembleName (טופס מקוצר: dabEnsembleNameShort) |
שם האנסמבל של תחנת DAB |
dabServiceName (קיצור של dabServiceNameShort) |
שם השירות של תחנת DAB |
dabComponentName (קיצור של dabComponentNameShort) |
שם הרכיב של תחנת DAB |
תמיכה ברדיו באיכות HD
בקטע הזה מוסבר על תמיכה ברדיו HD.
מזהים
HD_STATION_ID_EXT משמש כמזהה הראשי של תחנות רדיו HD. כדי לשפר עוד יותר את זיהוי התחנה, מסופקים גם מזהים משניים כמו HD_STATION_NAME ו-HD_STATION_LOCATION. HD_STATION_LOCATION, שמאפשרת לקבל מידע על מיקום, נוספה ב-Android 15.
הפעלה או השבתה של רדיו דיגיטלי
החל מ-Android 15, אפשר להפעיל או להשבית רדיו דיגיטלי (כמו רדיו HD) על ידי שינוי
ConfigFlag. כדי לשלוט בהגדרה הזו עבור רדיו FM, משתמשים בדגל FORCE_ANALOG_FM. כדי לשלוט בהגדרה הזו עבור רדיו AM, משתמשים בדגל FORCE_ANALOG_AM.
הגדרת הדגל ל-false מפעילה רדיו HD, והגדרת הדגל ל-true מחייבת שימוש ברדיו אנלוגי AM/FM.
ערוצים באיכות HD זמינים
החל מ-Android 15, הערוצים ב-HD שזמינים כרגע לתחנת רדיו ב-HD יכולים להיות מיוצגים על ידי מסיכת ביטים של 8 ביטים, Metadata#hdSubChannelsAvailable, ב-ProgramInfo.metadata. לדוגמה, הערך של ביט 1 משמאל מייצג אם ערוץ המשנה HD2 זמין לתחנת HD הזו.
סטטוס קבלת האות
ב-Android בגרסה 15 ומעלה, אפליקציות רדיו יכולות להציג למשתמשים את סטטוס קליטת האות של תחנות רדיו HD. התכונה הזו שימושית כי לפעמים לוקח כמה רגעים עד שהמכשיר קולט אות HD חזק.
כדי לספק את המידע הזה, המערכת משתמשת ב-ProgramInfo.infoFlags כדי לעקוב אחרי הסטטוס ומעדכנת את אפליקציית הרדיו באמצעות ITunerCallback#onCurrentProgramInfoChanged.
כך הסטטוס מוצג ב-ProgramInfo.infoFlags:
- ביט 6: מציין אם אות הרדיו HD נקלט.
- ביט 7: מציין אם נתונים של שירות מידע על תחנות (SIS) זמינים. מערכת SIS מספקת מידע נוסף על התחנה ועל התוכן שמופעל בה.
- ביט 8: מציין אם אודיו דיגיטלי באיכות HD זמין.
Metadata
בטבלה הבאה מוצגים המטא-נתונים של רדיו HD שנתמכים ב-Android 15 ובגרסאות מתקדמות יותר.
| שדה מטא-נתונים | תיאור |
|---|---|
commentShortDescription |
תיאור קצר של ההקשר של התגובה |
commentActualText |
טקסט התגובה |
commercial |
פרסומת ברדיו |
ufids |
מזהים ייחודיים של קבצים (UFID) שמשויכים לתוכן |
hdStationNameShort |
השם המקוצר או השם המקוצר האוניברסלי של תחנת הרדיו ב-HD |
hdStationNameLong |
השם הארוך של תחנת הרדיו ב-HD, הסלוגן שלה או הודעה מהתחנה. |
התרעות על מקרה חירום
ב-Android 15 ואילך, יש תמיכה בהתרעות על מקרי חירום לתחנות רדיו HD, כדי ליידע משתמשים באפליקציות רדיו על התרעות על מקרי חירום שנשלחות מתחנות רדיו.
התראת החירום (Alert) פועלת לפי התקן Common Alerting Protocol (CAP) 1.2, והיא תומכת בהתראות שמוצגות בטבלה הבאה:
| פרטי ההתראה | תיאור | ערכי enum זמינים |
|---|---|---|
AlertStatus |
סטטוס הודעת האזהרה | ACTUAL, EXERCISE TEST |
AlertMessageType |
סוג ההודעה של התרעה על מקרה חירום | ALERT, UPDATE CANCEL |
AlertCategory |
קטגוריה של אירוע הנושא של הודעת ההתרעה על מקרה חירום | GEO, MET, SAFETY, SECURITY,
RESCUE, FIRE, HEALTH, ENV,
TRANSPORT, INFRA, CBRNE, OTHER |
AlertUrgency |
דחיפות האירוע שמופיע בהודעת ההתרעה על מקרה חירום | IMMEDIATE, EXPECTED, FUTURE, PAST, UNKNOWN |
AlertSeverity |
רמת החומרה של אירוע הנושא בהודעת ההתרעה על מקרה חירום | EXTREME, SEVERE, MODERATE, MINOR, UNKNOWN |
AlertCertainty |
רמת הוודאות של אירוע הנושא בהודעת ההתרעה על מקרה חירום | OBSERVED, LIKELY, POSSIBLE, UNLIKELY, UNKNOWN |
Alert (שכולל את המידע שבטבלה), בהודעות טקסט של התראות וב-AlertArea כדי להציג מידע על ההתראה הנוכחית.
Alert הוא שדה אופציונלי ב-ProgramInfo כדי שאפשר יהיה לשלוח אותו מ-Broadcast Radio HAL לאפליקציות רדיו דרך קריאות חוזרות של מקלט לעדכונים של רשימת התוכניות ומידע על התוכנית הנוכחית.