Вещание радио HAL

В следующих разделах описывается, как работать с уровнем аппаратной абстракции (HAL) для реализации радиовещания.

Радиовещательный интерфейс HAL

HAL радиовещания предоставляет структуры данных и интерфейсы на аппаратном уровне для реализации радиовещания, такого как радио AM/FM и DAB.

Интерфейсы HIDL 2.0 и AIDL

Вещательная радиостанция HAL использует интерфейсы, описанные в следующих разделах.

IОбъявлениеСлушатель

IAnnouncementListener — это интерфейс обратного вызова для прослушивателя объявлений, который можно зарегистрировать на радиовещании HAL для получения объявлений. Интерфейс имеет следующие методы:

IОбъявлениеСлушатель
Описание: Вызывается всякий раз, когда список объявлений изменяется.
ХИДЛ 2.0 oneway onListUpdated(vec<Announcement> announcements)
АИДЛ oneway void onListUpdated(in Announcement[] announcements)

ICloseHandle

ICloseHandle — это универсальный дескриптор закрытия для удаления обратного вызова, для которого не требуется активный интерфейс.

ICloseHandle
Описание: Закройте ручку.
ХИДЛ 2.0 close()
АИДЛ void close()

ITunerОбратный вызов

ITunerCallback — это интерфейс обратного вызова, вызываемый широковещательной радиостанцией HAL для отправки обновлений в клиентскую службу HAL.

ITunerОбратный вызов
Описание: Вызывается HAL, когда операция настройки (настройка, поиск (в AIDL) или сканирование (в HIDL) и шаг завершаются успешно) завершается асинхронно.
ХИДЛ 2.0 oneway onCurrentProgramInfoChanged(ProgramInfo info)
АИДЛ void onCurrentProgramInfoChanged(in ProgramInfo info)
Описание: Вызывается при настройке, поиске (в AIDL) или сканировании (в HIDL) или при успешном выполнении шага.
ХИДЛ 2.0 oneway onTuneFailed(Result result, ProgramSelector selector)
АИДЛ void onTuneFailed(in Result result, in ProgramSelector selector)
Описание: Вызывается при настройке, поиске (в AIDL) или сканировании (в HIDL) или при успешном выполнении шага.
ХИДЛ 2.0 oneway onCurrentProgramInfoChanged(ProgramInfo info)
АИДЛ void onCurrentProgramInfoChanged(in ProgramInfo info)
Описание: Вызывается при обновлении списка программ; размер каждого фрагмента должен быть ограничен 500 КБ.
ХИДЛ 2.0 oneway onProgramListUpdated(ProgramListChunk chunk)
АИДЛ oneway onProgramListUpdated(ProgramListChunk chunk)
Описание: Вызывается, когда антенна подключена или отключена.
ХИДЛ 2.0 oneway onAntennaStateChange(bool connected)
АИДЛ void onCurrentProgramInfoChanged(in ProgramInfo info)
Описание: Вызывается, когда значения параметров, специфичные для поставщика, обновляются внутри HAL (не вызывать после вызова setParameters клиентом HAL).
ХИДЛ 2.0 oneway onParametersUpdated(vec<VendorKeyValue> parameters)
АИДЛ void onParametersUpdated(in VendorKeyValue[] parameters)
Описание: Новое в AIDL. Вызывается, когда флаг конфигурации обновляется внутри HAL (не следует вызывать после вызова setConfigFlag клиентом HAL).
ХИДЛ 2.0 Непригодный.
АИДЛ void onConfigFlagUpdated(in ConfigFlag flag, in boolean value)

IBroadcastRadio

IBroadcastRadio — это основной интерфейс для радиовещания HAL. В HAL HIDL 2.0 используйте интерфейс ITunerSession для тюнера для вызова операций. Однако одновременно активен не более одного тюнера (при условии, что каждый экземпляр HAL радиовещания имеет только один чип тюнера). ITunerSession был удален из интерфейсов AIDL, а его интерфейсы перенесены в IBroadcastRadio .

