blob: 8b8fc6fddee25874ff0a42869e4b557fb2fcb0e3 [file] [log] [blame]
/**
* Copyright 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@1.1;
import @1.0::types;
typedef @1.0::Result Result;
enum ProgramListResult : Result {
NOT_READY,
NOT_STARTED,
UNAVAILABLE,
};
/**
* Extra flags for program information.
*/
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,
};
/**
* 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 be prefixed 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;
};
struct Properties {
@1.0::Properties base;
/**
* The hardware supports background scanning in general. At the given time
* it may not be available though, see startBackgroundScan.
*/
bool supportsBackgroundScanning;
/**
* A list of supported ProgramType values.
*
* If a program type is supported by radio module, it means it can tune
* to ProgramSelector of a given type.
*
* Support for VENDOR program type does not guarantee compatibility, as
* other module properties (implementor, product, version) must be checked.
*/
vec<uint32_t> supportedProgramTypes;
/**
* 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<uint32_t> 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<VendorKeyValue> vendorInfo;
};
/**
* Type of modulation.
*
* Used as a value for DRMO_MODULATION IdentifierType.
*/
enum Modulation : uint32_t {
AM = 1,
FM,
};
/**
* Type of a radio technology.
*
* VENDOR program types must be opaque to the framework.
*
* There are multiple VENDOR program types just to make vendor implementation
* easier with multiple properitary radio technologies. They are treated the
* same by the framework.
*
* All other values are reserved for future use.
* Values not matching any enumerated constant must be ignored.
*/
enum ProgramType : uint32_t {
AM = 1, // analogue AM radio (with or without RDS)
FM, // analogue FM radio (with or without RDS)
AM_HD, // AM HD Radio
FM_HD, // FM HD Radio
DAB, // Digital audio broadcasting
DRMO, // Digital Radio Mondiale
SXM, // SiriusXM Satellite Radio
// Vendor-specific, not synced across devices.
VENDOR_START = 1000,
VENDOR_END = 1999,
};
/**
* Type of program identifier component.
*
* It MUST match the radio technology for primary ID but does not have to match
* it for secondary IDs. For example, a satellite program may set AM/FM fallback
* frequency, if a station broadcasts both via satellite and AM/FM.
*
* VENDOR identifier types must be opaque to the framework.
*
* The value format for each (but VENDOR_PRIMARY) 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 {
AMFM_FREQUENCY = 1, // kHz
RDS_PI, // 16bit
/**
* 64bit compound primary identifier for HD Radio.
*
* Consists of (from the LSB):
* - 32bit: Station ID number;
* - 4bit: HD_SUBCHANNEL;
* - 18bit: AMFM_FREQUENCY.
* The remaining bits should be set to zeros when writing on the chip side
* and ignored when read.
*/
HD_STATION_ID_EXT,
/**
* HD Radio subchannel - a value of range 0-7.
*
* The subchannel index is 0-based (where 0 is MPS and 1..7 are SPS),
* as opposed to HD Radio standard (where it's 1-based).
*/
HD_SUBCHANNEL,
/**
* 24bit compound primary identifier for DAB.
*
* Consists of (from the LSB):
* - 16bit: SId;
* - 8bit: ECC code.
* The remaining bits should be set to zeros when writing on the chip side
* and ignored when read.
*/
DAB_SIDECC,
DAB_ENSEMBLE, // 16bit
DAB_SCID, // 12bit
DAB_FREQUENCY, // kHz
DRMO_SERVICE_ID, // 24bit
DRMO_FREQUENCY, // kHz
DRMO_MODULATION, // Modulation enum
SXM_SERVICE_ID, // 32bit
SXM_CHANNEL, // 0-999 range
/**
* Primary identifier for vendor-specific radio technology.
* The value format is determined by a vendor.
*
* It must not be used in any other programType than corresponding VENDOR
* type between VENDOR_START and VENDOR_END (eg. identifier type 1015 must
* not be used in any program type other than 1015).
*/
VENDOR_PRIMARY_START = ProgramType:VENDOR_START,
VENDOR_PRIMARY_END = ProgramType:VENDOR_END,
};
/**
* A single program identifier component, eg. frequency or channel ID.
*
* The uint32_t type field maps to IdentifierType enum. It's not straight,
* because 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.
*
* The uint64_t value field holds the value in format described in comments for
* IdentifierType enum.
*/
struct ProgramIdentifier {
uint32_t type; // IdentifierType
uint64_t value;
};
/**
* A set of identifiers necessary to tune to a given station.
*
* This can hold various identifiers, like
* - AM/FM frequency
* - HD Radio subchannel
* - DAB channel info
*
* The uint32_t programType field maps to ProgramType enum. It's not straight,
* because 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.
*
* The primary ID uniquely identifies a station and can be used for equality
* check. The secondary IDs are supplementary and can speed up tuning process,
* but the primary ID is sufficient (ie. 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).
*
* The primaryId of a given programType MUST be of a specific type:
* - AM, FM: RDS_PI if the station broadcasts RDS, AMFM_FREQUENCY otherwise;
* - AM_HD, FM_HD: HD_STATION_ID_EXT;
* - DAB: DAB_SIDECC;
* - DRMO: DRMO_SERVICE_ID;
* - SXM: SXM_SERVICE_ID;
* - VENDOR: VENDOR_PRIMARY.
*/
struct ProgramSelector {
uint32_t programType; // ProgramType
ProgramIdentifier primaryId; // uniquely identifies a station
vec<ProgramIdentifier> secondaryIds;
/**
* Opaque vendor-specific identifiers, to be passed to front-end
* without changes.
*
* The order is meaningful, ie. the first element may be defined as
* frequency, second as the subchannel etc.
*
* The vector is not serialized (either locally or to the cloud),
* unless it's a VENDOR program type.
*/
vec<uint64_t> vendorIds;
};
/**
* Radio program information. Returned by the HAL with event RADIO_EVENT_TUNED.
* Contains information on currently tuned channel.
*/
struct ProgramInfo {
@1.0::ProgramInfo base;
ProgramSelector selector;
bitfield<ProgramInfoFlags> flags;
/**
* Vendor-specific information.
*
* It may be used for extra features, not supported by the platform,
* for example: paid-service=true; bitrate=320kbps.
*/
vec<VendorKeyValue> vendorInfo;
};