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:
|
||
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: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) oustatus
(em AIDL) imediatamente. SeResult
oustatus
forOK
, o callback do sintonizadortuneFailed
oucurrentProgramInfoChanged
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 cadachunk
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 emIBroadcastRadio
. Enquanto isso,ANTENNA_DISCONNECTED_TIMEOUT_MS
foi renomeado paraANTENNA_STATE_CHANGE_TIMEOUT_MS
. Um novo const intTUNER_TIMEOUT_MS
é adicionados. Todas as operações de ajuste, busca e passos devem ser concluídas dentro desse tempo. - O tipo enumerado
RDS
eDeemphasis
são removidos na AIDL e definidos como const int emAmFmRegionConfig
. (correspondentemente, tantofmDeemphasis
quantofmRds
emProgramInfo
são declarados como int, um resultado do cálculo de bits de as respectivas sinalizações. Enquanto isso,D50
eD75
são renomeados comoDEEMPHASIS_D50
eDEEMPHASIS_D75
, respectivamente. - O tipo enumerado
ProgramInfoFlags
é removido na AIDL e definido como const int emProgramInfo
com o prefixoFLAG_
adicionado. Consequentemente,infoFlags
emProgramInfo
é declarado como int, um resultado do cálculo de bits. de sinalizações.TUNED
também foi renomeado comoFLAG_TUNABLE
para descrever melhor sua definição que a estação pode ser sintonizada. - 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 de HIDL não são mais usados. Uma união AIDLMetadata
é definida na HAL da AIDL. Cada valor de tipo enumerado que ficava emMetadataKey
agora é um campo emMetadata
pelo tipo de string ou int, dependendo das definições.