В следующих разделах описывается, как работать с уровнем аппаратной абстракции (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) | |
Описание:
| ||
ХИДЛ 2.0 | openSession(ITunerCallback callback) генерирует (Result result, ITunerSession session) | |
АИДЛ | void setTunerCallback(in ITunerCallback callback) | |
Описание:
| ||
ХИДЛ 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
. Добавлена новая константа intTUNER_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
, поскольку в AIDLscan
переименован в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. |