Radiodiffusion HAL

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 HAL: lorsqu'une nouvelle session de tuner est ouverte, l'ancienne session doit être arrêtée.
  • HAL AIDL: comme aucune session de tuner n'est disponible, seul le rappel du tuner doit être défini. Si elle existe, l'ancien rappel doit être défini.
HIDL 2.0 openSession(ITunerCallback callback) génère (Result result, ITunerSession session)
AIDL 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.
  • HAL AIDL: il n'y a pas de tuner, et seul le rappel du tuner doit être défini.
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) ou status (en AIDL). Si Result ou status est 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 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 chaque chunk 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 dans IBroadcastRadio. En attendant, ANTENNA_DISCONNECTED_TIMEOUT_MS est renommé ANTENNA_STATE_CHANGE_TIMEOUT_MS. Un nouvel int const TUNER_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 et Deemphasis sont supprimées dans AIDL et définies comme int const dans AmFmRegionConfig. En conséquence, fmDeemphasis et fmRds dans ProgramInfo sont déclarés en tant qu'entiers, un résultat de calcul de bits des indicateurs respectifs. 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 int const dans ProgramInfo avec un préfixe FLAG_ ajouté. En conséquence, infoFlags dans ProgramInfo 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, car scan est renommé seek dans AIDL.
  • Étant donné que le concept d'union est introduit dans AIDL, MetadataKey et Metadata définis dans le HAL HIDL 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.

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