IBroadcastRadio
Описание: Получите описание модуля и его возможностей.
ХИДЛ 2.0 getProperties() generates (Properties properties)
АИДЛ Properties getProperties()
Описание: извлекает текущую или возможную конфигурацию региона AM/FM.
ХИДЛ 2.0 getAmFmRegionConfig(bool full) generates (Result result, AmFmRegionConfig config)
АИДЛ AmFmRegionConfig getAmFmRegionConfig(bool full)
Описание: извлекает текущую конфигурацию региона DAB.
ХИДЛ 2.0 getDabRegionConfig() generates (Result result, vec<DabTableEntry> config)
АИДЛ DabTableEntry[] getDabRegionConfig()
Описание: Получает образ из кэша радиомодуля. В AIDL размер изображения должен быть меньше 1 МБ из-за жесткого ограничения на буфер транзакции связывателя.
ХИДЛ 2.0 getImage(uint32_t id) generates (vec<uint8_t> image)
АИДЛ byte[] getImage(in int id)
Описание: Регистрирует прослушиватель объявлений.
ХИДЛ 2.0 registerAnnouncementListener(vec<AnnouncementType> enabled,IAnnouncementListener listener) generates (Result result, ICloseHandle closeHandle)
АИДЛ ICloseHandle registerAnnouncementListener(in IAnnouncementListener listener, in AnnouncementType[] enabled)
Описание:
  • HIDL HAL: При открытии нового сеанса тюнера старый сеанс должен быть завершен.
  • AIDL HAL: поскольку сеанс настройки не доступен, необходимо установить только обратный вызов тюнера. Если он существует, старый обратный вызов должен быть отключен.
ХИДЛ 2.0 openSession(ITunerCallback callback) генерирует (Result result, ITunerSession session)
АИДЛ void setTunerCallback(in ITunerCallback callback)
Описание:
  • HIDL HAL: Закрытие сеанса настройки не должно завершаться неудачей и должно быть выполнено только один раз.
  • AIDL HAL: Тюнера нет, необходимо отключить только обратный вызов тюнера.
ХИДЛ 2.0 close()
АИДЛ unsetTunerCallback()
Описание: Настраивается на указанную программу.
ХИДЛ 2.0 tune(ProgramSelector program) generates (Result result)
АИДЛ void tune(in ProgramSelector program)
Описание: Ищет следующую действительную программу в эфире . Чтобы избежать путаницы в AIDL, scan переименовывается в seek .
ХИДЛ 2.0 scan(bool directionUp, bool skipSubChannel) generates (Result result)
АИДЛ void seek(in boolean directionUp, in boolean skipSubChannel)
Описание: Переход на соседний канал, который не может быть занят какой-либо программой.
ХИДЛ 2.0 step(bool directionUp) generates (Result result)
АИДЛ void step(in boolean directionUp)
Описание: Отменяет ожидающие настройки, сканирование (в HIDL) или поиск (в AIDL) или пошаговые операции.
ХИДЛ 2.0 cancel()
АИДЛ void cancel()
Описание: применяет фильтр к списку программ и начинает отправлять обновления списка программ через обратный вызов onProgramListUpdated .
ХИДЛ 2.0 startProgramListUpdates(ProgramFilter filter) generates (Result result)
АИДЛ void startProgramListUpdates(in ProgramFilter filter)
Описание: Останавливает отправку обновлений списка программ.
ХИДЛ 2.0 stopProgramListUpdates()
АИДЛ void stopProgramListUpdates()
Описание: извлекает текущую настройку данного флага конфигурации.
ХИДЛ 2.0 isConfigFlagSet(ConfigFlag flag) generates (Result result, bool value)
АИДЛ boolean isConfigFlagSet(in ConfigFlag flag)
Описание: Устанавливает данный флаг конфигурации.
ХИДЛ 2.0 setConfigFlag(ConfigFlag flag, bool value) generates (Result result)
АИДЛ void setConfigFlag(in ConfigFlag flag, boolean value)
Описание: Устанавливает значения параметров, зависящие от поставщика.
ХИДЛ 2.0 setParameters(vec<VendorKeyValue> parameters)

генерирует ,

