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

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

Интерфейс HAL для вещательного радио

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

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

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

IAnnouncementListener

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

IAnnouncementListener
Описание: Вызывается всякий раз, когда изменяется список объявлений.
HIDL 2.0 oneway onListUpdated(vec<Announcement> announcements)
AIDL oneway void onListUpdated(in Announcement[] announcements)

ICloseHandle

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

ICloseHandle
Описание: Закройте ручку.
HIDL 2.0 close()
AIDL void close()

ITunerCallback

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

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

IBroadcastRadio

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

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

генерирует ,

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

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

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

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

  • Отмените все запланированные операции по настройке.
  • Проверьте, может ли операция быть выполнена на основе входных данных метода и состояния тюнера.
  • Запланируйте задачу настройки и немедленно верните Result (в HIDL) или status (в AIDL). Если Result или statusOK , необходимо вызвать функцию обратного вызова тюнера 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 . Добавлен новый const int TUNER_TIMEOUT_MS . Все операции настройки, поиска и шага должны быть завершены в течение этого времени.
  • Перечисления RDS и Deemphasis удалены из AIDL и определены как const int в AmFmRegionConfig . Соответственно, fmDeemphasis и fmRds в ProgramInfo объявлены как int, что является результатом битового вычисления соответствующих флагов. При этом D50 и D75 переименованы в DEEMPHASIS_D50 и DEEMPHASIS_D75 соответственно.
  • Перечисление ProgramInfoFlags удалено из AIDL и определено как const int в ProgramInfo с добавлением префикса FLAG_ . Соответственно, infoFlags в ProgramInfo объявлен как int, результат битового вычисления флагов. TUNED также переименован в FLAG_TUNABLE , чтобы лучше описать определение, на которое можно настроить станцию.
  • В AmFmBandRange scanSpacing переименован в seekSpacing , поскольку в AIDL scan переименован в seek .
  • С появлением концепции объединения в AIDL, MetadataKey и Metadata определённые в HIDL HAL, больше не используются. В AIDL HAL определено объединение Metadata AIDL. Каждое значение перечисления, ранее входившее в MetadataKey теперь является полем в Metadata со строковым или целочисленным типом, в зависимости от определения.

Поддержка DAB-радио

В этом разделе описывается поддержка DAB-радио.

Идентификаторы

Основным типом идентификатора для радио DAB и DMB в AIDL Broadcast Radio HAL является DAB_SID_EXT . DAB_SID_EXT использует 32-битные идентификаторы служб (SID), поэтому он может представлять SID как радио DAB, так и DMB.

Помимо основных идентификаторов, поддерживаются вторичные идентификаторы, такие как DAB_ENSEMBLE и DAB_FREQUENCY_KHZ . Это важно, поскольку несколько DAB-станций могут иметь один и тот DAB_SID_EXT , но при этом иметь разные значения DAB_ENSEMBLE или DAB_FREQUENCY_KHZ . Для обеспечения корректного обновления списка программ станции с одинаковым DAB_SID_EXT обновляются одновременно с помощью ITunerCallback#onProgramListUpdated . Затем это обновление передается в службу вещательного радио и диспетчер радиостанций, а затем в приложение радиостанции через android.hardware.radio.ProgramList .

Метаданные

В следующей таблице показаны поддерживаемые метаданные, специфичные для DAB в AIDL Broadcast Radio HAL:

Поле метаданных Описание
dabEnsembleName (сокращенная форма: dabEnsembleNameShort ) Название ансамбля станции DAB
dabServiceName (сокращенно от dabServiceNameShort ) Название службы станции DAB
dabComponentName (сокращенно от dabComponentNameShort ) Название компонента станции DAB

Поддержка HD-радио

В этом разделе описывается поддержка HD-радио.

Идентификаторы

HD_STATION_ID_EXT служит основным идентификатором для HD-радиостанций. Для более точной идентификации станций предусмотрены также вторичные идентификаторы, такие как HD_STATION_NAME и HD_STATION_LOCATION . HD_STATION_LOCATION , предоставляющий информацию о местоположении, был представлен в Android 15.

