Les sections suivantes expliquent comment utiliser la couche d'abstraction matérielle (HAL) pour implémenter la radiodiffusion.
Interface HAL de la radio de diffusion
Le HAL de radiodiffusion fournit des structures de données et des interfaces au niveau matériel pour implémenter la radiodiffusion, comme la radio AM/FM et DAB.
Interfaces HIDL 2.0 et AIDL
Le HAL de radiodiffusion utilise les interfaces décrites dans les sections suivantes.
IAnnouncementListener
IAnnouncementListener
est l'interface de rappel de l'écouteur d'annonces, qui peut être enregistrée sur le HAL de radiodiffusion 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) |
|
AIDL | oneway void onListUpdated(in Announcement[] announcements) |
ICloseHandle
ICloseHandle
est le handle de fermeture générique permettant de supprimer un rappel qui n'a pas besoin d'une interface active.
ICloseHandle | ||
---|---|---|
Description:Fermez la poignée. | ||
HIDL 2.0 | close() |
|
AIDL | void close() |
ITunerCallback
ITunerCallback
est l'interface de rappel appelée par le HAL radio de diffusion pour envoyer des mises à jour au service client HAL.
ITunerCallback | ||
---|---|---|
Description:Appelé par le HAL lorsqu'une opération de réglage (réglage, recherche (dans AIDL) ou analyse (dans HIDL) et étape réussie) échoue de manière asynchrone. | ||
HIDL 2.0 | oneway onCurrentProgramInfoChanged(ProgramInfo info) |
|
AIDL | void onCurrentProgramInfoChanged(in ProgramInfo info) |
|
Description:Appelé lorsque l'ajustement, la recherche (dans AIDL) ou la numérisation (dans HIDL), ou l'étape aboutit. | ||
HIDL 2.0 | oneway onTuneFailed(Result result, ProgramSelector selector) |
|
AIDL | void onTuneFailed(in Result result, in ProgramSelector selector) |
|
Description:Appelé lorsque l'ajustement, la recherche (dans AIDL) ou la numérisation (dans HIDL), ou l'étape aboutit. | ||
HIDL 2.0 | oneway onCurrentProgramInfoChanged(ProgramInfo info) |
|
AIDL | void onCurrentProgramInfoChanged(in ProgramInfo info) |
|
Description:appelé lorsque la liste des programmes est mise à jour. La taille de chaque segment doit être limitée à 500 ko. | ||
HIDL 2.0 | oneway onProgramListUpdated(ProgramListChunk chunk) |
|
AIDL | oneway onProgramListUpdated(ProgramListChunk chunk) |
|
Description:Appelé lorsque l'antenne est connectée ou déconnectée. | ||
HIDL 2.0 | oneway onAntennaStateChange(bool connected) |
|
AIDL | void onCurrentProgramInfoChanged(in ProgramInfo info) |
|
Description:Appelé lorsque les valeurs de paramètre spécifiques au fournisseur sont mises à jour en interne dans HAL (ne pas appeler après avoir appelé setParameters par le client HAL). |
||
HIDL 2.0 | oneway onParametersUpdated(vec<VendorKeyValue> parameters) |
|
AIDL | void onParametersUpdated(in VendorKeyValue[] parameters) |
|
Description:Nouveauté dans AIDL. Appelé lorsque l'indicateur 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. | |
AIDL | void onConfigFlagUpdated(in ConfigFlag flag, in boolean value) |
IBroadcastRadio
IBroadcastRadio
est l'interface principale du HAL radio de diffusion. Dans le HAL HIDL 2.0, utilisez l'interface ITunerSession
au tuner pour appeler les opérations. Toutefois, un seul tuner est actif à la fois (à condition que chaque instance HAL de radiodiffusion ne comporte qu'un seul chip de tuner).
ITunerSession
a été supprimé des interfaces AIDL et ses interfaces ont été déplacées vers IBroadcastRadio
.
IBroadcastRadio | ||
---|---|---|
Description:permet d'obtenir la description d'un module et de ses fonctionnalités. | ||
HIDL 2.0 | getProperties() generates (Properties properties) |
|
AIDL | Properties getProperties() |
|
Description:extrait la configuration actuelle ou possible de la région AM/FM. | ||
HIDL 2.0 | getAmFmRegionConfig(bool full) generates (Result result, AmFmRegionConfig
config) |
|
AIDL | AmFmRegionConfig getAmFmRegionConfig(bool full) |
|
Description:extrait la configuration actuelle de la région DAB. | ||
HIDL 2.0 | getDabRegionConfig() generates (Result result, vec<DabTableEntry>
config) |
|
AIDL | DabTableEntry[] getDabRegionConfig() |
|
Description:permet d'obtenir 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 liaisonneur. | ||
HIDL 2.0 | getImage(uint32_t id) generates (vec<uint8_t> image) |
|
AIDL | 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) |
|
AIDL | ICloseHandle registerAnnouncementListener(in IAnnouncementListener listener, in
AnnouncementType[] enabled) |
|
Description:
|
||
HIDL 2.0 | openSession(ITunerCallback callback) génère
(Result result, ITunerSession session) |
|
AIDL | void setTunerCallback(in ITunerCallback callback) |
|
Description:
|
||
HIDL 2.0 | close() |
|
AIDL | unsetTunerCallback() |
|
Description:permet de se connecter à un programme spécifié. | ||
HIDL 2.0 | tune(ProgramSelector program) generates (Result result) |
|
AIDL | void tune(in ProgramSelector program) |
|
Description:recherche le prochain programme valide en diffusion. Pour éviter toute confusion dans AIDL, scan est renommé seek .
|
||
HIDL 2.0 | scan(bool directionUp, bool skipSubChannel) generates (Result result) |
|
AIDL | void seek(in boolean directionUp, in boolean skipSubChannel) |
|
Description:Étapes vers la chaîne adjacente, qui ne peut pas être occupée par un programme. | ||
HIDL 2.0 | step(bool directionUp) generates (Result result) |
|
AIDL | void step(in boolean directionUp) |
|
Description:annule les opérations de réglage, d'analyse (en HIDL) ou de recherche (en AIDL) en attente, ou les opérations par étapes. | ||
HIDL 2.0 | cancel() |
|
AIDL | void cancel() |
|
Description:Applique un filtre à la liste de programmes et commence à envoyer des mises à jour de la liste de programmes via le rappel onProgramListUpdated . |
||
HIDL 2.0 | startProgramListUpdates(ProgramFilter filter) generates (Result result) |
|
AIDL | void startProgramListUpdates(in ProgramFilter filter) |
|
Description:arrête d'envoyer des mises à jour de la liste des programmes. | ||
HIDL 2.0 | stopProgramListUpdates() |
|
AIDL | void stopProgramListUpdates() |
|
Description:extrait le paramètre actuel d'un indicateur de configuration donné. | ||
HIDL 2.0 | isConfigFlagSet(ConfigFlag flag) generates (Result result, bool value) |
|
AIDL | boolean isConfigFlagSet(in ConfigFlag flag) |
|
Description:définit l'indicateur de configuration donné. | ||
HIDL 2.0 | setConfigFlag(ConfigFlag flag, bool value) generates (Result result) |
|
AIDL | void setConfigFlag(in ConfigFlag flag, boolean value) |
|
Description:définit les valeurs de paramètres spécifiques au fournisseur. | ||
HIDL 2.0 | setParameters(vec<VendorKeyValue> parameters)
génère, (vec<VendorKeyValue> results) |
|
AIDL | 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) |
|
AIDL | VendorKeyValue[] getParameters(in String[] keys) |
Clarifications concernant l'interface
Comportement asynchrone
Étant donné que chaque opération de réglage (par exemple, réglage, analyse (dans HIDL) ou recherche (dans AIDL), et étape) 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 longues pour qu'elles se produisent plus tard et renvoyer rapidement un état ou un résultat. En détail, chaque opération doit:
- Annulez 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
Result
(en HIDL) oustatus
(en AIDL). SiResult
oustatus
estOK
, 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 avant expiration) ou est terminée.
De même, startProgramListUpdates
planifie également la tâche fastidieuse de mise à jour de la liste des programmes pour qu'elle soit effectuée plus tard et renvoie rapidement un état ou un résultat. La méthode annule d'abord les requêtes 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églage, analyse (dans HIDL) ou recherche (dans AIDL), et étape), il existe une condition de course entre l'annulation de l'opération et les opérations de réglage. Si cancel
est appelé après la fin d'une opération de réglage par le HAL 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 la fin de la mise à jour de la liste de programmes par le HAL 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 sur la mémoire tampon de transaction du liaisonneur, la limite de données pour certaines méthodes d'interface transmettant des données d'une taille potentiellement importante est clarifiée dans le HAL AIDL.
getImage
nécessite que l'image renvoyée soit inférieure à 1 Mo.onProgramListUpdate
exige que chaquechunk
soit inférieur à 500 ko. Les listes de programmes plus importantes doivent être divisées par l'implémentation HAL en plusieurs segments et envoyées via plusieurs rappels.
Modifications apportées aux structures de données HAL AIDL
En plus des modifications apportées aux interfaces, ces modifications ont été appliquées aux structures de données définies dans le HAL AIDL de la radiodiffusion, qui exploite l'AIDL.
- L'énumération
Constant
est supprimée dans AIDL et définie comme int const dansIBroadcastRadio
. En attendant,ANTENNA_DISCONNECTED_TIMEOUT_MS
est renomméANTENNA_STATE_CHANGE_TIMEOUT_MS
. Un nouvel int constTUNER_TIMEOUT_MS
est ajouté. Toutes les opérations de réglage, de recherche et de pas doivent être effectuées dans ce délai. - Les énumérations
RDS
etDeemphasis
sont supprimées dans AIDL et définies comme int const dansAmFmRegionConfig
. En conséquence,fmDeemphasis
etfmRds
dansProgramInfo
sont déclarés en tant qu'entiers, un résultat de calcul de bits des indicateurs respectifs.D50
etD75
sont renommésDEEMPHASIS_D50
etDEEMPHASIS_D75
, respectivement. - Les énumérations
ProgramInfoFlags
sont supprimées dans AIDL et définies comme int const dansProgramInfo
avec un préfixeFLAG_
ajouté. En conséquence,infoFlags
dansProgramInfo
est déclaré comme int, un résultat de calcul de bits des indicateurs.TUNED
est également renomméFLAG_TUNABLE
pour mieux décrire sa définition, à savoir la station sur laquelle la radio 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 le HAL HIDL 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.
Compatibilité avec la radio DAB
Cette section décrit la compatibilité avec la radio DAB.
Identifiants
Le type d'identifiant principal pour la radio DAB et DMB dans le HAL de radio Broadcast AIDL est DAB_SID_EXT
. DAB_SID_EXT
utilise des identifiants de service (SID) 32 bits afin de pouvoir représenter les 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. Cela 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 garantir la mise à jour précise de la liste des programmes, les chaînes ayant la même DAB_SID_EXT
sont mises à jour ensemble à l'aide de ITunerCallback#onProgramListUpdated
. Cette mise à jour est ensuite transmise au service de radiodiffusion et au gestionnaire de radio, puis à l'application de radio via android.hardware.radio.ProgramList
.
Métadonnées
Le tableau suivant présente les métadonnées compatibles spécifiques au DAB dans le HAL Broadcast Radio AIDL:
Champ de métadonnées | Description |
---|---|
dabEnsembleName (forme abrégée: dabEnsembleNameShort ) |
Nom de l'ensemble de la station DAB |
dabServiceName (abréviation de dabServiceNameShort ) |
Nom du service de la station DAB |
dabComponentName (abréviation de dabComponentNameShort ) |
Nom du composant de la station DAB |
Compatibilité avec la radio HD
Cette section décrit la compatibilité avec la radio HD.
Identifiants
HD_STATION_ID_EXT
sert d'identifiant principal pour les stations de radio HD. Pour améliorer davantage l'identification des bornes, 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 analogique AM/FM.
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 de gauche indique si le sous-canal HD2 est disponible pour cette chaîne HD.
État de l'acquisition du signal
Sous Android 15 et versions ultérieures, les applications de radio peuvent indiquer aux utilisateurs l'état de l'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 de 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 bornes (SIS) sont disponibles. Le SIS fournit des informations supplémentaires sur la station et le contenu en cours de lecture.
- Bit 8: indique si l'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 versions ultérieures.
Champ de métadonnées | Description |
---|---|
commentShortDescription |
Brève description du contexte du commentaire |
commentActualText |
Texte du commentaire |
commercial |
Publicité radio |
ufids |
Identifiants de fichier uniques (UFID) associés au contenu |
hdStationNameShort |
Nom court ou nom court universel de la station de radio HD |
hdStationNameLong |
Nom long, slogan ou message de la station de radio HD |