Вещание радио 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.