1699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent/*
2699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent * Copyright (C) 2015 The Android Open Source Project
3699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent *
4699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent * Licensed under the Apache License, Version 2.0 (the "License");
5699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent * you may not use this file except in compliance with the License.
6699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent * You may obtain a copy of the License at
7699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent *
8699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent *      http://www.apache.org/licenses/LICENSE-2.0
9699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent *
10699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent * Unless required by applicable law or agreed to in writing, software
11699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent * distributed under the License is distributed on an "AS IS" BASIS,
12699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent * See the License for the specific language governing permissions and
14699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent * limitations under the License.
15699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent */
16699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent
17699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent#ifndef ANDROID_RADIO_H
18699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent#define ANDROID_RADIO_H
19699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent
20699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent#include <stdbool.h>
21699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent#include <stdint.h>
22699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent#include <stdio.h>
23699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent#include <sys/cdefs.h>
24699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent#include <sys/types.h>
25699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent
26699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent
27699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent#define RADIO_NUM_BANDS_MAX     16
28699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent#define RADIO_NUM_SPACINGS_MAX  16
29699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent#define RADIO_STRING_LEN_MAX    128
30699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent
31699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent/*
32699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent * Radio hardware module class. A given radio hardware module HAL is of one class
33699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent * only. The platform can not have more than one hardware module of each class.
34699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent * Current version of the framework only supports RADIO_CLASS_AM_FM.
35699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent */
36699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurenttypedef enum {
37699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    RADIO_CLASS_AM_FM = 0,  /* FM (including HD radio) and AM */
38699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    RADIO_CLASS_SAT   = 1,  /* Satellite Radio */
39699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    RADIO_CLASS_DT    = 2,  /* Digital Radio (DAB) */
40699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent} radio_class_t;
41699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent
42699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent/* value for field "type" of radio band described in struct radio_hal_band_config */
43699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurenttypedef enum {
44699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    RADIO_BAND_AM     = 0,  /* Amplitude Modulation band: LW, MW, SW */
45699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    RADIO_BAND_FM     = 1,  /* Frequency Modulation band: FM */
46699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    RADIO_BAND_FM_HD  = 2,  /* FM HD Radio / DRM (IBOC) */
47699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    RADIO_BAND_AM_HD  = 3,  /* AM HD Radio / DRM (IBOC) */
48699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent} radio_band_t;
49699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent
50699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent/* RDS variant implemented. A struct radio_hal_fm_band_config can list none or several. */
51699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurentenum {
52699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    RADIO_RDS_NONE   = 0x0,
53699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    RADIO_RDS_WORLD  = 0x01,
54699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    RADIO_RDS_US     = 0x02,
55699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent};
56699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurenttypedef unsigned int radio_rds_t;
57699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent
58699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent/* FM deemphasis variant implemented. A struct radio_hal_fm_band_config can list one or more. */
59699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurentenum {
60699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    RADIO_DEEMPHASIS_50   = 0x1,
61699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    RADIO_DEEMPHASIS_75   = 0x2,
62699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent};
63699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurenttypedef unsigned int radio_deemphasis_t;
64699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent
65699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent/* Region a particular radio band configuration corresponds to. Not used at the HAL.
66699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent * Derived by the framework when converting the band descriptors retrieved from the HAL to
67699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent * individual band descriptors for each supported region. */
68699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurenttypedef enum {
69699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    RADIO_REGION_NONE  = -1,
70699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    RADIO_REGION_ITU_1 = 0,
71699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    RADIO_REGION_ITU_2 = 1,
72699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    RADIO_REGION_OIRT  = 2,
73699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    RADIO_REGION_JAPAN = 3,
74699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    RADIO_REGION_KOREA = 4,
75699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent} radio_region_t;
76699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent
77699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent/* scanning direction for scan() and step() tuner APIs */
78699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurenttypedef enum {
79699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    RADIO_DIRECTION_UP,
80699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    RADIO_DIRECTION_DOWN
81699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent} radio_direction_t;
82699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent
83699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent/* unique handle allocated to a radio module */
84699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurenttypedef unsigned int radio_handle_t;
85699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent
86699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent/* Opaque meta data structure used by radio meta data API (see system/radio_metadata.h) */
87699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurenttypedef struct radio_medtadata radio_metadata_t;
88699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent
89699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent
90699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent/* Additional attributes for an FM band configuration */
91699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurenttypedef struct radio_hal_fm_band_config {
92699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    radio_deemphasis_t  deemphasis; /* deemphasis variant */
93699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    bool                stereo;     /* stereo supported */
94699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    radio_rds_t         rds;        /* RDS variants supported */
95699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    bool                ta;         /* Traffic Announcement supported */
96699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    bool                af;         /* Alternate Frequency supported */
972ccc52c3bbb70eff1705e2a6a3410517f29809b3Sanket Agarwal    bool                ea;         /* Emergency announcements supported */
98699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent} radio_hal_fm_band_config_t;
99699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent
100699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent/* Additional attributes for an AM band configuration */
101699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurenttypedef struct radio_hal_am_band_config {
102699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    bool                stereo;     /* stereo supported */
103699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent} radio_hal_am_band_config_t;
104699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent
105699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent/* Radio band configuration. Describes a given band supported by the radio module.
106699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent * The HAL can expose only one band per type with the the maximum range supported and all options.
107699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent * THe framework will derive the actual regions were this module can operate and expose separate
108699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent * band configurations for applications to chose from. */
109699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurenttypedef struct radio_hal_band_config {
110699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    radio_band_t type;
111699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    bool         antenna_connected;
112699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    unsigned int lower_limit;
113699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    unsigned int upper_limit;
114699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    unsigned int num_spacings;
115699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    unsigned int spacings[RADIO_NUM_SPACINGS_MAX];
116699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    union {
117699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent        radio_hal_fm_band_config_t fm;
118699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent        radio_hal_am_band_config_t am;
119699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    };
120699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent} radio_hal_band_config_t;
121699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent
122699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent/* Used internally by the framework to represent a band for s specific region */
123699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurenttypedef struct radio_band_config {
124699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    radio_region_t  region;
125699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    radio_hal_band_config_t band;
126699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent} radio_band_config_t;
127699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent
128699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent
129699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent/* Exposes properties of a given hardware radio module.
130699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent * NOTE: current framework implementation supports only one audio source (num_audio_sources = 1).
131699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent * The source corresponds to AUDIO_DEVICE_IN_FM_TUNER.
132699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent * If more than one tuner is supported (num_tuners > 1), only one can be connected to the audio
133699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent * source. */
134699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurenttypedef struct radio_hal_properties {
135699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    radio_class_t   class_id;   /* Class of this module. E.g RADIO_CLASS_AM_FM */
136699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    char            implementor[RADIO_STRING_LEN_MAX];  /* implementor name */
137699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    char            product[RADIO_STRING_LEN_MAX];  /* product name */
138699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    char            version[RADIO_STRING_LEN_MAX];  /* product version */
139699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    char            serial[RADIO_STRING_LEN_MAX];  /* serial number (for subscription services) */
140699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    unsigned int    num_tuners;     /* number of tuners controllable independently */
141699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    unsigned int    num_audio_sources; /* number of audio sources driven simultaneously */
142699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    bool            supports_capture; /* the hardware supports capture of audio source audio HAL */
143699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    unsigned int    num_bands;      /* number of band descriptors */
144699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    radio_hal_band_config_t bands[RADIO_NUM_BANDS_MAX]; /* band descriptors */
145699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent} radio_hal_properties_t;
146699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent
147699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent/* Used internally by the framework. Same information as in struct radio_hal_properties plus a
148699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent * unique handle and one band configuration per region. */
149699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurenttypedef struct radio_properties {
150699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    radio_handle_t      handle;
151699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    radio_class_t       class_id;
152699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    char                implementor[RADIO_STRING_LEN_MAX];
153699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    char                product[RADIO_STRING_LEN_MAX];
154699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    char                version[RADIO_STRING_LEN_MAX];
155699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    char                serial[RADIO_STRING_LEN_MAX];
156699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    unsigned int        num_tuners;
157699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    unsigned int        num_audio_sources;
158699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    bool                supports_capture;
159699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    unsigned int        num_bands;
160699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    radio_band_config_t bands[RADIO_NUM_BANDS_MAX];
161699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent} radio_properties_t;
162699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent
163699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent/* Radio program information. Returned by the HAL with event RADIO_EVENT_TUNED.
164699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent * Contains information on currently tuned channel.
165699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent */
166699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurenttypedef struct radio_program_info {
167699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    unsigned int     channel;   /* current channel. (e.g kHz for band type RADIO_BAND_FM) */
168699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    unsigned int     sub_channel; /* current sub channel. (used for RADIO_BAND_FM_HD) */
169699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    bool             tuned;     /* tuned to a program or not */
170699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    bool             stereo;    /* program is stereo or not */
171699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    bool             digital;   /* digital program or not (e.g HD Radio program) */
172699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    unsigned int     signal_strength; /* signal strength from 0 to 100 */
173699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    radio_metadata_t *metadata; /* non null if meta data are present (e.g PTY, song title ...) */
174699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent} radio_program_info_t;
175699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent
176699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent
177699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent/* Events sent to the framework via the HAL callback. An event can notify the completion of an
178699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent * asynchronous command (configuration, tune, scan ...) or a spontaneous change (antenna connection,
179699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent * failure, AF switching, meta data reception... */
180699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurentenum {
181699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    RADIO_EVENT_HW_FAILURE  = 0,  /* hardware module failure. Requires reopening the tuner */
182699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    RADIO_EVENT_CONFIG      = 1,  /* configuration change completed */
183699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    RADIO_EVENT_ANTENNA     = 2,  /* Antenna connected, disconnected */
184699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    RADIO_EVENT_TUNED       = 3,  /* tune, step, scan completed */
185699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    RADIO_EVENT_METADATA    = 4,  /* New meta data received */
186699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    RADIO_EVENT_TA          = 5,  /* Traffic announcement start or stop */
187699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    RADIO_EVENT_AF_SWITCH   = 6,  /* Switch to Alternate Frequency */
1882ccc52c3bbb70eff1705e2a6a3410517f29809b3Sanket Agarwal    RADIO_EVENT_EA          = 7,  /* Emergency announcement start or stop */
189699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    // begin framework only events
190699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    RADIO_EVENT_CONTROL     = 100, /* loss/gain of tuner control */
191699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    RADIO_EVENT_SERVER_DIED = 101, /* radio service died */
192699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent};
193699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurenttypedef unsigned int radio_event_type_t;
194699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent
195699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent/* Event passed to the framework by the HAL callback */
196699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurenttypedef struct radio_hal_event {
197699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    radio_event_type_t  type;       /* event type */
198699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    int                 status;     /* used by RADIO_EVENT_CONFIG, RADIO_EVENT_TUNED */
199699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    union {
2002ccc52c3bbb70eff1705e2a6a3410517f29809b3Sanket Agarwal        /* RADIO_EVENT_ANTENNA, RADIO_EVENT_TA, RADIO_EVENT_EA */
2012ccc52c3bbb70eff1705e2a6a3410517f29809b3Sanket Agarwal        bool                    on;
202699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent        radio_hal_band_config_t config; /* RADIO_EVENT_CONFIG */
203699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent        radio_program_info_t    info;   /* RADIO_EVENT_TUNED, RADIO_EVENT_AF_SWITCH */
204699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent        radio_metadata_t        *metadata; /* RADIO_EVENT_METADATA */
205699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    };
206699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent} radio_hal_event_t;
207699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent
208699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent/* Used internally by the framework. Same information as in struct radio_hal_event */
209699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurenttypedef struct radio_event {
210699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    radio_event_type_t  type;
211699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    int                 status;
212699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    union {
213699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent        bool                    on;
214699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent        radio_band_config_t     config;
215699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent        radio_program_info_t    info;
216699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent        radio_metadata_t        *metadata; /* offset from start of struct when in shared memory */
217699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    };
218699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent} radio_event_t;
219699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent
220699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent
221699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurentstatic radio_rds_t radio_rds_for_region(bool rds, radio_region_t region) {
222699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    if (!rds)
223699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent        return RADIO_RDS_NONE;
224699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    switch(region) {
225699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent        case RADIO_REGION_ITU_1:
226699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent        case RADIO_REGION_OIRT:
227699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent        case RADIO_REGION_JAPAN:
228699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent        case RADIO_REGION_KOREA:
229699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent            return RADIO_RDS_WORLD;
230699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent        case RADIO_REGION_ITU_2:
231699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent            return RADIO_RDS_US;
232699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent        default:
233699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent            return RADIO_REGION_NONE;
234699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    }
235699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent}
236699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent
237699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurentstatic radio_deemphasis_t radio_demephasis_for_region(radio_region_t region) {
238699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    switch(region) {
239699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent        case RADIO_REGION_KOREA:
240699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent        case RADIO_REGION_ITU_2:
241699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent            return RADIO_DEEMPHASIS_75;
242699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent        case RADIO_REGION_ITU_1:
243699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent        case RADIO_REGION_OIRT:
244699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent        case RADIO_REGION_JAPAN:
245699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent        default:
246699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent            return RADIO_DEEMPHASIS_50;
247699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent    }
248699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent}
249699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent
250699ce298caf981e9c01a8ebb891003fdcfe2c58fEric Laurent#endif  // ANDROID_RADIO_H
251