In den folgenden Abschnitten wird beschrieben, wie Sie mit der Hardware-Abstraktionsschicht (Hardware Abstraction Layer, HAL) arbeiten, um Broadcast-Radio zu implementieren.
HAL-Schnittstelle für Broadcast-Radio
Das Broadcast Radio HAL bietet Datenstrukturen und Schnittstellen auf Hardwareebene zur Implementierung von Rundfunk, z. B. AM/FM- und DAB-Radio.
HIDL 2.0- und AIDL-Schnittstellen
Das Broadcast-Radio-HAL verwendet die in den folgenden Abschnitten beschriebenen Schnittstellen.
IAnnouncementListener
IAnnouncementListener ist die Callback-Schnittstelle für den Ansagen-Listener, der in der Broadcast-Radio-HAL registriert werden kann, um Ansagen zu empfangen. Die Schnittstelle hat die folgenden Methoden:
| IAnnouncementListener | ||
|---|---|---|
| Beschreibung:Wird aufgerufen, wenn sich die Liste der Ankündigungen geändert hat. | ||
| HIDL 2.0 | oneway onListUpdated(vec<Announcement> announcements) |
|
| AIDL | oneway void onListUpdated(in Announcement[] announcements) |
|
ICloseHandle
ICloseHandle ist das generische Schließungshandle zum Entfernen eines Callbacks, für den keine aktive Schnittstelle erforderlich ist.
| ICloseHandle | ||
|---|---|---|
| Beschreibung:Schließen Sie den Griff. | ||
| HIDL 2.0 | close() |
|
| AIDL | void close() |
|
ITunerCallback
ITunerCallback ist die Callback-Schnittstelle, die von der Broadcast-Radio-HAL aufgerufen wird, um Updates an den HAL-Clientdienst zu senden.
| ITunerCallback | ||
|---|---|---|
| Beschreibung:Wird von der HAL aufgerufen, wenn ein Tuning-Vorgang (tune, seek (in AIDL) oder scan (in HIDL) und step) asynchron fehlschlägt. | ||
| HIDL 2.0 | oneway onCurrentProgramInfoChanged(ProgramInfo info) |
|
| AIDL | void onCurrentProgramInfoChanged(in ProgramInfo info) |
|
| Beschreibung:Wird aufgerufen, wenn „tune“, „seek“ (in AIDL) oder „scan“ (in HIDL) oder „step“ erfolgreich ausgeführt wurde. | ||
| HIDL 2.0 | oneway onTuneFailed(Result result, ProgramSelector selector) |
|
| AIDL | void onTuneFailed(in Result result, in ProgramSelector selector) |
|
| Beschreibung:Wird aufgerufen, wenn „tune“, „seek“ (in AIDL) oder „scan“ (in HIDL) oder „step“ erfolgreich ausgeführt wurde. | ||
| HIDL 2.0 | oneway onCurrentProgramInfoChanged(ProgramInfo info) |
|
| AIDL | void onCurrentProgramInfoChanged(in ProgramInfo info) |
|
| Beschreibung:Wird aufgerufen, wenn die Programmliste aktualisiert wird. Die Größe der einzelnen Chunks sollte auf 500 KiB begrenzt sein. | ||
| HIDL 2.0 | oneway onProgramListUpdated(ProgramListChunk chunk) |
|
| AIDL | void onProgramListUpdated(ProgramListChunk chunk) |
|
| Beschreibung:Wird aufgerufen, wenn die Antenne angeschlossen oder getrennt wird. | ||
| HIDL 2.0 | oneway onAntennaStateChange(bool connected) |
|
| AIDL | void onCurrentProgramInfoChanged(in ProgramInfo info) |
|
Beschreibung:Wird aufgerufen, wenn anbieterspezifische Parameterwerte intern in HAL aktualisiert werden. Nicht nach dem Aufrufen von setParameters durch den HAL-Client aufrufen. |
||
| HIDL 2.0 | oneway onParametersUpdated(vec<VendorKeyValue> parameters) |
|
| AIDL | void onParametersUpdated(in VendorKeyValue[] parameters) |
|
Beschreibung:Neu in AIDL. Wird aufgerufen, wenn das Konfigurationsflag intern in der HAL aktualisiert wird. Sollte nicht nach dem Aufrufen von setConfigFlag durch den HAL-Client aufgerufen werden. |
||
| HIDL 2.0 | Nicht zutreffend | |
| AIDL | void onConfigFlagUpdated(in ConfigFlag flag, in boolean value) |
|
IBroadcastRadio
IBroadcastRadio ist die primäre Schnittstelle für das Broadcast-Radio-HAL. Verwenden Sie in der HIDL 2.0-HAL die ITunerSession-Schnittstelle zum Tuner, um Vorgänge aufzurufen. Es ist jedoch immer nur ein Tuner aktiv, sofern jede Broadcast Radio HAL-Instanz nur einen Tuner-Chip hat.
ITunerSession wurde aus den AIDL-Schnittstellen entfernt und die zugehörigen Schnittstellen wurden nach IBroadcastRadio verschoben.
| IBroadcastRadio | ||
|---|---|---|
| Beschreibung:Beschreibung eines Moduls und seiner Funktionen abrufen. | ||
| HIDL 2.0 | getProperties() generates (Properties properties) |
|
| AIDL | Properties getProperties() |
|
| Beschreibung:Ruft die aktuelle oder mögliche AM/FM-Regionskonfiguration ab. | ||
| HIDL 2.0 | getAmFmRegionConfig(bool full) generates (Result result, AmFmRegionConfig
config) |
|
| AIDL | AmFmRegionConfig getAmFmRegionConfig(bool full) |
|
| Beschreibung:Ruft die aktuelle DAB-Regionskonfiguration ab. | ||
| HIDL 2.0 | getDabRegionConfig() generates (Result result, vec<DabTableEntry>
config) |
|
| AIDL | DabTableEntry[] getDabRegionConfig() |
|
| Beschreibung:Ruft ein Bild aus dem Cache des Funkmoduls ab. In AIDL darf die Bildgröße aufgrund einer harten Beschränkung des Binder-Transaktionspuffers weniger als 1 MB betragen. | ||
| HIDL 2.0 | getImage(uint32_t id) generates (vec<uint8_t> image) |
|
| AIDL | byte[] getImage(in int id) |
|
| Beschreibung:Registriert den Listener für Ankündigungen. | ||
| HIDL 2.0 | registerAnnouncementListener(vec<AnnouncementType>
enabled,IAnnouncementListener listener) generates (Result result, ICloseHandle
closeHandle) |
|
| AIDL | ICloseHandle registerAnnouncementListener(in IAnnouncementListener listener, in
AnnouncementType[] enabled) |
|
Beschreibung:
|
||
| HIDL 2.0 | openSession(ITunerCallback callback) generiert
(Result result, ITunerSession session) |
|
| AIDL | void setTunerCallback(in ITunerCallback callback) |
|
Beschreibung:
|
||
| HIDL 2.0 | close() |
|
| AIDL | unsetTunerCallback() |
|
| Beschreibung:Schaltet auf ein bestimmtes Programm um. | ||
| HIDL 2.0 | tune(ProgramSelector program) generates (Result result) |
|
| AIDL | void tune(in ProgramSelector program) |
|
Beschreibung:Sucht das nächste gültige Programm auf air. Um Verwirrung in AIDL zu vermeiden, wird scan in seek umbenannt.
|
||
| HIDL 2.0 | scan(bool directionUp, bool skipSubChannel) generates (Result result) |
|
| AIDL | void seek(in boolean directionUp, in boolean skipSubChannel) |
|
| Beschreibung:Schritte zum benachbarten Kanal, der nicht von einem Programm belegt sein darf. | ||
| HIDL 2.0 | step(bool directionUp) generates (Result result) |
|
| AIDL | void step(in boolean directionUp) |
|
| Beschreibung:Bricht ausstehende Vorgänge zum Abstimmen, Scannen (in HIDL) oder Suchen (in AIDL) oder zum Ausführen von Schritten ab. | ||
| HIDL 2.0 | cancel() |
|
| AIDL | void cancel() |
|
Beschreibung:Wendet einen Filter auf die Programmliste an und beginnt mit dem Senden von Programmlisten-Updates über den onProgramListUpdated-Callback. |
||
| HIDL 2.0 | startProgramListUpdates(ProgramFilter filter) generates (Result result) |
|
| AIDL | void startProgramListUpdates(in ProgramFilter filter) |
|
| Beschreibung:Das Senden von Updates für die Programmliste wird beendet. | ||
| HIDL 2.0 | stopProgramListUpdates() |
|
| AIDL | void stopProgramListUpdates() |
|
| Beschreibung:Ruft die aktuelle Einstellung eines bestimmten Konfigurationsflags ab. | ||
| HIDL 2.0 | isConfigFlagSet(ConfigFlag flag) generates (Result result, bool value) |
|
| AIDL | boolean isConfigFlagSet(in ConfigFlag flag) |
|
| Beschreibung:Legt das angegebene Konfigurationsflag fest. | ||
| HIDL 2.0 | setConfigFlag(ConfigFlag flag, bool value) generates (Result result) |
|
| AIDL | void setConfigFlag(in ConfigFlag flag, boolean value) |
|
| Beschreibung:Legt anbieterspezifische Parameterwerte fest. | ||
| HIDL 2.0 | setParameters(vec<VendorKeyValue> parameters)
generates, (vec<VendorKeyValue> results) |
|
| AIDL | VendorKeyValue[] setParameters(in VendorKeyValue[] parameters) |
|
| Beschreibung:Ruft anbieterspezifische Parameterwerte ab. | ||
| HIDL 2.0 | getParameters(vec<string> keys) generates (vec<VendorKeyValue>
parameters) |
|
| AIDL | VendorKeyValue[] getParameters(in String[] keys) |
|
Erläuterungen zur Benutzeroberfläche
Asynchrones Verhalten
Da jeder Abstimmungsvorgang (z. B. „tune“, „scan“ (in HIDL) oder „seek“ (in AIDL) und „step“) zeitaufwendig sein kann und der Thread nicht lange blockiert werden sollte, sollten zeitaufwendige Vorgänge für später geplant und schnell ein Status oder Ergebnis zurückgegeben werden. Im Detail sollte jeder Vorgang:
- Alle ausstehenden Abstimmungsvorgänge abbrechen.
- Prüfen Sie, ob der Vorgang anhand der Methodeingaben und des Status des Tuners verarbeitet werden kann.
- Planen Sie die Abstimmungsaufgabe und geben Sie dann sofort
Result(in HIDL) oderstatus(in AIDL) zurück. WennResultoderstatusOKist, muss der Tuner-CallbacktuneFailedodercurrentProgramInfoChangedaufgerufen werden, wenn die Abstimmungsaufgabe fehlgeschlagen ist (z. B. aufgrund eines Zeitlimits) oder abgeschlossen wurde.
Entsprechend plant startProgramListUpdates auch die zeitaufwendige Aufgabe, die Programmliste später zu aktualisieren und schnell einen Status oder ein Ergebnis zurückzugeben. Mit der Methode werden zuerst ausstehende Aktualisierungsanfragen abgebrochen. Anschließend wird die Aktualisierungsaufgabe geplant und das Ergebnis wird schnell zurückgegeben.
Race-Bedingung
Aufgrund des asynchronen Verhaltens von Tuning-Vorgängen (z. B. „tune“, „scan“ (in HIDL) oder „seek“ (in AIDL) und „step“) besteht eine Race Condition zwischen dem Abbrechen des Vorgangs und den Tuning-Vorgängen. Wenn cancel aufgerufen wird, nachdem das HAL einen Abstimmungsvorgang abgeschlossen hat und bevor der Callback abgeschlossen ist, kann der Abbruch ignoriert werden. Der Callback sollte abgeschlossen und vom HAL-Client empfangen werden.
Wenn stopProgramListUpdates aufgerufen wird, nachdem das HAL eine Aktualisierung der Programmliste abgeschlossen hat und bevor der onCurrentProgramInfoChanged-Callback abgeschlossen ist, kann stopProgramListUpdates ignoriert werden und der Callback sollte abgeschlossen werden.
Datenlimit
Da es ein festes Limit für den Binder-Transaktionspuffer gibt, wird das Datenlimit für einige Schnittstellenmethoden, die Daten von potenziell großer Größe übergeben, im AIDL-HAL klargestellt.
getImageerfordert, dass das zurückgegebene Bild weniger als 1 MB groß ist.- Bei
onProgramListUpdatedarf jedechunkmaximal 500 KiB groß sein. Größere Programmlisten müssen von der HAL-Implementierung in mehrere Chunks aufgeteilt und über mehrere Callbacks gesendet werden.
Änderungen an AIDL-HAL-Datenstrukturen
Zusätzlich zu den Änderungen an den Schnittstellen wurden diese Änderungen auf die in der AIDL-HAL für Broadcast-Radio definierten Datenstrukturen angewendet, die AIDL nutzen.
- Die
Constant-Enumeration wird in AIDL entfernt und als „const int“ inIBroadcastRadiodefiniert. In der Zwischenzeit wirdANTENNA_DISCONNECTED_TIMEOUT_MSinANTENNA_STATE_CHANGE_TIMEOUT_MSumbenannt. Eine neue const intTUNER_TIMEOUT_MSwird hinzugefügt. Alle Vorgänge zum Abstimmen, Suchen und Schrittweisen müssen innerhalb dieses Zeitraums abgeschlossen werden. - Die Enums
RDSundDeemphasiswerden in AIDL entfernt und als „const int“ inAmFmRegionConfigdefiniert. Entsprechend werden sowohlfmDeemphasisals auchfmRdsinProgramInfoals „int“ deklariert, ein Bitberechnungsergebnis der entsprechenden Flags. In der Zwischenzeit werdenD50undD75inDEEMPHASIS_D50bzw.DEEMPHASIS_D75umbenannt. - Die Enumeration
ProgramInfoFlagswird in AIDL entfernt und als „const int“ inProgramInfomit dem PräfixFLAG_definiert. Entsprechend wirdinfoFlagsinProgramInfoals int deklariert, ein Bitberechnungsergebnis von Flags.TUNEDwird inFLAG_TUNABLEumbenannt, um die Definition besser zu beschreiben, auf die die Station eingestellt werden kann. - In
AmFmBandRangewirdscanSpacinginseekSpacingumbenannt, dascanin AIDL inseekumbenannt wird. - Da das Konzept der Union in AIDL eingeführt wird, werden
MetadataKeyundMetadata, die in HIDL HAL definiert sind, nicht mehr verwendet. Eine AIDL-UnionMetadatawird in der AIDL-HAL definiert. Jeder Enum-Wert, der sich zuvor inMetadataKeybefand, ist jetzt ein Feld inMetadatamit dem Typ „string“ oder „int“, je nach Definition.
Unterstützung von DAB-Radio
In diesem Abschnitt wird die Unterstützung von DAB-Radio beschrieben.
IDs
Der primäre ID-Typ für DAB- und DMB-Radio im AIDL Broadcast Radio HAL ist DAB_SID_EXT. DAB_SID_EXT verwendet 32-Bit-Dienstkennungen (Service IDs, SIDs), um die SID von DAB- und DMB-Radio darstellen zu können.
Neben primären IDs werden auch sekundäre IDs wie DAB_ENSEMBLE und DAB_FREQUENCY_KHZ unterstützt. Das ist wichtig, da sich mehrere DAB-Sender einen DAB_SID_EXT teilen können, aber unterschiedliche DAB_ENSEMBLE- oder DAB_FREQUENCY_KHZ-Werte haben. Damit die Programmliste korrekt aktualisiert wird, werden Sender mit derselben DAB_SID_EXT gemeinsam über ITunerCallback#onProgramListUpdated aktualisiert. Diese Aktualisierung wird dann an den Broadcast Radio Service und den Radio Manager und schließlich über android.hardware.radio.ProgramList an die Radio-App weitergeleitet.
Metadaten
In der folgenden Tabelle sind die unterstützten Metadaten für DAB im AIDL Broadcast Radio HAL aufgeführt:
| Metadatenfeld | Beschreibung |
|---|---|
dabEnsembleName (abgekürzte Form: dabEnsembleNameShort) |
Name des Ensembles des DAB-Senders |
dabServiceName (abgekürzt aus dabServiceNameShort) |
Dienstname des DAB-Senders |
dabComponentName (abgekürzt aus dabComponentNameShort) |
Komponentenname des DAB-Senders |
Unterstützung von HD‑Radio
In diesem Abschnitt wird die Unterstützung von HD-Radio beschrieben.
IDs
HD_STATION_ID_EXT dient als primäre Kennung für HD-Radiosender. Zur weiteren Verbesserung der Senderidentifizierung werden auch sekundäre Kennungen wie HD_STATION_NAME und HD_STATION_LOCATION bereitgestellt. HD_STATION_LOCATION, das Standortinformationen bereitstellt, wurde in Android 15 eingeführt.
Digitalradio aktivieren oder deaktivieren
Ab Android 15 können Sie digitales Radio (z. B. HD‑Radio) aktivieren oder deaktivieren, indem Sie die ConfigFlag anpassen. Verwenden Sie das Flag FORCE_ANALOG_FM, um diese Einstellung für FM-Radio zu steuern, und das Flag FORCE_ANALOG_AM für AM-Radio.
Wenn Sie das Flag auf false setzen, wird HD-Radio aktiviert. Wenn Sie es auf true setzen, wird analoges AM/FM-Radio erzwungen.
HD-Kanäle verfügbar
Ab Android 15 können die HD-Kanäle, die derzeit für einen HD-Radiosender verfügbar sind, durch eine Bitmaske von 8 Bit, Metadata#hdSubChannelsAvailable, in ProgramInfo.metadata dargestellt werden. Der Wert von Bit 1 von links gibt beispielsweise an, ob der HD2-Unterkanal für diesen HD-Sender verfügbar ist.
Status der Signalerfassung
In Android 15 und höher können Radio-Apps Nutzern den Status der Signalaufnahme von HD-Radiosendern anzeigen. Das ist hilfreich, da es manchmal einige Momente dauern kann, bis ein starkes HD-Signal empfangen wird.
Das System verwendet ProgramInfo.infoFlags, um den Status zu erfassen, und aktualisiert die Radio-App über ITunerCallback#onCurrentProgramInfoChanged..
So wird der Status in ProgramInfo.infoFlags dargestellt:
- Bit 6: Gibt an, ob das HD-Radiosignal empfangen wurde.
- Bit 7: Gibt an, ob SIS-Daten (Station Information Service) verfügbar sind. SIS bietet zusätzliche Informationen zum Sender und zum Programm.
- Bit 8: Gibt an, ob digitales HD-Audio verfügbar ist.
Metadaten
In der folgenden Tabelle sind die unterstützten HD Radio-Metadaten für Android 15 und höher aufgeführt.
| Metadatenfeld | Beschreibung |
|---|---|
commentShortDescription |
Kurze Kontextbeschreibung des Kommentars |
commentActualText |
Text des Kommentars |
commercial |
Radiowerbung |
ufids |
Eindeutige Dateikennungen (UFIDs), die dem Inhalt zugeordnet sind |
hdStationNameShort |
Der Kurzname oder universelle Kurzname des HD-Radiosenders |
hdStationNameLong |
Der vollständige Name des HD-Radiosenders, der Slogan oder eine Nachricht des Senders. |
Notfallbenachrichtigungen
In Android 15 und höher werden Notfallbenachrichtigungen für HD-Radiosender unterstützt, um Nutzer von Radio-Apps über die von Radiosendern gesendeten Notfallbenachrichtigungen zu informieren.
Die Notfallbenachrichtigung (Alert) entspricht dem Common Alerting Protocol (CAP) 1.2 Standard und unterstützt die in der folgenden Tabelle aufgeführten Benachrichtigungen:
| Benachrichtigungsinformationen | Beschreibung | Verfügbare Enum-Werte |
|---|---|---|
AlertStatus |
Status der Benachrichtigung | ACTUAL, EXERCISE, TEST |
AlertMessageType |
Art der Notfallbenachrichtigung | ALERT, UPDATE, CANCEL |
AlertCategory |
Kategorie des Ereignisses, auf das sich die Notfallbenachrichtigung bezieht | GEO, MET, SAFETY, SECURITY,
RESCUE, FIRE, HEALTH, ENV,
TRANSPORT, INFRA, CBRNE, OTHER |
AlertUrgency |
Dringlichkeit des Ereignisses, auf das sich die Notfallbenachrichtigung bezieht | IMMEDIATE, EXPECTED, FUTURE, PAST, UNKNOWN |
AlertSeverity |
Schwere des Ereignisses, auf das sich die Notfallbenachrichtigung bezieht | EXTREME, SEVERE, MODERATE, MINOR, UNKNOWN |
AlertCertainty |
Gewissheit des Ereignisses, auf das sich die Notfallbenachrichtigung bezieht | OBSERVED, LIKELY, POSSIBLE, UNLIKELY, UNKNOWN |
Alert (mit den Informationen in der Tabelle), SMS-Benachrichtigungen und AlertArea verwenden, um Informationen zur aktuellen Benachrichtigung anzuzeigen.
Alert ist ein optionales Feld in ProgramInfo, sodass es über Tuner-Callbacks vom Broadcast Radio HAL an Radio-Apps gesendet werden kann, um aktuelle Programminformationen und Programmlisten-Updates zu erhalten.