In den folgenden Abschnitten wird beschrieben, wie Sie mit der Hardware Abstraction Layer (HAL) Radiosender implementieren.
HAL-Schnittstelle für Rundfunkradio
Die Broadcast Radio HAL bietet Datenstrukturen und Schnittstellen auf Hardwareebene zur Implementierung von Rundfunkradio, z. B. AM/FM und DAB-Radio.
HIDL 2.0- und AIDL-Schnittstellen
Die Broadcast-Radio-HAL verwendet die in den folgenden Abschnitten beschriebenen Schnittstellen.
IAnnouncementListener
IAnnouncementListener
ist die Callback-Schnittstelle für den Ansage-Listener, der beim Broadcast-Radio HAL registriert werden kann, um Ansagen zu empfangen. Die Schnittstelle hat folgende Methoden:
IAnnouncementListener | ||
---|---|---|
Beschreibung:Wird aufgerufen, wenn sich die Ansageliste geändert hat. | ||
HIDL 2.0 | oneway onListUpdated(vec<Announcement> announcements) |
|
AIDL | oneway void onListUpdated(in Announcement[] announcements) |
ICloseHandle
ICloseHandle
ist der generische Schließ-Handle, mit dem ein Callback entfernt wird, für den keine aktive Benutzeroberfläche erforderlich ist.
ICloseHandle | ||
---|---|---|
Beschreibung:Schließt den Handle. | ||
HIDL 2.0 | close() |
|
AIDL | void close() |
ITunerCallback
ITunerCallback
ist die Rückrufschnittstelle, die vom Broadcast-Radio-HAL aufgerufen wird, um Aktualisierungen an den HAL-Clientdienst zu senden.
ITunerCallback | ||
---|---|---|
Beschreibung:Wird von der HAL aufgerufen, wenn ein Tuningvorgang (Tune, Seek (in AIDL) oder Scan (in HIDL) und Schritt) 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) ausgeführt wird oder der Schritt erfolgreich war. | ||
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) ausgeführt wird oder der Schritt erfolgreich war. | ||
HIDL 2.0 | oneway onCurrentProgramInfoChanged(ProgramInfo info) |
|
AIDL | void onCurrentProgramInfoChanged(in ProgramInfo info) |
|
Beschreibung:Wird aufgerufen, wenn die Programmliste aktualisiert wird. Die Größe jedes Chunks sollte auf 500 KiB begrenzt sein. | ||
HIDL 2.0 | oneway onProgramListUpdated(ProgramListChunk chunk) |
|
AIDL | oneway 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 Aufruf 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 Aufruf 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 die Broadcast-Radio-HAL. Verwenden Sie in der HIDL 2.0 HAL die ITunerSession
-Schnittstelle zum Tuner, um Vorgänge aufzurufen. Normalerweise ist jedoch nur ein Tuner aktiv, sofern jede HAL-Instanz für die Übertragung von Radiosignalen nur einen Tuner-Chip hat.
ITunerSession
wurde aus den AIDL-Schnittstellen entfernt und seine Schnittstellen wurden zu IBroadcastRadio
verschoben.
IBroadcastRadio | ||
---|---|---|
Beschreibung:Beschreibung eines Moduls und seiner Funktionen. | ||
HIDL 2.0 | getProperties() generates (Properties properties) |
|
AIDL | Properties getProperties() |
|
Beschreibung:Hiermit wird die aktuelle oder mögliche AM/FM-Regionkonfiguration abgerufen. | ||
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:Hiermit wird ein Bild aus dem Cache des Funkmoduls abgerufen. In AIDL muss die Bildgröße aufgrund einer festen Grenze für den Binder-Transaktionsbuffer unter 1 MB liegen. | ||
HIDL 2.0 | getImage(uint32_t id) generates (vec<uint8_t> image) |
|
AIDL | byte[] getImage(in int id) |
|
Beschreibung:Registriert den Ansage-Listener. | ||
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:Wählt ein bestimmtes Programm aus. | ||
HIDL 2.0 | tune(ProgramSelector program) generates (Result result) |
|
AIDL | void tune(in ProgramSelector program) |
|
Beschreibung:Sucht nach dem nächsten gültigen Programm, das gesendet wird. Um Verwechslungen 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 Tuning-, Scan- (in HIDL) oder Such- (in AIDL) oder Schrittvorgänge ab. | ||
HIDL 2.0 | cancel() |
|
AIDL | void cancel() |
|
Beschreibung:Wendet einen Filter auf die Programmliste an und beginnt, Programmlistenaktualisierungen über den onProgramListUpdated -Callback zu senden. |
||
HIDL 2.0 | startProgramListUpdates(ProgramFilter filter) generates (Result result) |
|
AIDL | void startProgramListUpdates(in ProgramFilter filter) |
|
Beschreibung:Das Senden von Programmlistenaktualisierungen 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:Hiermit wird das angegebene Konfigurationsflag festgelegt. | ||
HIDL 2.0 | setConfigFlag(ConfigFlag flag, bool value) generates (Result result) |
|
AIDL | void setConfigFlag(in ConfigFlag flag, boolean value) |
|
Beschreibung:Hier legen Sie anbieterspezifische Parameterwerte fest. | ||
HIDL 2.0 | setParameters(vec<VendorKeyValue> parameters)
erzeugt, (vec<VendorKeyValue> results) |
|
AIDL | VendorKeyValue[] setParameters(in VendorKeyValue[] parameters) |
|
Beschreibung:Hiermit werden anbieterspezifische Parameterwerte abgerufen. | ||
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 Tuningvorgang (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 später ausgeführt und ein Status oder Ergebnis schnell zurückgegeben werden. Im Detail sollte jeder Vorgang Folgendes umfassen:
- Alle ausstehenden Abstimmungsvorgänge abbrechen.
- Prüfen, ob der Vorgang anhand der Methodeneingaben 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 Tuning-Aufgabe fehlgeschlagen ist (z. B. aufgrund eines Zeitlimits) oder abgeschlossen ist.
Ähnlich plant startProgramListUpdates
die zeitaufwendige Aktualisierung der Programmliste für später, um schnell einen Status oder ein Ergebnis zurückzugeben. Die Methode bricht zuerst ausstehende Aktualisierungsanfragen ab, plant dann die Aktualisierungsaufgabe und gibt das Ergebnis schnell zurück.
Race-Bedingung
Aufgrund des asynchronen Verhaltens von Tuning-Vorgängen (z. B. „tune“, „scan“ (in HIDL) oder „seek“ (in AIDL) und „step“) gibt es eine Race-Bedingung zwischen dem Abbrechen des Vorgangs und den Tuning-Vorgängen. Wenn cancel
aufgerufen wird, nachdem die HAL einen Tuningvorgang abgeschlossen hat und bevor der Callback abgeschlossen ist, kann die Stornierung ignoriert werden. Der Callback sollte abgeschlossen und vom HAL-Client empfangen werden.
Wenn stopProgramListUpdates
ebenfalls aufgerufen wird, nachdem die HAL eine Programmlistenaktualisierung abgeschlossen hat und bevor der onCurrentProgramInfoChanged
-Callback abgeschlossen ist, kann stopProgramListUpdates
ignoriert werden und der Callback sollte abgeschlossen werden.
Maximale Datengröße
Da es ein festes Limit für den Binder-Transaktionspuffer gibt, wird das Datenlimit für einige Schnittstellenmethoden, die Daten mit potenziell großer Größe übergeben, in der AIDL HAL erläutert.
- Für
getImage
muss das zurückgegebene Bild kleiner als 1 MB sein. - Für
onProgramListUpdate
muss jedechunk
kleiner als 500 KiB sein. Größere Programmlisten müssen von der HAL-Implementierung in mehrere Chunks aufgeteilt und über mehrere Callbacks gesendet werden.
Änderungen an den Datenstrukturen der AIDL HAL
Neben Änderungen an den Schnittstellen wurden diese Änderungen auch auf die Datenstrukturen angewendet, die in der Broadcast-Radio-AIDL HAL definiert sind, die die AIDL nutzt.
- Das
Constant
-Enum wird in AIDL entfernt und inIBroadcastRadio
als const int definiert. In der Zwischenzeit wirdANTENNA_DISCONNECTED_TIMEOUT_MS
inANTENNA_STATE_CHANGE_TIMEOUT_MS
umbenannt. Es wird eine neue Konstante vom Typ intTUNER_TIMEOUT_MS
hinzugefügt. Alle Sendersuch-, Suchlauf- und Schrittvorgänge müssen innerhalb dieses Zeitraums abgeschlossen werden. - Die Enumerationen
RDS
undDeemphasis
werden in AIDL entfernt und inAmFmRegionConfig
als const int definiert. Entsprechend werden sowohlfmDeemphasis
als auchfmRds
inProgramInfo
als int deklariert, ein Bitberechnungsergebnis der jeweiligen Flags.D50
undD75
wurden inDEEMPHASIS_D50
undDEEMPHASIS_D75
umbenannt. - Das Enum
ProgramInfoFlags
wird in AIDL entfernt und inProgramInfo
als const int mit dem PräfixFLAG_
definiert. Entsprechend wirdinfoFlags
inProgramInfo
als int deklariert, ein Bitberechnungsergebnis von Flags.TUNED
wird ebenfalls inFLAG_TUNABLE
umbenannt, um die Definition der Station, auf die umgeschaltet werden kann, besser zu beschreiben. - 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 der HIDL HAL definiert sind, nicht mehr verwendet. Eine AIDL-UnionMetadata
ist in der AIDL HAL definiert. Jeder Enum-Wert, der zuvor inMetadataKey
enthalten war, ist jetzt ein Feld inMetadata
mit dem Typ „String“ oder „int“, je nach Definition.
Unterstützung für DAB-Radio
In diesem Abschnitt wird die Unterstützung von DAB-Radio beschrieben.
IDs
Der primäre Identifikationstyp für DAB- und DMB-Radio in der AIDL Broadcast Radio HAL ist DAB_SID_EXT
. DAB_SID_EXT
verwendet 32-Bit-Dienst-IDs (Service Identifiers, SIDs), sodass sowohl DAB- als auch DMB-Radio-SIDs dargestellt werden können.
Neben primären IDs werden auch sekundäre IDs wie DAB_ENSEMBLE
und DAB_FREQUENCY_KHZ
unterstützt. Das ist wichtig, da mehrere DAB-Sender dieselbe DAB_SID_EXT
haben können, aber unterschiedliche DAB_ENSEMBLE
- oder DAB_FREQUENCY_KHZ
-Werte. Um für korrekte Aktualisierungen der Programmlisten zu sorgen, werden Sender mit derselben DAB_SID_EXT
gemeinsam mit ITunerCallback#onProgramListUpdated
aktualisiert. Diese Aktualisierung wird dann an den Broadcast Radio Service und Radio Manager und schließlich über android.hardware.radio.ProgramList
an die Radio-App weitergeleitet.
Metadaten
In der folgenden Tabelle sind die für DAB in der AIDL Broadcast Radio HAL unterstützten Metadaten aufgeführt:
Metadatenfeld | Beschreibung |
---|---|
dabEnsembleName (abgekürzt: dabEnsembleNameShort ) |
Name des Ensembles der DAB-Station |
dabServiceName (von dabServiceNameShort abgeleitet) |
Dienstname des DAB-Senders |
dabComponentName (von dabComponentNameShort abgeleitet) |
Komponentenname des DAB-Senders |
Unterstützung für 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 besseren Identifizierung der Ladestationen 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
s anpassen. Verwenden Sie das Flag FORCE_ANALOG_FM
, um diese Einstellung für UKW-Radio zu steuern, und das Flag FORCE_ANALOG_AM
für AM-Radio.
Wenn das Flag auf false
gesetzt ist, wird HD-Radio aktiviert. Bei true
wird dagegen das analoge AM/FM-Radio erzwungen.
Verfügbare HD-Kanäle
Ab Android 15 können die derzeit für einen HD-Radiosender verfügbaren HD-Kanäle durch eine Bitmaske mit 8 Bits, 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.
Signalaufnahmestatus
Unter Android 15 und höher können Radio-Apps Nutzern den Signalempfangsstatus von HD-Radiosendern anzeigen. Das ist hilfreich, da es manchmal einige Zeit dauern kann, bis ein starkes HD-Signal gefunden wird.
Um diese Informationen bereitzustellen, verwendet das System ProgramInfo.infoFlags
, um den Status zu verfolgen, 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 Daten des Station Information Service (SIS) verfügbar sind. SIS bietet zusätzliche Informationen zum Sender und zu den gerade laufenden Titeln.
- 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 |
Mit dem Inhalt verknüpfte eindeutige Datei-IDs (UFIDs) |
hdStationNameShort |
Der Kurzname oder universelle Kurzname des HD-Radiosenders |
hdStationNameLong |
Der vollständige Name, der Slogan oder eine Nachricht des HD-Radiosenders. |