HAL de diffusion radio

Les sections suivantes décrivent comment utiliser la couche d'abstraction matérielle (HAL, Hardware Abstraction Layer) pour implémenter la radio broadcast.

Interface HAL de la radio broadcast

Le HAL de la radio de diffusion fournit des structures de données et des interfaces au niveau matériel pour implémenter la radio de diffusion, telle que la radio AM/FM et DAB.

Interfaces HIDL 2.0 et AIDL

Le HAL de la radio de diffusion utilise les interfaces décrites dans les sections suivantes.

IAnnouncementListener

IAnnouncementListener est l'interface de rappel pour l'écouteur d'annonces, qui peut être enregistré sur le HAL de la radio de diffusion pour recevoir des annonces. L'interface comporte les méthodes suivantes :

IAnnouncementListener
Description : appelé chaque fois que la liste des annonces a changé.
HIDL 2.0 oneway onListUpdated(vec<Announcement> announcements)
AILD oneway void onListUpdated(in Announcement[] announcements)

ICloseHandle

ICloseHandle est le gestionnaire de fermeture générique permettant de supprimer un rappel qui n'a pas besoin d'interface active.

ICloseHandle
Description : fermez le handle.
HIDL 2.0 close()
AILD void close()

ITunerCallback

ITunerCallback est l'interface de rappel appelée par le HAL de la radio de diffusion pour envoyer des mises à jour au service client HAL.

ITunerCallback
Description : appelé par la HAL lorsqu'une opération de réglage (tune, seek (en AIDL) ou scan (en HIDL) et step) échoue de manière asynchrone.
HIDL 2.0 oneway onCurrentProgramInfoChanged(ProgramInfo info)
AILD void onCurrentProgramInfoChanged(in ProgramInfo info)
Description : appelé lorsque le réglage, la recherche (dans AIDL) ou l'analyse (dans HIDL), ou l'étape réussissent.
HIDL 2.0 oneway onTuneFailed(Result result, ProgramSelector selector)
AILD void onTuneFailed(in Result result, in ProgramSelector selector)
Description : appelé lorsque le réglage, la recherche (dans AIDL) ou l'analyse (dans HIDL), ou l'étape réussissent.
HIDL 2.0 oneway onCurrentProgramInfoChanged(ProgramInfo info)
AILD void onCurrentProgramInfoChanged(in ProgramInfo info)
Description : appelé lorsque la liste des programmes est mise à jour. La taille de chaque bloc doit être limitée à 500 kio.
HIDL 2.0 oneway onProgramListUpdated(ProgramListChunk chunk)
AILD void onProgramListUpdated(ProgramListChunk chunk)
Description : appelé lorsque l'antenne est connectée ou déconnectée.
HIDL 2.0 oneway onAntennaStateChange(bool connected)
AILD void onCurrentProgramInfoChanged(in ProgramInfo info)
Description : appelé lorsque les valeurs de paramètres spécifiques au fournisseur sont mises à jour en interne dans HAL (n'appelez pas après avoir appelé setParameters par le client HAL).
HIDL 2.0 oneway onParametersUpdated(vec<VendorKeyValue> parameters)
AILD void onParametersUpdated(in VendorKeyValue[] parameters)
Description : nouveautés d'AIDL. Appelé lorsque le flag de configuration est mis à jour en interne dans le HAL (ne doit pas être appelé après l'appel de setConfigFlag par le client HAL).
HIDL 2.0 Non applicable.
AILD void onConfigFlagUpdated(in ConfigFlag flag, in boolean value)

IBroadcastRadio

