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. WennResult
oderstatus
OK
ist, muss der Tuner-CallbacktuneFailed
odercurrentProgramInfoChanged
aufgerufen 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.
getImage
erfordert, dass das zurückgegebene Bild weniger als 1 MB groß ist.- Bei
onProgramListUpdate
darf jedechunk
maximal 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“ inIBroadcastRadio
definiert. In der Zwischenzeit wirdANTENNA_DISCONNECTED_TIMEOUT_MS
inANTENNA_STATE_CHANGE_TIMEOUT_MS
umbenannt. Eine neue const intTUNER_TIMEOUT_MS
wird hinzugefügt. Alle Vorgänge zum Abstimmen, Suchen und Schrittweisen müssen innerhalb dieses Zeitraums abgeschlossen werden. - Die Enums
RDS
undDeemphasis
werden in AIDL entfernt und als „const int“ inAmFmRegionConfig
definiert. Entsprechend werden sowohlfmDeemphasis
als auchfmRds
inProgramInfo
als „int“ deklariert, ein Bitberechnungsergebnis der entsprechenden Flags. In der Zwischenzeit werdenD50
undD75
inDEEMPHASIS_D50
bzw.DEEMPHASIS_D75
umbenannt. - Die Enumeration
ProgramInfoFlags
wird in AIDL entfernt und als „const int“ inProgramInfo
mit dem PräfixFLAG_
definiert. Entsprechend wirdinfoFlags
inProgramInfo
als int deklariert, ein Bitberechnungsergebnis von Flags.TUNED
wird inFLAG_TUNABLE
umbenannt, um die Definition besser zu beschreiben, auf die die Station eingestellt werden kann. - In
AmFmBandRange
wirdscanSpacing
inseekSpacing
umbenannt, dascan
in AIDL inseek
umbenannt wird. - Da das Konzept der Union in AIDL eingeführt wird, werden
MetadataKey
undMetadata
, die in HIDL HAL definiert sind, nicht mehr verwendet. Eine AIDL-UnionMetadata
wird in der AIDL-HAL definiert. Jeder Enum-Wert, der sich zuvor inMetadataKey
befand, ist jetzt ein Feld inMetadata
mit 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.