As seções a seguir descrevem como trabalhar com a camada de abstração de hardware (HAL) para implementar o rádio de transmissão.
Interface HAL de rádio de transmissão
O HAL de rádio de transmissão fornece estruturas de dados e interfaces no nível do hardware para implementar rádio de transmissão, como AM/FM e rádio DAB.
Interfaces HIDL 2.0 e AIDL
O HAL de rádio de transmissão usa as interfaces descritas nas seções a seguir.
IAnnouncementListener
IAnnouncementListener
é a interface de callback do listener de aviso, que
pode ser registrado no HAL de rádio de transmissão para receber avisos. A interface tem os seguintes
métodos:
IAnnouncementListener | ||
---|---|---|
Descrição:chamada sempre que a lista de avisos muda. | ||
HIDL 2.0 | oneway onListUpdated(vec<Announcement> announcements) |
|
AIDL | oneway void onListUpdated(in Announcement[] announcements) |
ICloseHandle
ICloseHandle
é o identificador de fechamento genérico para remover um callback que não precisa de uma
interface ativa.
ICloseHandle | ||
---|---|---|
Descrição:feche o handle. | ||
HIDL 2.0 | close() |
|
AIDL | void close() |
ITunerCallback
ITunerCallback
é a interface de callback chamada pelo HAL de rádio de transmissão para
enviar atualizações ao serviço de cliente HAL.
ITunerCallback | ||
---|---|---|
Descrição:é chamado pelo HAL quando uma operação de ajuste (sintonizar, procurar (na AIDL) ou verificar (na HIDL) e a etapa é concluída) falha de forma assíncrona. | ||
HIDL 2.0 | oneway onCurrentProgramInfoChanged(ProgramInfo info) |
|
AIDL | void onCurrentProgramInfoChanged(in ProgramInfo info) |
|
Descrição:chamada quando a busca, a busca (em AIDL) ou a verificação (em HIDL) ou a etapa é bem-sucedida. | ||
HIDL 2.0 | oneway onTuneFailed(Result result, ProgramSelector selector) |
|
AIDL | void onTuneFailed(in Result result, in ProgramSelector selector) |
|
Descrição:chamada quando a busca, a busca (em AIDL) ou a verificação (em HIDL) ou a etapa é bem-sucedida. | ||
HIDL 2.0 | oneway onCurrentProgramInfoChanged(ProgramInfo info) |
|
AIDL | void onCurrentProgramInfoChanged(in ProgramInfo info) |
|
Descrição:chamada quando a lista de programas é atualizada. O tamanho de cada bloco precisa ser limitado a 500 kB. | ||
HIDL 2.0 | oneway onProgramListUpdated(ProgramListChunk chunk) |
|
AIDL | oneway onProgramListUpdated(ProgramListChunk chunk) |
|
Descrição:chamada quando a antena está conectada ou desconectada. | ||
HIDL 2.0 | oneway onAntennaStateChange(bool connected) |
|
AIDL | void onCurrentProgramInfoChanged(in ProgramInfo info) |
|
Descrição:é chamada quando os valores do parâmetro específico do fornecedor
são atualizados internamente no HAL. Não invoque depois de chamar
setParameters pelo cliente HAL. |
||
HIDL 2.0 | oneway onParametersUpdated(vec<VendorKeyValue> parameters) |
|
AIDL | void onParametersUpdated(in VendorKeyValue[] parameters) |
|
Descrição:novidade na AIDL. Chamada quando a flag de configuração é
atualizada internamente no HAL. Não pode ser
invocada após a chamada de setConfigFlag pelo cliente HAL. |
||
HIDL 2.0 | Não aplicável. | |
AIDL | void onConfigFlagUpdated(in ConfigFlag flag, in boolean value) |
IBroadcastRadio
IBroadcastRadio
é a interface principal do HAL de rádio de transmissão. No HAL
2.0 do HIDL, use a interface ITunerSession
para o sintonizador para chamar operações. No entanto, no
máximo, um sintonizador está ativo por vez (desde que cada instância do HAL de rádio de transmissão tenha apenas um chip
sintonizador).
ITunerSession
foi removido das interfaces AIDL, e as interfaces foram movidas para
IBroadcastRadio
.
IBroadcastRadio | ||
---|---|---|
Description:mostra a descrição de um módulo e os recursos dele. | ||
HIDL 2.0 | getProperties() generates (Properties properties) |
|
AIDL | Properties getProperties() |
|
Descrição:busca a configuração atual ou possível de região AM/FM. | ||
HIDL 2.0 | getAmFmRegionConfig(bool full) generates (Result result, AmFmRegionConfig
config) |
|
AIDL | AmFmRegionConfig getAmFmRegionConfig(bool full) |
|
Descrição:recupera a configuração atual da região DAB. | ||
HIDL 2.0 | getDabRegionConfig() generates (Result result, vec<DabTableEntry>
config) |
|
AIDL | DabTableEntry[] getDabRegionConfig() |
|
Descrição:extrai uma imagem do cache do módulo de rádio. No AIDL, o tamanho da imagem precisa ser menor que 1 MB devido a um limite rígido no buffer de transação do binder. | ||
HIDL 2.0 | getImage(uint32_t id) generates (vec<uint8_t> image) |
|
AIDL | byte[] getImage(in int id) |
|
Descrição:registra o listener de aviso. | ||
HIDL 2.0 | registerAnnouncementListener(vec<AnnouncementType>
enabled,IAnnouncementListener listener) generates (Result result, ICloseHandle
closeHandle) |
|
AIDL | ICloseHandle registerAnnouncementListener(in IAnnouncementListener listener, in
AnnouncementType[] enabled) |
|
Descrição:
|
||
HIDL 2.0 | openSession(ITunerCallback callback) gera
(Result result, ITunerSession session) |
|
AIDL | void setTunerCallback(in ITunerCallback callback) |
|
Descrição:
|
||
HIDL 2.0 | close() |
|
AIDL | unsetTunerCallback() |
|
Descrição:sintoniza um programa especificado. | ||
HIDL 2.0 | tune(ProgramSelector program) generates (Result result) |
|
AIDL | void tune(in ProgramSelector program) |
|
Descrição:busca o próximo programa válido no
ar. Para evitar confusão no AIDL,
scan foi renomeado como seek .
|
||
HIDL 2.0 | scan(bool directionUp, bool skipSubChannel) generates (Result result) |
|
AIDL | void seek(in boolean directionUp, in boolean skipSubChannel) |
|
Descrição:vai para o canal adjacente, que pode não estar ocupado por nenhum programa. | ||
HIDL 2.0 | step(bool directionUp) generates (Result result) |
|
AIDL | void step(in boolean directionUp) |
|
Descrição:cancela a sintonia pendente, a verificação (em HIDL) ou a busca (em AIDL) ou as operações de etapa. | ||
HIDL 2.0 | cancel() |
|
AIDL | void cancel() |
|
Descrição:aplica um filtro à lista de programas e
começa a enviar atualizações da lista de programas por
callback onProgramListUpdated . |
||
HIDL 2.0 | startProgramListUpdates(ProgramFilter filter) generates (Result result) |
|
AIDL | void startProgramListUpdates(in ProgramFilter filter) |
|
Descrição:interrompe o envio de atualizações da lista de programas. | ||
HIDL 2.0 | stopProgramListUpdates() |
|
AIDL | void stopProgramListUpdates() |
|
Descrição:recupera a configuração atual de uma flag de configuração. | ||
HIDL 2.0 | isConfigFlagSet(ConfigFlag flag) generates (Result result, bool value) |
|
AIDL | boolean isConfigFlagSet(in ConfigFlag flag) |
|
Descrição:define a flag de configuração especificada. | ||
HIDL 2.0 | setConfigFlag(ConfigFlag flag, bool value) generates (Result result) |
|
AIDL | void setConfigFlag(in ConfigFlag flag, boolean value) |
|
Descrição:define valores de parâmetro específicos do fornecedor. | ||
HIDL 2.0 | setParameters(vec<VendorKeyValue> parameters)
gera, (vec<VendorKeyValue> results) |
|
AIDL | VendorKeyValue[] setParameters(in VendorKeyValue[] parameters) |
|
Descrição:recupera valores de parâmetros específicos do fornecedor. | ||
HIDL 2.0 | getParameters(vec<string> keys) generates (vec<VendorKeyValue>
parameters) |
|
AIDL | VendorKeyValue[] getParameters(in String[] keys) |
Esclarecimentos sobre a interface
Comportamento assíncrono
Como cada operação de ajuste (por exemplo, ajuste, verificação [em HIDL] ou busca [em AIDL] e etapa) pode levar muito tempo e a linha de execução não pode ser bloqueada por muito tempo, a operação precisa programar operações demoradas para ocorrer mais tarde e retornar rapidamente um status ou resultado. Em detalhes, cada operação precisa:
- Cancelar todas as operações de ajuste pendentes.
- Verifique se a operação pode ser processada com base nas entradas do método e no status do sintonizador.
- Programe a tarefa de ajuste e retorne o
Result
(em HIDL) oustatus
(em AIDL) imediatamente. Se oResult
oustatus
forOK
, o callback do sintonizadortuneFailed
oucurrentProgramInfoChanged
precisará ser chamado quando a tarefa de ajuste falhar (por exemplo, devido a um tempo limite) ou for concluída.
Da mesma forma, startProgramListUpdates
também programa a tarefa de
atualização da lista de programas, que consome tempo, para ocorrer mais tarde e retornar rapidamente um status ou resultado. O método
primeiro cancela as solicitações de atualização pendentes e, em seguida, programa a tarefa de atualização e retorna rapidamente o
resultado.
Condição de disputa
Devido ao comportamento assíncrono das operações de ajuste (por exemplo, ajuste, verificação (em HIDL) ou busca
(em AIDL) e etapa), existe uma condição de corrida entre o cancelamento da operação e as operações
de ajuste. Se cancel
for chamado depois que o HAL concluir uma operação de ajuste e antes
que o callback seja concluído, o cancelamento poderá ser ignorado, e o callback será concluído e recebido
pelo cliente HAL.
Da mesma forma, se stopProgramListUpdates
for chamado depois que o HAL concluir uma atualização
da lista de programas e antes que o callback onCurrentProgramInfoChanged
seja concluído,
stopProgramListUpdates
poderá ser ignorado e o callback será concluído.
Limite de tamanho de dados
Como há um limite rígido no buffer de transação do binder, o limite de dados para alguns métodos de interface que transmitem dados de tamanho potencialmente grande é esclarecido no HAL da AIDL.
getImage
exige que a imagem retornada tenha menos de 1 MB.- O
onProgramListUpdate
exige que cadachunk
tenha menos de 500 KiB. Listas de programas maiores precisam ser divididas pela implementação do HAL em vários blocos e enviadas por vários callbacks.
Mudanças nas estruturas de dados da AIDL HAL
Além das mudanças nas interfaces, essas mudanças foram aplicadas às estruturas de dados definidas na HAL AIDL de transmissão de rádio, que aproveita a AIDL.
- O tipo enumerado
Constant
foi removido da AIDL e definido como const int emIBroadcastRadio
. Enquanto isso,ANTENNA_DISCONNECTED_TIMEOUT_MS
é renomeado comoANTENNA_STATE_CHANGE_TIMEOUT_MS
. Uma nova const intTUNER_TIMEOUT_MS
foi adicionada. Todas as operações de ajuste, busca e etapa precisam ser concluídas nesse período. - Os tipos enumerados
RDS
eDeemphasis
foram removidos da AIDL e definidos como const int emAmFmRegionConfig
. Consequentemente,fmDeemphasis
efmRds
emProgramInfo
são declarados como int, um resultado de computação de bits das respectivas flags. Enquanto isso,D50
eD75
são renomeados comoDEEMPHASIS_D50
eDEEMPHASIS_D75
, respectivamente. - O tipo enumerado
ProgramInfoFlags
foi removido da AIDL e definido como const int emProgramInfo
com um prefixoFLAG_
adicionado. Da mesma forma,infoFlags
emProgramInfo
é declarado como int, um resultado de computação de bits de flags.TUNED
também é renomeado comoFLAG_TUNABLE
para descrever melhor a definição da estação. - Em
AmFmBandRange
,scanSpacing
é renomeado comoseekSpacing
, já quescan
é renomeado comoseek
na AIDL. - Como o conceito de união foi introduzido na AIDL,
MetadataKey
eMetadata
definidos na HAL HIDL não são mais usados. Uma união AIDLMetadata
é definida na AIDL HAL. Cada valor de tipo enumerado que estava emMetadataKey
agora é um campo emMetadata
com o tipo de string ou int, dependendo das definições.
Suporte a rádio DAB
Esta seção descreve o suporte ao rádio DAB.
Identificadores
O tipo de identificador primário para rádio DAB e DMB no HAL de rádio de transmissão da AIDL é
DAB_SID_EXT
. O DAB_SID_EXT
usa identificadores de serviço (SIDs) de 32 bits para representar
o SID de rádios DAB e DMB.
Além dos identificadores principais, os secundários, como DAB_ENSEMBLE
e
DAB_FREQUENCY_KHZ
, são aceitos. Isso é importante porque várias estações DAB
podem compartilhar um DAB_SID_EXT
, mas ter valores diferentes de DAB_ENSEMBLE
ou DAB_FREQUENCY_KHZ
. Para garantir atualizações precisas da lista de programas, as estações com o mesmo DAB_SID_EXT
são atualizadas juntas usando o ITunerCallback#onProgramListUpdated
. Essa atualização é transmitida para o serviço de rádio
de transmissão e o gerenciador de rádio e, por fim, para o app de rádio por meio de
android.hardware.radio.ProgramList
.
Metadados
A tabela a seguir mostra os metadados específicos compatíveis com DAB no HAL de rádio de transmissão AIDL:
Campo de metadados | Descrição |
---|---|
dabEnsembleName (forma abreviada: dabEnsembleNameShort ) |
Nome do conjunto da estação DAB |
dabServiceName (abreviação de dabServiceNameShort ) |
Nome do serviço da estação DAB |
dabComponentName (abreviação de dabComponentNameShort ) |
Nome do componente da estação DAB |
Rádio HD rupport
Esta seção descreve o suporte à rádio HD.
Identificadores
HD_STATION_ID_EXT
é o identificador principal das estações de rádio HD. Para melhorar
a identificação da estação, também são fornecidos identificadores secundários, como HD_STATION_NAME
e
HD_STATION_LOCATION
. O HD_STATION_LOCATION
, que
fornece informações de local, foi introduzido no Android 15.
Ativar ou desativar o rádio digital
A partir do Android 15, é possível ativar ou desativar o rádio digital (como o rádio HD) ajustando
ConfigFlag
s. Para controlar essa configuração para rádio FM, use a
sinalização FORCE_ANALOG_FM
. Para rádio AM, use a sinalização FORCE_ANALOG_AM
.
Definir a flag como false
ativa o rádio HD, enquanto a definição como
true
força o rádio AM/FM analógico.
Canais em HD disponíveis
A partir do Android 15, os canais HD atualmente disponíveis para uma estação de rádio HD podem
ser representados por uma máscara de bits de 8 bits, Metadata#hdSubChannelsAvailable
,
em ProgramInfo.metadata
. Por exemplo, o valor do bit 1 da esquerda representa se
o subcanal HD2 está disponível para essa estação HD.
Status de aquisição do sinal
No Android 15 e versões mais recentes, os apps de rádio podem mostrar aos usuários o status de aquisição de sinal de estações de rádio em alta definição. Isso é útil porque, às vezes, a aquisição de um sinal HD forte pode levar alguns instantes.
Para fornecer essas informações, o sistema usa ProgramInfo.infoFlags
para rastrear o
status e atualiza o app de rádio por meio de
ITunerCallback#onCurrentProgramInfoChanged.
Confira como o status é representado em ProgramInfo.infoFlags
:
- Bit 6: indica se o sinal de rádio HD foi adquirido.
- Bit 7: mostra se os dados do serviço de informações da estação (SIS, na sigla em inglês) estão disponíveis. O SIS fornece informações extras sobre a estação e o que está sendo reproduzido.
- Bit 8: informa se o áudio digital HD está disponível.
Metadados
A tabela a seguir mostra os metadados de rádio HD compatíveis com o Android 15 e versões mais recentes.
Campo de metadados | Descrição |
---|---|
commentShortDescription |
Breve descrição do contexto do comentário |
commentActualText |
Texto do comentário |
commercial |
Comercial de rádio |
ufids |
Identificadores de arquivos exclusivos (UFIDs) associados ao conteúdo |
hdStationNameShort |
O nome abreviado ou universal da estação de rádio em alta definição |
hdStationNameLong |
O nome completo, o slogan ou uma mensagem da estação de rádio em alta definição. |