4 * Copyright (c) 2000 - 2016 Samsung Electronics Co., Ltd. All rights reserved.
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
20 #ifndef __MM_Radio_INTERNAL_H__
21 #define __MM_Radio_INTERNAL_H__
23 /*===========================================================================================
25 ========================================================================================== */
34 #include <mm_message.h>
35 #include <media/mm_resource_manager.h>
38 #include "mm_radio_utils.h"
39 #include <linux/videodev2.h>
42 #include <gst/gstbuffer.h>
50 /*===========================================================================================
51 GLOBAL DEFINITIONS AND DECLARATIONS FOR MODULE
52 ========================================================================================== */
54 /*---------------------------------------------------------------------------
56 ---------------------------------------------------------------------------*/
57 #define SAMPLEDELAY 15000
59 /* si470x dependent define */
60 #define SYSCONFIG1 4 /* System Configuration 1 */
61 #define SYSCONFIG1_RDS 0x1000 /* bits 12..12: RDS Enable */
62 #define SYSCONFIG1_RDS_OFFSET 12 /* bits 12..12: RDS Enable Offset */
64 #define SYSCONFIG2 5 /* System Configuration 2 */
65 #define SYSCONFIG2_SEEKTH 0xff00 /* bits 15..08: RSSI Seek Threshold */
66 #define SYSCONFIG2_SEEKTH_OFFSET 8 /* bits 15..08: RSSI Seek Threshold Offset */
68 #define SYSCONFIG3 6 /* System Configuration 3 */
69 #define SYSCONFIG3_SKSNR 0x00f0 /* bits 07..04: Seek SNR Threshold */
70 #define SYSCONFIG3_SKCNT 0x000f /* bits 03..00: Seek FM Impulse Detection Threshold */
71 #define SYSCONFIG3_SKSNR_OFFSET 4 /* bits 07..04: Seek SNR Threshold Offset */
72 #define SYSCONFIG3_SKCNT_OFFSET 0 /* bits 03..00: Seek FM Impulse Detection Threshold Offset */
74 #define DEFAULT_CHIP_MODEL "radio-si470x"
76 /*---------------------------------------------------------------------------
77 GLOBAL CONSTANT DEFINITIONS:
78 ---------------------------------------------------------------------------*/
80 MMRADIO_COMMAND_CREATE = 0,
81 MMRADIO_COMMAND_DESTROY,
82 MMRADIO_COMMAND_REALIZE,
83 MMRADIO_COMMAND_UNREALIZE,
84 MMRADIO_COMMAND_START,
86 MMRADIO_COMMAND_START_SCAN,
87 MMRADIO_COMMAND_STOP_SCAN,
88 MMRADIO_COMMAND_SET_FREQ,
89 MMRADIO_COMMAND_GET_FREQ,
91 MMRADIO_COMMAND_UNMUTE,
93 MMRADIO_COMMAND_SET_REGION,
94 MMRADIO_COMMAND_GET_REGION,
95 MMRADIO_COMMAND_SET_VOLUME,
96 MMRADIO_COMMAND_GET_VOLUME,
100 /* max and mix frequency types, KHz */
102 MM_RADIO_FREQ_NONE = 0,
104 MM_RADIO_FREQ_MIN_76100_KHZ = 76100,
105 MM_RADIO_FREQ_MIN_87500_KHZ = 87500,
106 MM_RADIO_FREQ_MIN_88100_KHZ = 88100,
108 MM_RADIO_FREQ_MAX_89900_KHZ = 89900,
109 MM_RADIO_FREQ_MAX_108000_KHZ = 108000,
112 /* de-emphasis types */
114 MM_RADIO_DEEMPHASIS_NONE = 0,
115 MM_RADIO_DEEMPHASIS_50_US,
116 MM_RADIO_DEEMPHASIS_75_US,
119 /* radio region settings */
121 MMRadioRegionType country;
122 MMRadioDeemphasis deemphasis; // unit : us
123 MMRadioFreqTypes band_min; // <- freq. range, unit : KHz
124 MMRadioFreqTypes band_max; // ->
125 int channel_spacing; // TBD
130 pthread_mutex_t mutex;
139 MM_RADIO_MSG_DESTROY = 0,
140 MM_RADIO_MSG_SCAN_INFO,
141 MM_RADIO_MSG_SCAN_STOPPED,
142 MM_RADIO_MSG_SCAN_FINISHED,
143 MM_RADIO_MSG_SEEK_FINISHED,
144 MM_RADIO_MSG_STATE_INTERRUPTED,
150 MMRadioMsgTypes msg_type;
154 /*---------------------------------------------------------------------------
155 GLOBAL DATA TYPE DEFINITIONS:
156 ---------------------------------------------------------------------------*/
157 #define USE_GST_PIPELINE
159 #ifdef USE_GST_PIPELINE
160 typedef struct _mm_radio_gstreamer_s {
162 GstElement *pipeline;
163 GstElement *audiosrc;
166 GstElement *audiosink;
167 GstBuffer *output_buffer;
168 } mm_radio_gstreamer_s;
180 pthread_mutex_t cmd_lock;
182 /* radio attributes */
185 /* message callback */
186 GAsyncQueue *msg_queue;
188 MMMessageCallback msg_cb;
191 /* radio device fd */
195 struct v4l2_capability vc;
196 struct v4l2_tuner vt;
197 struct v4l2_control vctrl;
198 struct v4l2_frequency vf;
201 struct v4l2_dbg_register reg;
204 MMRadioThread_t scan;
207 MMRadioThread_t seek;
209 MMRadioSeekDirectionType seek_direction;
212 #ifdef USE_GST_PIPELINE
213 mm_radio_gstreamer_s* pGstreamer_s;
215 mm_resource_manager_h resource_manager;
216 mm_resource_manager_res_h radio_resource;
217 int interrupted_by_resource_conflict;
219 unsigned int subs_id;
222 /* region settings */
223 MMRadioRegion_t region_setting;
226 /*===========================================================================================
227 GLOBAL FUNCTION PROTOTYPES
228 ========================================================================================== */
229 int _mmradio_create_radio(mm_radio_t *radio);
230 int _mmradio_destroy(mm_radio_t *radio);
231 int _mmradio_realize(mm_radio_t *radio);
232 int _mmradio_unrealize(mm_radio_t *radio);
233 int _mmradio_set_message_callback(mm_radio_t *radio, MMMessageCallback callback, void *user_param);
234 int _mmradio_get_state(mm_radio_t *radio, int *pState);
235 int _mmradio_set_frequency(mm_radio_t *radio, int freq);
236 int _mmradio_get_frequency(mm_radio_t *radio, int *pFreq);
237 int _mmradio_mute(mm_radio_t *radio);
238 int _mmradio_unmute(mm_radio_t *radio);
239 int _mmradio_start(mm_radio_t *radio);
240 int _mmradio_stop(mm_radio_t *radio);
241 int _mmradio_seek(mm_radio_t *radio, MMRadioSeekDirectionType direction);
242 int _mmradio_start_scan(mm_radio_t *radio);
243 int _mmradio_stop_scan(mm_radio_t *radio);
244 int _mm_radio_get_signal_strength(mm_radio_t *radio, int *strength);
245 #ifdef USE_GST_PIPELINE
246 int _mmradio_realize_pipeline(mm_radio_t *radio);
247 int _mmradio_start_pipeline(mm_radio_t *radio);
248 int _mmradio_stop_pipeline(mm_radio_t *radio);
249 int _mmradio_destroy_pipeline(mm_radio_t *radio);
251 int _mmradio_apply_region(mm_radio_t *radio, MMRadioRegionType region, bool update);
252 int _mmradio_get_region_type(mm_radio_t *radio, MMRadioRegionType *type);
253 int _mmradio_get_region_frequency_range(mm_radio_t *radio, unsigned int *min_freq, unsigned int *max_freq);
254 int _mmradio_get_channel_spacing(mm_radio_t *radio, unsigned int *ch_spacing);
255 int _mmradio_set_volume(mm_radio_t *radio, float volume);
256 int _mmradio_get_volume(mm_radio_t *radio, float *pVolume);
262 #endif /* __MM_Radio_INTERNAL_H__ */