Radiosender HAL

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 HAL: Wenn eine neue Tunersitzung geöffnet wird, muss die alte Sitzung beendet werden.
  • AIDL HAL: Da keine Tunersitzung verfügbar ist, muss nur der Tuner-Callback festgelegt werden. Wenn er vorhanden ist, sollte der alte Rückruf zurückgesetzt werden.
HIDL 2.0 openSession(ITunerCallback callback) generiert (Result result, ITunerSession session)
AIDL void setTunerCallback(in ITunerCallback callback)
Beschreibung:
  • HIDL HAL: Das Schließen einer Tunersitzung darf nicht fehlschlagen und muss nur einmal erfolgen.
  • AIDL HAL: Es gibt keinen Tuner und nur der Tuner-Callback muss zurückgesetzt werden.
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) oder status (in AIDL) zurück. Wenn Result oder status OK ist, muss der Tuner-Callback tuneFailed oder currentProgramInfoChanged 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 jede chunk 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 in IBroadcastRadio als const int definiert. In der Zwischenzeit wird ANTENNA_DISCONNECTED_TIMEOUT_MS in ANTENNA_STATE_CHANGE_TIMEOUT_MS umbenannt. Es wird eine neue Konstante vom Typ int TUNER_TIMEOUT_MS hinzugefügt. Alle Sendersuch-, Suchlauf- und Schrittvorgänge müssen innerhalb dieses Zeitraums abgeschlossen werden.
  • Die Enumerationen RDS und Deemphasis werden in AIDL entfernt und in AmFmRegionConfig als const int definiert. Entsprechend werden sowohl fmDeemphasis als auch fmRds in ProgramInfo als int deklariert, ein Bitberechnungsergebnis der jeweiligen Flags. D50 und D75 wurden in DEEMPHASIS_D50 und DEEMPHASIS_D75 umbenannt.
  • Das Enum ProgramInfoFlags wird in AIDL entfernt und in ProgramInfo als const int mit dem Präfix FLAG_ definiert. Entsprechend wird infoFlags in ProgramInfo als int deklariert, ein Bitberechnungsergebnis von Flags. TUNED wird ebenfalls in FLAG_TUNABLE umbenannt, um die Definition der Station, auf die umgeschaltet werden kann, besser zu beschreiben.
  • In AmFmBandRange wird scanSpacing in seekSpacing umbenannt, da scan in AIDL in seek umbenannt wird.
  • Da das Konzept der Union in AIDL eingeführt wird, werden MetadataKey und Metadata, die in der HIDL HAL definiert sind, nicht mehr verwendet. Eine AIDL-Union Metadata ist in der AIDL HAL definiert. Jeder Enum-Wert, der zuvor in MetadataKey enthalten war, ist jetzt ein Feld in Metadata 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 ConfigFlags 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.