/* Copyright (C) 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.hardware.broadcastradio@2.0; /** Constants used by broadcast radio HAL. */ enum Constants : int32_t { /** Invalid identifier for IBroadcastRadio::getImage. */ INVALID_IMAGE = 0, /** * If the antenna is disconnected from the beginning, the * onAntennaStateChange callback must be called within this time. */ ANTENNA_DISCONNECTED_TIMEOUT_MS = 100, LIST_COMPLETE_TIMEOUT_MS = 300000, }; enum Result : int32_t { OK, UNKNOWN_ERROR, INTERNAL_ERROR, INVALID_ARGUMENTS, INVALID_STATE, NOT_SUPPORTED, TIMEOUT, }; /** * Configuration flags to be used with isConfigFlagSet and setConfigFlag methods * of ITunerSession. */ enum ConfigFlag : uint32_t { /** * Forces mono audio stream reception. * * Analog broadcasts can recover poor reception conditions by jointing * stereo channels into one. Mainly for, but not limited to AM/FM. */ FORCE_MONO = 1, /** * Forces the analog playback for the supporting radio technology. * * User may disable digital playback for FM HD Radio or hybrid FM/DAB with * this option. This is purely user choice, ie. does not reflect digital- * analog handover state managed from the HAL implementation side. * * Some radio technologies may not support this, ie. DAB. */ FORCE_ANALOG, /** * Forces the digital playback for the supporting radio technology. * * User may disable digital-analog handover that happens with poor * reception conditions. With digital forced, the radio will remain silent * instead of switching to analog channel if it's available. This is purely * user choice, it does not reflect the actual state of handover. */ FORCE_DIGITAL, /** * RDS Alternative Frequencies. * * If set and the currently tuned RDS station broadcasts on multiple * channels, radio tuner automatically switches to the best available * alternative. */ RDS_AF, /** * RDS region-specific program lock-down. * * Allows user to lock to the current region as they move into the * other region. */ RDS_REG, /** Enables DAB-DAB hard- and implicit-linking (the same content). */ DAB_DAB_LINKING, /** Enables DAB-FM hard- and implicit-linking (the same content). */ DAB_FM_LINKING, /** Enables DAB-DAB soft-linking (related content). */ DAB_DAB_SOFT_LINKING, /** Enables DAB-FM soft-linking (related content). */ DAB_FM_SOFT_LINKING, }; /** * A key-value pair for vendor-specific information to be passed as-is through * Android framework to the front-end application. */ struct VendorKeyValue { /** * Key must start with unique vendor Java-style namespace, * eg. 'com.somecompany.parameter1'. */ string key; /** * Value must be passed through the framework without any changes. * Format of this string can vary across vendors. */ string value; }; /** * A supported or configured RDS variant. * * Both might be set for hardware capabilities check (with full=true when * calling getAmFmRegionConfig), but only one (or none) for specific * region settings. */ enum Rds : uint8_t { /** Standard variant, used everywhere except North America. */ RDS = 1 << 0, /** Variant used in North America. */ RBDS = 1 << 1, }; /** * FM de-emphasis filter supported or configured. * * Both might be set for hardware capabilities check (with full=true when * calling getAmFmRegionConfig), but exactly one for specific region settings. */ enum Deemphasis : uint8_t { D50 = 1 << 0, D75 = 1 << 1, }; /** * Regional configuration for AM/FM. * * For hardware capabilities check (with full=true when calling * getAmFmRegionConfig), HAL implementation fills entire supported range of * frequencies and features. * * When checking current configuration, at most one bit in each bitfield * can be set. */ struct AmFmRegionConfig { /** * All supported or configured AM/FM bands. * * AM/FM bands are identified by frequency value * (see IdentifierType::AMFM_FREQUENCY). * * With typical configuration, it's expected to have two frequency ranges * for capabilities check (AM and FM) and four ranges for specific region * configuration (AM LW, AM MW, AM SW, FM). */ vec ranges; /** De-emphasis filter supported/configured. */ bitfield fmDeemphasis; /** RDS/RBDS variant supported/configured. */ bitfield fmRds; }; /** * AM/FM band range for region configuration. * * Defines channel grid: each possible channel is set at * lowerBound + channelNumber * spacing, up to upperBound. */ struct AmFmBandRange { /** The frequency (in kHz) of the first channel within the range. */ uint32_t lowerBound; /** The frequency (in kHz) of the last channel within the range. */ uint32_t upperBound; /** Channel grid resolution (in kHz), how far apart are the channels. */ uint32_t spacing; /** * Channel spacing (in kHz) used to speed up seeking to the next station * via the ITunerSession::scan() operation. * * It must be a multiple of channel grid resolution. * * Tuner may first quickly check every n-th channel and if it detects echo * from a station, it fine-tunes to find the exact frequency. * * It's ignored for capabilities check (with full=true when calling * getAmFmRegionConfig). */ uint32_t scanSpacing; }; /** * An entry in regional configuration for DAB. * * Defines a frequency table row for ensembles. */ struct DabTableEntry { /** * Channel name, i.e. 5A, 7B. * * It must match the following regular expression: * /^[A-Z0-9][A-Z0-9 ]{0,5}[A-Z0-9]$/ (2-7 uppercase alphanumeric characters * without spaces allowed at the beginning nor end). */ string label; /** Frequency, in kHz. */ uint32_t frequency; }; /** * Properties of a given broadcast radio module. */ struct Properties { /** * A company name who made the radio module. Must be a valid, registered * name of the company itself. * * It must be opaque to the Android framework. */ string maker; /** * A product name. Must be unique within the company. * * It must be opaque to the Android framework. */ string product; /** * Version of the hardware module. * * It must be opaque to the Android framework. */ string version; /** * Hardware serial number (for subscription services). * * It must be opaque to the Android framework. */ string serial; /** * A list of supported IdentifierType values. * * If an identifier is supported by radio module, it means it can use it for * tuning to ProgramSelector with either primary or secondary Identifier of * a given type. * * Support for VENDOR identifier type does not guarantee compatibility, as * other module properties (implementor, product, version) must be checked. */ vec supportedIdentifierTypes; /** * Vendor-specific information. * * It may be used for extra features, not supported by the platform, * for example: com.me.preset-slots=6; com.me.ultra-hd-capable=false. */ vec vendorInfo; }; /** * Program (channel, station) information. * * Carries both user-visible information (like station name) and technical * details (tuning selector). */ struct ProgramInfo { /** * An identifier used to point at the program (primarily to tune to it). * * This field is required - its type field must not be set to * IdentifierType::INVALID. */ ProgramSelector selector; /** * Identifier currently used for program selection. * * It allows to determine which technology is currently used for reception. * * Some program selectors contain tuning information for different radio * technologies (i.e. FM RDS and DAB). For example, user may tune using * a ProgramSelector with RDS_PI primary identifier, but the tuner hardware * may choose to use DAB technology to make actual tuning. This identifier * must reflect that. * * This field is required for currently tuned program only. * For all other items on the program list, its type field must be * initialized to IdentifierType::INVALID. * * Only primary identifiers for a given radio technology are valid: * - AMFM_FREQUENCY for analog AM/FM; * - RDS_PI for FM RDS; * - HD_STATION_ID_EXT; * - DAB_SID_EXT; * - DRMO_SERVICE_ID; * - SXM_SERVICE_ID; * - VENDOR_*; * - more might come in next minor versions of this HAL. */ ProgramIdentifier logicallyTunedTo; /** * Identifier currently used by hardware to physically tune to a channel. * * Some radio technologies broadcast the same program on multiple channels, * i.e. with RDS AF the same program may be broadcasted on multiple * alternative frequencies; the same DAB program may be broadcast on * multiple ensembles. This identifier points to the channel to which the * radio hardware is physically tuned to. * * This field is required for currently tuned program only. * For all other items on the program list, its type field must be * initialized to IdentifierType::INVALID. * * Only physical identifiers are valid: * - AMFM_FREQUENCY; * - DAB_ENSEMBLE; * - DRMO_FREQUENCY; * - SXM_CHANNEL; * - VENDOR_*; * - more might come in next minor versions of this HAL. */ ProgramIdentifier physicallyTunedTo; /** * Primary identifiers of related contents. * * Some radio technologies provide pointers to other programs that carry * related content (i.e. DAB soft-links). This field is a list of pointers * to other programs on the program list. * * This is not a list of programs that carry the same content (i.e. * DAB hard-links, RDS AF). Switching to programs from this list usually * require user action. * * Please note, that these identifiers do not have to exist on the program * list - i.e. DAB tuner may provide information on FM RDS alternatives * despite not supporting FM RDS. If the system has multiple tuners, another * one may have it on its list. * * This field is optional (can be empty). */ vec relatedContent; bitfield infoFlags; /** * Signal quality measured in 0% to 100% range to be shown in the UI. * * The purpose of this field is primarily informative, must not be used to * determine to which frequency should it tune to. */ uint32_t signalQuality; /** * Program metadata (station name, PTY, song title). */ vec metadata; /** * Vendor-specific information. * * It may be used for extra features, not supported by the platform, * for example: paid-service=true; bitrate=320kbps. */ vec vendorInfo; }; enum ProgramInfoFlags : uint32_t { /** * Set when the program is currently playing live stream. * This may result in a slightly altered reception parameters, * usually targetted at reduced latency. */ LIVE = 1 << 0, /** * Radio stream is not playing, ie. due to bad reception conditions or * buffering. In this state volume knob MAY be disabled to prevent user * increasing volume too much. */ MUTED = 1 << 1, /** * Station broadcasts traffic information regularly, * but not necessarily right now. */ TRAFFIC_PROGRAM = 1 << 2, /** * Station is broadcasting traffic information at the very moment. */ TRAFFIC_ANNOUNCEMENT = 1 << 3, /** * Tuned to a program (not playing static). * * It's the same condition that would stop a seek operation * (ie: ITunerSession::scan()). * * By definition, this flag must be set for all items on the program list. */ TUNED = 1 << 4, /** * Audio stream is MONO if this bit is not set. */ STEREO = 1 << 5, }; /** * Type of program identifier component. * * Each identifier type corresponds to exactly one radio technology, * i.e. DAB_ENSEMBLE is specifically for DAB. * * VENDOR identifier types must be opaque to the framework. * * The value format for each (but VENDOR_*) identifier is strictly defined * to maintain interoperability between devices made by different vendors. * * All other values are reserved for future use. * Values not matching any enumerated constant must be ignored. */ enum IdentifierType : uint32_t { /** * Primary/secondary identifier for vendor-specific radio technology. * The value format is determined by a vendor. * * The vendor identifiers have limited serialization capabilities - see * ProgramSelector description. */ VENDOR_START = 1000, /** See VENDOR_START */ VENDOR_END = 1999, INVALID = 0, /** * Primary identifier for analogue (without RDS) AM/FM stations: * frequency in kHz. * * This identifier also contains band information: * - <500kHz: AM LW; * - 500kHz - 1705kHz: AM MW; * - 1.71MHz - 30MHz: AM SW; * - >60MHz: FM. */ AMFM_FREQUENCY, /** * 16bit primary identifier for FM RDS station. */ RDS_PI, /** * 64bit compound primary identifier for HD Radio. * * Consists of (from the LSB): * - 32bit: Station ID number; * - 4bit: HD Radio subchannel; * - 18bit: AMFM_FREQUENCY. * * While station ID number should be unique globally, it sometimes get * abused by broadcasters (i.e. not being set at all). To ensure local * uniqueness, AMFM_FREQUENCY was added here. Global uniqueness is * a best-effort - see HD_STATION_NAME. * * HD Radio subchannel is a value in range 0-7. * This index is 0-based (where 0 is MPS and 1..7 are SPS), * as opposed to HD Radio standard (where it's 1-based). * * The remaining bits should be set to zeros when writing on the chip side * and ignored when read. */ HD_STATION_ID_EXT, /** * 64bit additional identifier for HD Radio. * * Due to Station ID abuse, some HD_STATION_ID_EXT identifiers may be not * globally unique. To provide a best-effort solution, a short version of * station name may be carried as additional identifier and may be used * by the tuner hardware to double-check tuning. * * The name is limited to the first 8 A-Z0-9 characters (lowercase letters * must be converted to uppercase). Encoded in little-endian ASCII: * the first character of the name is the LSB. * * For example: "Abc" is encoded as 0x434241. */ HD_STATION_NAME, /** * 28bit compound primary identifier for Digital Audio Broadcasting. * * Consists of (from the LSB): * - 16bit: SId; * - 8bit: ECC code; * - 4bit: SCIdS. * * SCIdS (Service Component Identifier within the Service) value * of 0 represents the main service, while 1 and above represents * secondary services. * * The remaining bits should be set to zeros when writing on the chip side * and ignored when read. */ DAB_SID_EXT, /** 16bit */ DAB_ENSEMBLE, /** 12bit */ DAB_SCID, /** kHz (see AMFM_FREQUENCY) */ DAB_FREQUENCY, /** * 24bit primary identifier for Digital Radio Mondiale. */ DRMO_SERVICE_ID, /** kHz (see AMFM_FREQUENCY) */ DRMO_FREQUENCY, /** * 32bit primary identifier for SiriusXM Satellite Radio. */ SXM_SERVICE_ID = DRMO_FREQUENCY + 2, /** 0-999 range */ SXM_CHANNEL, }; /** * A single program identifier component, i.e. frequency or channel ID. */ struct ProgramIdentifier { /** * Maps to IdentifierType enum. The enum may be extended in future versions * of the HAL. Values out of the enum range must not be used when writing * and ignored when reading. */ uint32_t type; /** * The uint64_t value field holds the value in format described in comments * for IdentifierType enum. */ uint64_t value; }; /** * A set of identifiers necessary to tune to a given station. * * This can hold a combination of various identifiers, like: * - AM/FM frequency, * - HD Radio subchannel, * - DAB service ID. * * The type of radio technology is determined by the primary identifier - if the * primary identifier is for DAB, the program is DAB. However, a program of a * specific radio technology may have additional secondary identifiers for other * technologies, i.e. a satellite program may have FM fallback frequency, * if a station broadcasts both via satellite and FM. * * The identifiers from VENDOR_START..VENDOR_END range have limited * serialization capabilities: they are serialized locally, but ignored by the * cloud services. If a program has primary id from vendor range, it's not * synchronized with other devices at all. */ struct ProgramSelector { /** * Primary program identifier. * * This identifier uniquely identifies a station and can be used for * equality check. * * It can hold only a subset of identifier types, one per each * radio technology: * - analogue AM/FM: AMFM_FREQUENCY; * - FM RDS: RDS_PI; * - HD Radio: HD_STATION_ID_EXT; * - DAB: DAB_SID_EXT; * - Digital Radio Mondiale: DRMO_SERVICE_ID; * - SiriusXM: SXM_SERVICE_ID; * - vendor-specific: VENDOR_START..VENDOR_END. * * The list may change in future versions, so the implementation must obey, * but not rely on it. */ ProgramIdentifier primaryId; /** * Secondary program identifiers. * * These identifiers are supplementary and can speed up tuning process, * but the primary ID must be sufficient (i.e. RDS PI is enough to select * a station from the list after a full band scan). * * Two selectors with different secondary IDs, but the same primary ID are * considered equal. In particular, secondary IDs vector may get updated for * an entry on the program list (ie. when a better frequency for a given * station is found). */ vec secondaryIds; }; enum MetadataKey : int32_t { /** RDS PS (string) */ RDS_PS = 1, /** RDS PTY (uint8_t) */ RDS_PTY, /** RBDS PTY (uint8_t) */ RBDS_PTY, /** RDS RT (string) */ RDS_RT, /** Song title (string) */ SONG_TITLE, /** Artist name (string) */ SONG_ARTIST, /** Album name (string) */ SONG_ALBUM, /** Station icon (uint32_t, see IBroadcastRadio::getImage) */ STATION_ICON, /** Album art (uint32_t, see IBroadcastRadio::getImage) */ ALBUM_ART, /** * Station name. * * This is a generic field to cover any radio technology. * * If the PROGRAM_NAME has the same content as DAB_*_NAME or RDS_PS, * it may not be present, to preserve space - framework must repopulate * it on the client side. */ PROGRAM_NAME, /** DAB ensemble name (string) */ DAB_ENSEMBLE_NAME, /** * DAB ensemble name abbreviated (string). * * The string must be up to 8 characters long. * * If the short variant is present, the long (DAB_ENSEMBLE_NAME) one must be * present as well. */ DAB_ENSEMBLE_NAME_SHORT, /** DAB service name (string) */ DAB_SERVICE_NAME, /** DAB service name abbreviated (see DAB_ENSEMBLE_NAME_SHORT) (string) */ DAB_SERVICE_NAME_SHORT, /** DAB component name (string) */ DAB_COMPONENT_NAME, /** DAB component name abbreviated (see DAB_ENSEMBLE_NAME_SHORT) (string) */ DAB_COMPONENT_NAME_SHORT, }; /** * An element of metadata vector. * * Contains one of the entries explained in MetadataKey. * * Depending on a type described in the comment for a specific key, either the * intValue or stringValue field must be populated. */ struct Metadata { /** * Maps to MetadataKey enum. The enum may be extended in future versions * of the HAL. Values out of the enum range must not be used when writing * and ignored when reading. */ uint32_t key; int64_t intValue; string stringValue; }; /** * An update packet of the program list. * * The order of entries in the vectors is unspecified. */ struct ProgramListChunk { /** * Treats all previously added entries as removed. * * This is meant to save binder transaction bandwidth on 'removed' vector * and provide a clear empty state. * * If set, 'removed' vector must be empty. * * The client may wait with taking action on this until it received the * chunk with complete flag set (to avoid part of stations temporarily * disappearing from the list). */ bool purge; /** * If false, it means there are still programs not transmitted, * due for transmission in following updates. * * Used by UIs that wait for complete list instead of displaying * programs while scanning. * * After the whole channel range was scanned and all discovered programs * were transmitted, the last chunk must have set this flag to true. * This must happen within Constants::LIST_COMPLETE_TIMEOUT_MS from the * startProgramListUpdates call. If it doesn't, client may assume the tuner * came into a bad state and display error message. */ bool complete; /** * Added or modified program list entries. * * Two entries with the same primaryId (ProgramSelector member) * are considered the same. */ vec modified; /** * Removed program list entries. * * Contains primaryId (ProgramSelector member) of a program to remove. */ vec removed; }; /** * Large-grain filter to the program list. * * This is meant to reduce binder transaction bandwidth, not for fine-grained * filtering user might expect. * * The filter is designed as conjunctive normal form: the entry that passes the * filter must satisfy all the clauses (members of this struct). Vector clauses * are disjunctions of literals. In other words, there is AND between each * high-level group and OR inside it. */ struct ProgramFilter { /** * List of identifier types that satisfy the filter. * * If the program list entry contains at least one identifier of the type * listed, it satisfies this condition. * * Empty list means no filtering on identifier type. */ vec identifierTypes; /** * List of identifiers that satisfy the filter. * * If the program list entry contains at least one listed identifier, * it satisfies this condition. * * Empty list means no filtering on identifier. */ vec identifiers; /** * Includes non-tunable entries that define tree structure on the * program list (i.e. DAB ensembles). */ bool includeCategories; /** * Disable updates on entry modifications. * * If true, 'modified' vector of ProgramListChunk must contain list * additions only. Once the program is added to the list, it's not * updated anymore. */ bool excludeModifications; }; /** * Type of an announcement. * * It maps to different announcement types per each radio technology. */ enum AnnouncementType : uint8_t { /** DAB alarm, RDS emergency program type (PTY 31). */ EMERGENCY = 1, /** DAB warning. */ WARNING, /** DAB road traffic, RDS TA, HD Radio transportation. */ TRAFFIC, /** Weather. */ WEATHER, /** News. */ NEWS, /** DAB event, special event. */ EVENT, /** DAB sport report, RDS sports. */ SPORT, /** All others. */ MISC, }; /** * A pointer to a station broadcasting active announcement. */ struct Announcement { /** * Program selector to tune to the announcement. */ ProgramSelector selector; /** Announcement type. */ AnnouncementType type; /** * Vendor-specific information. * * It may be used for extra features, not supported by the platform, * for example: com.me.hdradio.urgency=100; com.me.hdradio.certainity=50. */ vec vendorInfo; };