(vec<VendorKeyValue> results)
АИДЛ VendorKeyValue[] setParameters(in VendorKeyValue[] parameters)
Описание: Извлекает значения параметров, зависящие от поставщика.
ХИДЛ 2.0 getParameters(vec<string> keys) generates (vec<VendorKeyValue> parameters)
АИДЛ VendorKeyValue[] getParameters(in String[] keys)

Уточнения интерфейса

Асинхронное поведение

Поскольку каждая операция настройки (например, настройка, сканирование (в HIDL) или поиск (в AIDL) и шаг) может занимать много времени, а поток не должен блокироваться на длительное время, операция должна планировать трудоемкие операции. произойти позже и быстро вернуть статус или результат. Подробно каждая операция должна:

  • Отмените все ожидающие операции настройки.
  • Проверьте, может ли операция быть обработана на основе входных данных метода и состояния тюнера.
  • Запланируйте задачу настройки, а затем немедленно верните Result (в HIDL) или status (в AIDL). Если Result или status имеют OK , обратный вызов тюнера tuneFailed или currentProgramInfoChanged должен быть вызван, когда задача настройки не удалась (например, из-за тайм-аута) или была завершена.

Аналогично, startProgramListUpdates также планирует выполнение трудоемкой задачи по обновлению списка программ, которая будет выполнена позже и быстро вернет статус или результат. Метод сначала отменяет ожидающие запросы на обновление, а затем планирует задачу обновления и быстро возвращает результат.

Состояние гонки

Из-за асинхронного поведения операций настройки (например, настройки, сканирования (в HIDL) или поиска (в AIDL) и шага), существует состояние гонки между отменой операции и операциями настройки. Если cancel вызывается после того, как HAL завершит операцию настройки и до завершения обратного вызова, отмену можно игнорировать, а обратный вызов должен завершиться и быть получен клиентом HAL.

Аналогично, если stopProgramListUpdates вызывается после того, как HAL завершит обновление списка программ и до завершения обратного вызова onCurrentProgramInfoChanged , stopProgramListUpdates можно игнорировать и обратный вызов должен завершиться.

Ограничение размера данных

Поскольку существует жесткое ограничение на буфер транзакции связывателя, ограничение данных для некоторых методов интерфейса, передающих данные потенциально большого размера, уточняется в AIDL HAL.

  • getImage требует, чтобы возвращаемое изображение имело размер менее 1 МБ.
  • onProgramListUpdate требует, чтобы каждый chunk был меньше 500 КБ. Более крупные списки программ должны быть разделены реализацией HAL на несколько частей и отправлены через несколько обратных вызовов.

Изменения в структурах данных AIDL HAL

Помимо изменений в интерфейсах, эти изменения были применены к структурам данных, определенным в AIDL HAL вещания, который использует преимущества AIDL.

  • Перечисление Constant удалено в AIDL и определено как const int в IBroadcastRadio . При этом ANTENNA_DISCONNECTED_TIMEOUT_MS переименовывается в ANTENNA_STATE_CHANGE_TIMEOUT_MS . Добавлена ​​новая константа int TUNER_TIMEOUT_MS . Все операции настройки, поиска и пошагового выполнения должны быть завершены в течение этого времени.
  • Enum RDS и Deemphasis удалены в AIDL и определены как const int в AmFmRegionConfig . Соответственно, и fmDeemphasis , и fmRds в ProgramInfo объявлены как int, результат вычисления битов соответствующих флагов. При этом D50 и D75 переименованы в DEEMPHASIS_D50 и DEEMPHASIS_D75 соответственно.
  • Enum ProgramInfoFlags удалены в AIDL и определены как const int в ProgramInfo с добавленным префиксом FLAG_ . Соответственно, infoFlags в ProgramInfo объявляется как int, битовый результат вычисления флагов. TUNED также переименован в FLAG_TUNABLE , чтобы лучше описать определение, на которое можно настроить станцию.
  • В AmFmBandRange scanSpacing переименован в seekSpacing , поскольку в AIDL scan переименован в seek .
  • Поскольку в AIDL введена концепция объединения , MetadataKey и Metadata , определенные в HIDL HAL, больше не используются. Metadata объединения AIDL определены в AIDL HAL. Каждое значение перечисления, ранее входившее в MetadataKey , теперь является полем в Metadata с типом string или int, в зависимости от их определения.