IBroadcastRadio est l'interface principale du HAL de la radio broadcast. Dans le HAL HIDL 2.0, utilisez l'interface ITunerSession pour appeler des opérations sur le tuner. Toutefois, au maximum un seul tuner est actif à la fois (à condition que chaque instance HAL de radio de diffusion ne dispose que d'un seul chip de tuner). ITunerSession a été supprimé des interfaces AIDL et ses interfaces ont été déplacées vers IBroadcastRadio.

IBroadcastRadio
Description : obtenir la description d'un module et de ses fonctionnalités.
HIDL 2.0 getProperties() generates (Properties properties)
AILD Properties getProperties()
Description : récupère la configuration actuelle ou possible de la région AM/FM.
HIDL 2.0 getAmFmRegionConfig(bool full) generates (Result result, AmFmRegionConfig config)
AILD AmFmRegionConfig getAmFmRegionConfig(bool full)
Description : récupère la configuration actuelle de la région DAB.
HIDL 2.0 getDabRegionConfig() generates (Result result, vec<DabTableEntry> config)
AILD DabTableEntry[] getDabRegionConfig()
Description : obtient une image à partir du cache du module radio. Dans AIDL, la taille de l'image doit être inférieure à 1 Mo en raison d'une limite stricte sur le tampon de transaction du binder.
HIDL 2.0 getImage(uint32_t id) generates (vec<uint8_t> image)
AILD byte[] getImage(in int id)
Description : enregistre l'écouteur d'annonces.
HIDL 2.0 registerAnnouncementListener(vec<AnnouncementType> enabled,IAnnouncementListener listener) generates (Result result, ICloseHandle closeHandle)
AILD ICloseHandle registerAnnouncementListener(in IAnnouncementListener listener, in AnnouncementType[] enabled)
Description :
  • HIDL HAL : lorsqu'une nouvelle session de syntoniseur est ouverte, l'ancienne session doit être arrêtée.
  • AIDL HAL : comme aucune session de syntoniseur n'est disponible, seule la fonction de rappel du syntoniseur doit être définie. Si elle existe, l'ancienne fonction de rappel doit être supprimée.
HIDL 2.0 openSession(ITunerCallback callback) génère (Result result, ITunerSession session)
AILD void setTunerCallback(in ITunerCallback callback)
Description :
  • HIDL HAL : la fermeture d'une session de tuner ne doit pas échouer et ne doit être émise qu'une seule fois.
  • AIDL HAL : il n'y a pas de tuner et seul le rappel du tuner doit être désactivé.
HIDL 2.0 close()
AILD unsetTunerCallback()
Description : syntonise un programme spécifique.
HIDL 2.0 tune(ProgramSelector program) generates (Result result)
AILD void tune(in ProgramSelector program)
Description : recherche le prochain programme valide sur air. Pour éviter toute confusion dans AIDL, scan est renommé seek.
HIDL 2.0 scan(bool directionUp, bool skipSubChannel) generates (Result result)
AILD void seek(in boolean directionUp, in boolean skipSubChannel)
Description : étapes vers le canal adjacent, qui ne doit pas être occupé par un programme.
HIDL 2.0 step(bool directionUp) generates (Result result)
AILD void step(in boolean directionUp)
Description : annule les opérations de réglage, d'analyse (dans HIDL), de recherche (dans AIDL) ou de déplacement en attente.
HIDL 2.0 cancel()
AILD void cancel()
Description : applique un filtre à la liste des programmes et commence à envoyer des mises à jour de la liste des programmes via le rappel onProgramListUpdated.
HIDL 2.0 startProgramListUpdates(ProgramFilter filter) generates (Result result)
AILD void startProgramListUpdates(in ProgramFilter filter)
Description : arrête l'envoi des mises à jour de la liste des programmes.
HIDL 2.0 stopProgramListUpdates()
AILD void stopProgramListUpdates()
Description : récupère le paramètre actuel d'un indicateur de configuration donné.
HIDL 2.0 isConfigFlagSet(ConfigFlag flag) generates (Result result, bool value)
AILD boolean isConfigFlagSet(in ConfigFlag flag)
Description : définit l'indicateur de configuration donné.
HIDL 2.0 setConfigFlag(ConfigFlag flag, bool value) generates (Result result)
AILD void setConfigFlag(in ConfigFlag flag, boolean value)
Description : définit les valeurs des paramètres spécifiques au fournisseur.
HIDL 2.0 setParameters(vec<VendorKeyValue> parameters)

génère,

(vec<VendorKeyValue> results)
AILD VendorKeyValue[] setParameters(in VendorKeyValue[] parameters)
Description : récupère les valeurs de paramètres spécifiques au fournisseur.
HIDL 2.0 getParameters(vec<string> keys) generates (vec<VendorKeyValue> parameters)
AILD VendorKeyValue[] getParameters(in String[] keys)

Clarifications concernant l'interface

Comportement asynchrone

Étant donné que chaque opération d'ajustement (par exemple, ajuster, analyser (dans HIDL) ou rechercher (dans AIDL), et passer) peut prendre du temps et que le thread ne doit pas être bloqué pendant une longue période, l'opération doit planifier les opérations de longue durée pour qu'elles se produisent ultérieurement et renvoyer rapidement un état ou un résultat. Plus précisément, chaque opération doit :

  • Annule toutes les opérations de réglage en attente.
  • Vérifiez si l'opération peut être traitée en fonction des entrées de la méthode et de l'état du tuner.
  • Planifiez la tâche de réglage, puis renvoyez immédiatement le Result (dans HIDL) ou le status (dans AIDL). Si Result ou status est défini sur OK, le rappel du tuner tuneFailed ou currentProgramInfoChanged doit être appelé lorsque la tâche de réglage a échoué (par exemple, en raison d'un délai d'attente) ou est terminée.

De même, startProgramListUpdates planifie également la tâche chronophage de mise à jour de la liste des programmes pour qu'elle ait lieu ultérieurement et renvoie rapidement un état ou un résultat. La méthode annule d'abord les demandes de mise à jour en attente, puis planifie la tâche de mise à jour et renvoie rapidement le résultat.

Condition de concurrence

En raison du comportement asynchrone des opérations de réglage (par exemple, régler, analyser (dans HIDL) ou rechercher (dans AIDL), et passer), il existe une condition de concurrence entre l'annulation de l'opération et les opérations de réglage. Si cancel est appelé après que la HAL a terminé une opération de réglage et avant la fin du rappel, l'annulation peut être ignorée et le rappel doit se terminer et être reçu par le client HAL.

De même, si stopProgramListUpdates est appelé après que le HAL a terminé une mise à jour de la liste des programmes et avant la fin du rappel onCurrentProgramInfoChanged, stopProgramListUpdates peut être ignoré et le rappel doit se terminer.

Limite de taille des données

Étant donné qu'il existe une limite stricte pour la mémoire tampon de transaction Binder, la limite de données pour certaines méthodes d'interface transmettant des données potentiellement volumineuses est précisée dans l'AIDL HAL.

  • getImage exige que l'image renvoyée soit inférieure à 1 Mo.
  • onProgramListUpdate exige que chaque chunk soit inférieur à 500 kio. Les listes de programmes plus volumineuses doivent être divisées par l'implémentation HAL en plusieurs blocs et envoyées via plusieurs rappels.

Modifications apportées aux structures de données AIDL HAL

En plus des modifications apportées aux interfaces, ces changements ont été appliqués aux structures de données définies dans la HAL AIDL de la radio broadcast, qui tire parti de l'AIDL.

  • L'énumération Constant est supprimée dans AIDL et définie comme const int dans IBroadcastRadio. Par ailleurs, ANTENNA_DISCONNECTED_TIMEOUT_MS est renommé ANTENNA_STATE_CHANGE_TIMEOUT_MS. Une nouvelle constante int TUNER_TIMEOUT_MS est ajoutée. Toutes les opérations de réglage, de recherche et de déplacement doivent être effectuées dans ce délai.
  • Les énumérations RDS et Deemphasis sont supprimées dans AIDL et définies comme const int dans AmFmRegionConfig. De même, fmDeemphasis et fmRds dans ProgramInfo sont déclarés comme des entiers, un résultat de calcul de bits des indicateurs respectifs. Par ailleurs, D50 et D75 sont renommés DEEMPHASIS_D50 et DEEMPHASIS_D75, respectivement.
  • Les énumérations ProgramInfoFlags sont supprimées dans AIDL et définies comme des entiers constants dans ProgramInfo avec un préfixe FLAG_ ajouté. De même, infoFlags dans ProgramInfo est déclaré comme un entier, résultat du calcul de bits des indicateurs. TUNED est également renommé FLAG_TUNABLE pour mieux décrire sa définition selon laquelle la station peut être réglée.
  • Dans AmFmBandRange, scanSpacing est renommé seekSpacing, car scan est renommé seek dans AIDL.
  • Étant donné que le concept d'union est introduit dans AIDL, MetadataKey et Metadata définis dans HIDL HAL ne sont plus utilisés. Une union AIDL Metadata est définie dans AIDL HAL. Chaque valeur d'énumération précédemment dans MetadataKey est désormais un champ dans Metadata avec un type de chaîne ou d'entier, en fonction de leurs définitions.

Prise en charge de la radio DAB

Cette section décrit la prise en charge de la radio DAB.

Identifiants

Le type d'identifiant principal pour la radio DAB et DMB dans le HAL AIDL Broadcast Radio est DAB_SID_EXT. DAB_SID_EXT utilise des identifiants de service (SID) de 32 bits pour pouvoir représenter le SID des radios DAB et DMB.

En plus des identifiants principaux, les identifiants secondaires tels que DAB_ENSEMBLE et DAB_FREQUENCY_KHZ sont acceptés. C'est important, car plusieurs stations DAB peuvent partager un DAB_SID_EXT tout en ayant des valeurs DAB_ENSEMBLE ou DAB_FREQUENCY_KHZ différentes. Pour que la liste des programmes soit mise à jour avec précision, les stations ayant le même DAB_SID_EXT sont mises à jour ensemble à l'aide de ITunerCallback#onProgramListUpdated. Cette mise à jour est ensuite relayée au service de radio Broadcast et au gestionnaire de radio, puis enfin à l'application de radio via android.hardware.radio.ProgramList.

Métadonnées

Le tableau suivant présente les métadonnées compatibles spécifiques à la DAB dans AIDL Broadcast Radio HAL :

Champ de métadonnées Description
dabEnsembleName (forme abrégée : dabEnsembleNameShort) Nom de l'ensemble de la station DAB
dabServiceName (abrégé de dabServiceNameShort) Nom du service de la station DAB
dabComponentName (abrégé de dabComponentNameShort) Nom du composant de la station DAB

Prise en charge de la radio HD

Cette section décrit la prise en charge de la radio HD.

Identifiants

HD_STATION_ID_EXT sert d'identifiant principal pour les stations de radio HD. Pour améliorer l'identification des stations, des identifiants secondaires tels que HD_STATION_NAME et HD_STATION_LOCATION sont également fournis. HD_STATION_LOCATION, qui fournit des informations de localisation, a été introduit dans Android 15.

Activer ou désactiver la radio numérique

À partir d'Android 15, vous pouvez activer ou désactiver la radio numérique (comme la radio HD) en ajustant les ConfigFlag. Pour contrôler ce paramètre pour la radio FM, utilisez l'indicateur FORCE_ANALOG_FM. Pour la radio AM, utilisez l'indicateur FORCE_ANALOG_AM. Définir l'indicateur sur false active la radio HD, tandis que le définir sur true force la radio AM/FM analogique.

Chaînes HD disponibles

À partir d'Android 15, les canaux HD actuellement disponibles pour une station de radio HD peuvent être représentés par un masque de bits de 8 bits, Metadata#hdSubChannelsAvailable, dans ProgramInfo.metadata. Par exemple, la valeur du bit 1 à partir de la gauche indique si le sous-canal HD2 est disponible pour cette station HD.

État d'acquisition du signal

Dans Android 15 et versions ultérieures, les applications de radio peuvent indiquer aux utilisateurs l'état d'acquisition du signal des stations de radio HD. Cela est utile, car l'acquisition d'un signal HD puissant peut parfois prendre quelques instants.

Pour fournir ces informations, le système utilise ProgramInfo.infoFlags pour suivre l'état et met à jour l'application radio via ITunerCallback#onCurrentProgramInfoChanged..

Voici comment l'état est représenté dans ProgramInfo.infoFlags :

  • Bit 6 : indique si le signal radio HD a été acquis.
  • Bit 7 : indique si les données du service d'informations sur les stations (SIS) sont disponibles. Le SIS fournit des informations supplémentaires sur la station et le contenu en cours de lecture.
  • Bit 8 : indique si le contenu audio numérique HD est disponible.

Métadonnées

Le tableau suivant présente les métadonnées de radio HD compatibles avec Android 15 et les versions ultérieures.

Champ de métadonnées Description
commentShortDescription Brève description du contexte du commentaire
commentActualText Texte du commentaire
commercial Spot radio
ufids Identifiants uniques de fichier (UFID) associés au contenu
hdStationNameShort Nom abrégé ou nom abrégé universel de la station de radio HD
hdStationNameLong Nom long, slogan ou message de la station de radio HD.

Alertes d'urgence

Dans Android 15 et les versions ultérieures, les alertes d'urgence sont compatibles avec les stations de radio HD pour informer les utilisateurs des applications radio des alertes d'urgence envoyées par les stations de radio. L'alerte d'urgence (Alert) suit la norme CAP (Common Alerting Protocol) 1.2 et est compatible avec les alertes indiquées dans le tableau suivant :

Informations sur l'alerte Description Valeurs enum disponibles
AlertStatus État du message d'alerte ACTUAL, EXERCISE, TEST
AlertMessageType Type de message d'alerte d'urgence ALERT, UPDATE, CANCEL
AlertCategory Catégorie de l'événement concerné par le message d'alerte d'urgence GEO, MET, SAFETY, SECURITY, RESCUE, FIRE, HEALTH, ENV, TRANSPORT, INFRA, CBRNE, OTHER
AlertUrgency Urgence de l'événement concerné par le message d'alerte d'urgence IMMEDIATE, EXPECTED, FUTURE, PAST, UNKNOWN
AlertSeverity Gravité de l'événement concerné par le message d'alerte d'urgence EXTREME, SEVERE, MODERATE, MINOR, UNKNOWN
AlertCertainty Certitude de l'événement concerné par le message d'alerte d'urgence OBSERVED, LIKELY, POSSIBLE, UNLIKELY, UNKNOWN
Vous pouvez utiliser Alert (qui contient les informations du tableau), les messages d'alerte et AlertArea pour afficher des informations sur l'alerte en cours. Alert est un champ facultatif dans ProgramInfo afin qu'il puisse être envoyé depuis Broadcast Radio HAL aux applications radio via les rappels du tuner pour les informations sur le programme en cours et les mises à jour de la liste des programmes.