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 2.0 | openSession(ITunerCallback callback) génère
(Result result, ITunerSession session) |
|
AILD | void setTunerCallback(in ITunerCallback callback) |
|
Description :
|
||
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 lestatus
(dans AIDL). SiResult
oustatus
est défini surOK
, le rappel du tunertuneFailed
oucurrentProgramInfoChanged
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 chaquechunk
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 dansIBroadcastRadio
. Par ailleurs,ANTENNA_DISCONNECTED_TIMEOUT_MS
est renomméANTENNA_STATE_CHANGE_TIMEOUT_MS
. Une nouvelle constante intTUNER_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
etDeemphasis
sont supprimées dans AIDL et définies comme const int dansAmFmRegionConfig
. De même,fmDeemphasis
etfmRds
dansProgramInfo
sont déclarés comme des entiers, un résultat de calcul de bits des indicateurs respectifs. Par ailleurs,D50
etD75
sont renommésDEEMPHASIS_D50
etDEEMPHASIS_D75
, respectivement. - Les énumérations
ProgramInfoFlags
sont supprimées dans AIDL et définies comme des entiers constants dansProgramInfo
avec un préfixeFLAG_
ajouté. De même,infoFlags
dansProgramInfo
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
, carscan
est renomméseek
dans AIDL. - Étant donné que le concept d'union est introduit dans AIDL,
MetadataKey
etMetadata
définis dans HIDL HAL ne sont plus utilisés. Une union AIDLMetadata
est définie dans AIDL HAL. Chaque valeur d'énumération précédemment dansMetadataKey
est désormais un champ dansMetadata
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 |
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.