Вещание радио 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, в зависимости от их определений.

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

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

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

Основной тип идентификатора для радио DAB и DMB в HAL широковещательного радио AIDL — 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 s. Чтобы управлять этой настройкой для 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 в радиоприложения через обратные вызовы тюнера для получения текущей информации о программе и обновлений списка программ.

,

В следующих разделах описывается, как работать с уровнем аппаратной абстракции (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, в зависимости от их определений.

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

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

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

Основным типом идентификатора для радио DAB и DMB в HAL широковещательного радио AIDL является 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 s. Чтобы управлять этой настройкой для 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 в радиоприложения через обратные вызовы тюнера для получения текущей информации о программе и обновлений списка программ.

,

В следующих разделах описывается, как работать с уровнем аппаратной абстракции (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 . Новый const 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 , так как scan переименовано в seek в AIDL.
  • Поскольку концепция союза вводится в AIDL, MetadataKey и Metadata определенные в Hidl HAL, больше не используются. Metadata AIDL Union определены в AIDL HAL. Каждое значение Enum, ранее в MetadataKey теперь является поле в Metadata с типом строки или Int, в зависимости от их определений.

DAB Radio Support

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

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

Основной тип идентификатора для радио DAB и DMB в радиовещании AIDL Radio HAL IS DAB_SID_EXT . DAB_SID_EXT использует 32-разрядные идентификаторы услуг (SIDS), чтобы он мог представлять SID как DAB, так и DMB Radio.

В дополнение к первичным идентификаторам поддерживаются вторичные идентификаторы, такие как DAB_ENSEMBLE и DAB_FREQUENCY_KHZ . Это важно, потому что несколько станций DAB могут разделять DAB_SID_EXT , имея различные значения DAB_ENSEMBLE или DAB_FREQUENCY_KHZ . Чтобы обеспечить точные обновления списка программ, станции с одинаковыми DAB_SID_EXT обновляются вместе с использованием ITunerCallback#onProgramListUpdated . Это обновление затем передается на радиовещательную радиостанцию ​​и менеджер Radio, и, наконец, в Radio App через android.hardware.radio.ProgramList .

Метаданные

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

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

HD Radio Rupport

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

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

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

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

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

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

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

Статус сбора сигнала

В Android 15 и Highers Radio Apps могут показывать пользователям состояние получения сигнала радиостанций HD. Это полезно, потому что приобретение сильного сигнала HD иногда может занять несколько минут.

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

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

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

Метаданные

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

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

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

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

Предупреждать информацию Описание Enum значения доступны
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 , так что его можно отправить из радиовещания Radio HAL в Radio Apps через обратные вызовы Tuner для текущей информации о программе и обновлениях списка программ.

,

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

Вещательный радиоподобный интерфейс HAL

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

Интерфейсы 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 oneway onProgramListUpdated(ProgramListChunk chunk)
Описание: вызывается, когда антенна подключена или отключена.
HIDL 2.0 oneway onAntennaStateChange(bool connected)
Aidl void onCurrentProgramInfoChanged(in ProgramInfo info)
Описание: Вызовов, когда значения параметров, специфичных для поставщика, обновляются внутренне в HAL (не вызывайте после вызова setParameters от HAL Client).
HIDL 2.0 oneway onParametersUpdated(vec<VendorKeyValue> parameters)
Aidl void onParametersUpdated(in VendorKeyValue[] parameters)
Описание: новое в AIDL. Вызывается, когда флаг конфигурации обновляется внутри HAL (не следует вызывать после вызова setConfigFlag от HAL Client).
HIDL 2.0 Непригодный.
Aidl void onConfigFlagUpdated(in ConfigFlag flag, in boolean value)

Ibroadcastradio

IBroadcastRadio является основным интерфейсом для радиовещательного радио HAL. В HIDL 2.0 HAL используйте интерфейс 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 или status в OK , Tuner Callback 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 добавлен. В это время все настройки, искать и шаг должны быть завершены в течение этого времени.
  • 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 , так как scan переименовано в seek в AIDL.
  • Поскольку концепция союза вводится в AIDL, MetadataKey и Metadata определенные в Hidl HAL, больше не используются. Metadata AIDL Union определены в AIDL HAL. Каждое значение Enum, ранее в MetadataKey теперь является поле в Metadata с типом строки или Int, в зависимости от их определений.

DAB Radio Support

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

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

Основной тип идентификатора для радио DAB и DMB в радиовещании AIDL Radio HAL IS DAB_SID_EXT . DAB_SID_EXT использует 32-разрядные идентификаторы услуг (SIDS), чтобы он мог представлять SID как DAB, так и DMB Radio.

В дополнение к первичным идентификаторам поддерживаются вторичные идентификаторы, такие как DAB_ENSEMBLE и DAB_FREQUENCY_KHZ . Это важно, потому что несколько станций DAB могут разделять DAB_SID_EXT , имея различные значения DAB_ENSEMBLE или DAB_FREQUENCY_KHZ . Чтобы обеспечить точные обновления списка программ, станции с одинаковыми DAB_SID_EXT обновляются вместе с использованием ITunerCallback#onProgramListUpdated . Это обновление затем передается на радиовещательную радиостанцию ​​и менеджер Radio, и, наконец, в Radio App через android.hardware.radio.ProgramList .

Метаданные

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

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

HD Radio Rupport

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

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

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

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

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

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

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

Статус сбора сигнала

В Android 15 и Highers Radio Apps могут показывать пользователям состояние получения сигнала радиостанций HD. Это полезно, потому что приобретение сильного сигнала HD иногда может занять несколько минут.

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

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

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

Метаданные

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

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

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

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

Предупреждать информацию Описание Enum значения доступны
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 , так что его можно отправить из радиовещания Radio HAL в Radio Apps через обратные вызовы Tuner для текущей информации о программе и обновлениях списка программ.