Включить или отключить цифровое радио

Начиная с Android 15, вы можете включать и отключать цифровое радио (например, HD-радио) с помощью настройки ConfigFlag . Для управления этим параметром для FM-радио используйте флаг FORCE_ANALOG_FM ; для AM-радио — флаг FORCE_ANALOG_AM . Установка флага в false включает HD-радио, а установка в значение true активирует аналоговое AM/FM-радио.

Доступны HD-каналы

Начиная с Android 15, HD-каналы, доступные для HD-радиостанции, могут быть представлены 8-битной битовой маской Metadata#hdSubChannelsAvailable в ProgramInfo.metadata . Например, значение бита 1 слева указывает, доступен ли подканал HD2 для этой HD-станции.

Статус получения сигнала

В Android 15 и более поздних версиях приложения для прослушивания радио могут показывать пользователям статус приёма сигнала HD-радиостанций. Это полезно, поскольку обнаружение сильного HD-сигнала иногда может занять несколько минут.

Чтобы предоставить эту информацию, система использует ProgramInfo.infoFlags для отслеживания статуса и обновляет приложение радио через ITunerCallback#onCurrentProgramInfoChanged.

Вот как статус представлен в ProgramInfo.infoFlags :

  • Бит 6: Указывает, получен ли HD-радиосигнал.
  • Бит 7: Показывает, доступны ли данные службы информации о станциях (SIS). SIS предоставляет дополнительную информацию о станции и воспроизводимой в данный момент передаче.
  • Бит 8: сообщает, доступен ли HD-цифровой звук.

Метаданные

В следующей таблице показаны поддерживаемые метаданные HD-радио для Android 15 и более поздних версий.

Поле метаданных Описание
commentShortDescription Краткое контекстное описание комментария
commentActualText Текст комментария
commercial Радиореклама
ufids Уникальные идентификаторы файлов (UFID), связанные с контентом
hdStationNameShort Краткое название HD-радиостанции или универсальное короткое название
hdStationNameLong Длинное название HD-радиостанции, слоган или сообщение от станции.

Экстренные оповещения

В Android 15 и более поздних версиях поддерживаются экстренные оповещения для HD-радиостанций, чтобы информировать пользователей радиоприложения о чрезвычайных оповещениях, отправляемых радиостанциями. Экстренное оповещение ( Alert ) соответствует стандарту Common Alerting Protocol (CAP) 1.2 и поддерживает оповещения, представленные в следующей таблице:

Информация оповещения Описание Доступны значения перечисления
AlertStatus Статус оповещения ACTUAL , EXERCISE , TEST
AlertMessageType Тип сообщения о чрезвычайном оповещении ALERT , UPDATE , CANCEL
AlertCategory Категория события, о котором идет речь в сообщении о чрезвычайной ситуации GEO , MET , SAFETY , SECURITY , RESCUE , FIRE , HEALTH , ENV , TRANSPORT , INFRA , CBRNE , OTHER
AlertUrgency Актуальность события, о котором идет речь в сообщении о чрезвычайной ситуации IMMEDIATE , EXPECTED , FUTURE , PAST , UNKNOWN
AlertSeverity Серьезность события, о котором идет речь в сообщении о чрезвычайной ситуации EXTREME , SEVERE , MODERATE , MINOR , UNKNOWN
AlertCertainty Достоверность события, о котором идет речь в сообщении о чрезвычайной ситуации OBSERVED , LIKELY , POSSIBLE , UNLIKELY , UNKNOWN
Для отображения информации о текущем оповещении можно использовать Alert (содержащее информацию из таблицы), текстовые оповещения и AlertArea Alert — необязательное поле в ProgramInfo , которое можно отправлять из Broadcast Radio HAL в радиоприложения через обратные вызовы тюнера для получения информации о текущей программе и обновлений списка программ.