HAL für Rundfunkradio

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-HAL: Wenn eine neue Tuner-Sitzung geöffnet wird, muss die alte Sitzung beendet werden.
  • AIDL-HAL: Da keine Tuner-Sitzung verfügbar ist, muss nur der Tuner-Callback festgelegt werden. Wenn er vorhanden ist, sollte der alte Callback entfernt 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 Tuner-Sitzung darf nicht fehlschlagen und darf 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: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) oder status (in AIDL) zurück. Wenn Result oder status OK ist, muss der Tuner-Callback tuneFailed oder currentProgramInfoChanged 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 jede chunk 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“ in IBroadcastRadio definiert. In der Zwischenzeit wird ANTENNA_DISCONNECTED_TIMEOUT_MS in ANTENNA_STATE_CHANGE_TIMEOUT_MS umbenannt. Eine neue const int TUNER_TIMEOUT_MS wird hinzugefügt. Alle Vorgänge zum Abstimmen, Suchen und Schrittweisen müssen innerhalb dieses Zeitraums abgeschlossen werden.
  • Die Enums RDS und Deemphasis werden in AIDL entfernt und als „const int“ in AmFmRegionConfig definiert. Entsprechend werden sowohl fmDeemphasis als auch fmRds in ProgramInfo als „int“ deklariert, ein Bitberechnungsergebnis der entsprechenden Flags. In der Zwischenzeit werden D50 und D75 in DEEMPHASIS_D50 bzw. DEEMPHASIS_D75 umbenannt.
  • Die Enumeration ProgramInfoFlags wird in AIDL entfernt und als „const int“ in ProgramInfo mit dem Präfix FLAG_ definiert. Entsprechend wird infoFlags in ProgramInfo als int deklariert, ein Bitberechnungsergebnis von Flags. TUNED wird in FLAG_TUNABLE umbenannt, um die Definition besser zu beschreiben, auf die die Station eingestellt werden kann.
  • 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 HIDL HAL definiert sind, nicht mehr verwendet. Eine AIDL-Union Metadata wird in der AIDL-HAL definiert. Jeder Enum-Wert, der sich zuvor in MetadataKey befand, ist jetzt ein Feld in Metadata 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
Sie können 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.