HAL de rádio de transmissão

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:
  • HAL do HIDL: quando uma nova sessão de sintonizador é aberta, a antiga precisa ser encerrada.
  • HAL do AIDL: como nenhuma sessão de sintonizador está disponível, apenas o callback do sintonizador precisa ser definido. Se ele existir, o callback antigo precisa ser redefinido.
HIDL 2.0 openSession(ITunerCallback callback) gera (Result result, ITunerSession session)
AIDL void setTunerCallback(in ITunerCallback callback)
Descrição:
  • HAL do HIDL: o fechamento de uma sessão de sintonizador não pode falhar e só pode ser emitido uma vez.
  • HAL do AIDL: não há sintonizador, e apenas o callback do sintonizador precisa ser redefinido.
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) ou status (em AIDL) imediatamente. Se o Result ou status for OK, o callback do sintonizador tuneFailed ou currentProgramInfoChanged 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 cada chunk 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 em IBroadcastRadio. Enquanto isso, ANTENNA_DISCONNECTED_TIMEOUT_MS é renomeado como ANTENNA_STATE_CHANGE_TIMEOUT_MS. Uma nova const int TUNER_TIMEOUT_MS foi adicionada. Todas as operações de ajuste, busca e etapa precisam ser concluídas nesse período.
  • Os tipos enumerados RDS e Deemphasis foram removidos da AIDL e definidos como const int em AmFmRegionConfig. Consequentemente, fmDeemphasis e fmRds em ProgramInfo são declarados como int, um resultado de computação de bits das respectivas flags. Enquanto isso, D50 e D75 são renomeados como DEEMPHASIS_D50 e DEEMPHASIS_D75, respectivamente.
  • O tipo enumerado ProgramInfoFlags foi removido da AIDL e definido como const int em ProgramInfo com um prefixo FLAG_ adicionado. Da mesma forma, infoFlags em ProgramInfo é declarado como int, um resultado de computação de bits de flags. TUNED também é renomeado como FLAG_TUNABLE para descrever melhor a definição da estação.
  • Em AmFmBandRange, scanSpacing é renomeado como seekSpacing, já que scan é renomeado como seek na AIDL.
  • Como o conceito de união foi introduzido na AIDL, MetadataKey e Metadata definidos na HAL HIDL não são mais usados. Uma união AIDL Metadata é definida na AIDL HAL. Cada valor de tipo enumerado que estava em MetadataKey agora é um campo em Metadata 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 ConfigFlags. 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.