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 rádio broadcast.

Interface HAL de rádio de transmissão

A 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 rádio AM/FM e DAB.

Interfaces HIDL 2.0 e AIDL

A HAL de rádio de transmissão usa as interfaces descritas nas seções a seguir.

IAvisoListener

IAnnouncementListener é a interface de callback para o listener de aviso, que podem ser registrados na HAL de rádio de transmissão para receber anúncios. A interface tem as seguintes métodos:

IAvisoListener
Descrição:chamado sempre que a lista de avisos tem mudou.
HIDL 2.0 oneway onListUpdated(vec<Announcement> announcements)
AIDL oneway void onListUpdated(in Announcement[] announcements)

ICloseHandle

ICloseHandle é a alça de fechamento genérica para remover um callback que não precisa de um interface ativa.

ICloseHandle
Descrição:fechar a alça.
HIDL 2.0 close()
AIDL void close()

ITunerCallback

ITunerCallback é a interface de callback chamada pela HAL de rádio de transmissão para enviar atualizações para o serviço ao cliente da HAL.

ITunerCallback
Descrição:chamada pela HAL quando uma operação de ajuste (ajuste, procura (na AIDL) ou verificação (em 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:chamado ao ajustar, procurar (na AIDL) ou verificar (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:chamado ao ajustar, procurar (na AIDL) ou verificar (em HIDL) ou a etapa é bem-sucedida.
HIDL 2.0 oneway onCurrentProgramInfoChanged(ProgramInfo info)
AIDL void onCurrentProgramInfoChanged(in ProgramInfo info)
Descrição:chamado quando a lista do programa é atualizada as de cada bloco deve ser limitado a 500 kiB.
HIDL 2.0 oneway onProgramListUpdated(ProgramListChunk chunk)
AIDL oneway onProgramListUpdated(ProgramListChunk chunk)
Descrição:chamado quando a antena está conectada ou desconectado.
HIDL 2.0 oneway onAntennaStateChange(bool connected)
AIDL void onCurrentProgramInfoChanged(in ProgramInfo info)
Descrição:chamado quando o parâmetro específico do fornecedor valores são atualizados internamente na HAL (não invoque após chamar setParameters pelo cliente HAL).
HIDL 2.0 oneway onParametersUpdated(vec<VendorKeyValue> parameters)
AIDL void onParametersUpdated(in VendorKeyValue[] parameters)
Descrição:novidades na AIDL Chamado quando a flag de configuração é atualizados internamente na HAL (não devem ser invocado depois de chamar setConfigFlag pelo cliente da HAL).
HIDL 2.0 Não aplicável.
AIDL void onConfigFlagUpdated(in ConfigFlag flag, in boolean value)

IBroadcastRadio

IBroadcastRadio é a interface principal da HAL de rádio de transmissão. No HIDL 2.0 HAL, use a interface ITunerSession para o sintonizador para chamar operações. No entanto, em a maioria dos sintonizadores fica ativa por vez, desde que cada instância HAL de rádio de transmissão tenha apenas um sintonizador ícone). O ITunerSession foi removido das interfaces AIDL, e as interfaces dele foram movidas para IBroadcastRadio.

IBroadcastRadio
Descrição:acessar a descrição de um módulo e o dele recursos.
HIDL 2.0 getProperties() generates (Properties properties)
AIDL Properties getProperties()
Descrição:busca o AM/FM atual ou possível configuração da região.
HIDL 2.0 getAmFmRegionConfig(bool full) generates (Result result, AmFmRegionConfig config)
AIDL AmFmRegionConfig getAmFmRegionConfig(bool full)
Descrição:busca a região atual do DAB configuração do Terraform.
HIDL 2.0 getDabRegionConfig() generates (Result result, vec<DabTableEntry> config)
AIDL DabTableEntry[] getDabRegionConfig()
Descrição:recebe uma imagem do cache do módulo de opção. Na AIDL, o tamanho da imagem precisa ser inferior a 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 anúncios.
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 de HIDL: quando uma nova sessão de sintonizador é aberta, a sessão antiga precisa ser encerrada.
  • HAL da AIDL: como nenhuma sessão do sintonizador está disponível, somente o callback do sintonizador precisa ser definido. Se existir, o callback antigo não será definido.
HIDL 2.0 openSession(ITunerCallback callback) gera (Result result, ITunerSession session)
AIDL void setTunerCallback(in ITunerCallback callback)
Descrição:
  • HIDL HAL: o fechamento de uma sessão de sintonizador não pode falhar e só pode ser emitido uma vez.
  • HAL da AIDL: não há sintonizador, e apenas o callback do sintonizador precisa ser desativado.
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:procura o próximo programa válido na air. Para evitar confusão na 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:etapas para acessar o canal adjacente, que pode não ser ocupada por qualquer programa.
HIDL 2.0 step(bool directionUp) generates (Result result)
AIDL void step(in boolean directionUp)
Descrição:cancela a sintonização, a busca (em HIDL) ou a busca pendentes (em AIDL) ou operações de etapa.
HIDL 2.0 cancel()
AIDL void cancel()
Descrição:aplica um filtro à lista do programa e começa a enviar atualizações da lista do programa Chamada de retorno onProgramListUpdated.
HIDL 2.0 startProgramListUpdates(ProgramFilter filter) generates (Result result)
AIDL void startProgramListUpdates(in ProgramFilter filter)
Descrição:para de enviar atualizações da lista do programa.
HIDL 2.0 stopProgramListUpdates()
AIDL void stopProgramListUpdates()
Descrição:busca a configuração atual de um determinado config.
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âmetros 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 (na AIDL) e etapa) pode levar muito tempo e a linha de execução não for bloqueada por muito tempo, a operação deverá programar operações demoradas para que ocorram mais tarde e retornem rapidamente um status ou resultado. Mais detalhadamente, 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 Result ou status for OK, o callback do sintonizador tuneFailed ou currentProgramInfoChanged precisa ser chamado quando o ajuste uma tarefa falhou (por exemplo, devido a um tempo limite) ou foi concluída.

Da mesma forma, startProgramListUpdates também programa a tarefa demorada de atualizando a lista do programa para que ocorra mais tarde e para retornar rapidamente um status ou resultado. Método primeiro cancela solicitações de atualização pendentes, depois programa a tarefa de atualização e retorna rapidamente a resultado.

Disputa

Devido ao comportamento assíncrono das operações de ajuste (por exemplo, ajustar, examinar (em HIDL) ou buscar (em AIDL) e etapa), existe uma disputa entre o cancelamento da operação e o ajuste as operações. Se cancel for chamado depois que a HAL concluir uma operação de ajuste e antes o retorno de chamada for concluído, o cancelamento poderá ser ignorado e o retorno de chamada será concluído e recebido pelo cliente da HAL.

Da mesma forma, se stopProgramListUpdates for chamado depois que a HAL concluir um programa lista atualizada e antes que o callback onCurrentProgramInfoChanged seja concluído, stopProgramListUpdates pode 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 algumas interfaces métodos que transmitem dados de tamanho potencialmente grande são esclarecidos na HAL da AIDL.

  • getImage exige que a imagem retorne menos de 1 MB.
  • onProgramListUpdate exige que cada chunk tenha menos de 500 KiB. Listas de programas maiores devem ser divididas pela implementação da HAL em vários blocos e enviadas por vários callbacks.

Alterações nas estruturas de dados da HAL de AIDL

Além das alterações nas interfaces, essas alterações foram aplicadas às estruturas de dados definida na HAL de rádio de transmissão AIDL, 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 foi renomeado para ANTENNA_STATE_CHANGE_TIMEOUT_MS. Um novo const int TUNER_TIMEOUT_MS é adicionados. Todas as operações de ajuste, busca e passos devem ser concluídas dentro desse tempo.
  • O tipo enumerado RDS e Deemphasis são removidos na AIDL e definidos como const int em AmFmRegionConfig. (correspondentemente, tanto fmDeemphasis quanto fmRds em ProgramInfo são declarados como int, um resultado do cálculo de bits de as respectivas sinalizações. Enquanto isso, D50 e D75 são renomeados como DEEMPHASIS_D50 e DEEMPHASIS_D75, respectivamente.
  • O tipo enumerado ProgramInfoFlags é removido na AIDL e definido como const int em ProgramInfo com o prefixo FLAG_ adicionado. Consequentemente, infoFlags em ProgramInfo é declarado como int, um resultado do cálculo de bits. de sinalizações. TUNED também foi renomeado como FLAG_TUNABLE para descrever melhor sua definição que a estação pode ser sintonizada.
  • 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 de HIDL não são mais usados. Uma união AIDL Metadata é definida na HAL da AIDL. Cada valor de tipo enumerado que ficava em MetadataKey agora é um campo em Metadata pelo tipo de string ou int, dependendo das definições.