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 /*===========================================================================================
24 ========================================================================================== */
29 #include <mm_message.h>
31 #ifdef TIZEN_FEATURE_RADIO_HAL
32 #include "mm_radio_priv_hal.h"
34 #include "mm_radio_priv_emul.h"
36 #include "mm_radio_utils.h"
38 /*===========================================================================================
40 | LOCAL DEFINITIONS AND DECLARATIONS FOR MODULE |
42 ========================================================================================== */
44 /*---------------------------------------------------------------------------
45 | GLOBAL CONSTANT DEFINITIONS: |
46 ---------------------------------------------------------------------------*/
48 /*---------------------------------------------------------------------------
49 | IMPORTED VARIABLE DECLARATIONS: |
50 ---------------------------------------------------------------------------*/
52 /*---------------------------------------------------------------------------
53 | IMPORTED FUNCTION DECLARATIONS: |
54 ---------------------------------------------------------------------------*/
56 /*---------------------------------------------------------------------------
58 ---------------------------------------------------------------------------*/
60 /*---------------------------------------------------------------------------
61 | LOCAL CONSTANT DEFINITIONS: |
62 ---------------------------------------------------------------------------*/
64 /*---------------------------------------------------------------------------
65 | LOCAL DATA TYPE DEFINITIONS: |
66 ---------------------------------------------------------------------------*/
68 /*---------------------------------------------------------------------------
69 | GLOBAL VARIABLE DEFINITIONS: |
70 ---------------------------------------------------------------------------*/
72 /*---------------------------------------------------------------------------
73 | LOCAL VARIABLE DEFINITIONS: |
74 ---------------------------------------------------------------------------*/
76 /*---------------------------------------------------------------------------
77 | LOCAL FUNCTION PROTOTYPES: |
78 ---------------------------------------------------------------------------*/
80 /*===========================================================================
82 | FUNCTION DEFINITIONS |
84 ========================================================================== */
86 int mm_radio_create(MMHandleType *hradio)
88 int result = MM_ERROR_NONE;
89 mm_radio_t *new_radio = NULL;
93 MMRADIO_RETURN_VAL_IF_FAIL(hradio, MM_ERROR_RADIO_NOT_INITIALIZED);
95 /* alloc radio structure */
96 new_radio = (mm_radio_t *)malloc(sizeof(mm_radio_t));
98 MMRADIO_LOG_CRITICAL("cannot allocate memory for radio");
101 memset(new_radio, 0, sizeof(mm_radio_t));
103 /* internal creation stuffs */
104 result = _mmradio_create_radio(new_radio);
106 if (result != MM_ERROR_NONE) {
107 MMRADIO_LOG_ERROR("radio creation failed");
111 *hradio = (MMHandleType)new_radio;
113 MMRADIO_LOG_FLEAVE();
120 MMRADIO_FREEIF(new_radio);
122 *hradio = (MMHandleType)0;
124 MMRADIO_LOG_FLEAVE();
126 /* FIXIT : need to specify more error case */
130 int mm_radio_destroy(MMHandleType hradio)
132 int result = MM_ERROR_NONE;
133 mm_radio_t *radio = (mm_radio_t *)hradio;
135 MMRADIO_LOG_FENTER();
137 MMRADIO_RETURN_VAL_IF_FAIL(radio, MM_ERROR_RADIO_NOT_INITIALIZED);
139 result = _mmradio_destroy(radio);
141 if (result != MM_ERROR_NONE)
142 MMRADIO_LOG_ERROR("failed to destroy radio");
145 MMRADIO_FREEIF(radio);
147 MMRADIO_LOG_FLEAVE();
152 int mm_radio_realize(MMHandleType hradio)
154 int result = MM_ERROR_NONE;
155 mm_radio_t *radio = (mm_radio_t *)hradio;
157 MMRADIO_LOG_FENTER();
159 MMRADIO_RETURN_VAL_IF_FAIL(radio, MM_ERROR_RADIO_NOT_INITIALIZED);
161 MMRADIO_CMD_LOCK(radio);
163 result = _mmradio_realize(radio);
165 MMRADIO_CMD_UNLOCK(radio);
167 MMRADIO_LOG_FLEAVE();
172 int mm_radio_unrealize(MMHandleType hradio)
174 int result = MM_ERROR_NONE;
175 mm_radio_t *radio = (mm_radio_t *)hradio;
176 MMRadioStateType state = 0;
178 MMRADIO_LOG_FENTER();
180 MMRADIO_RETURN_VAL_IF_FAIL(radio, MM_ERROR_RADIO_NOT_INITIALIZED);
182 mm_radio_get_state((hradio), &state);
183 MMRADIO_LOG_DEBUG("mm_radio_unrealize state: %d", state);
185 if (state == MM_RADIO_STATE_SCANNING)
186 mm_radio_scan_stop(hradio);
188 MMRADIO_CMD_LOCK(radio);
190 result = _mmradio_unrealize(radio);
192 MMRADIO_CMD_UNLOCK(radio);
194 MMRADIO_LOG_FLEAVE();
199 int mm_radio_set_message_callback(MMHandleType hradio, MMMessageCallback callback, void *user_param)
201 int result = MM_ERROR_NONE;
202 mm_radio_t *radio = (mm_radio_t *)hradio;
204 MMRADIO_LOG_FENTER();
206 MMRADIO_RETURN_VAL_IF_FAIL(radio, MM_ERROR_RADIO_NOT_INITIALIZED);
208 MMRADIO_CMD_LOCK(radio);
210 result = _mmradio_set_message_callback(radio, callback, user_param);
212 MMRADIO_CMD_UNLOCK(radio);
214 MMRADIO_LOG_FLEAVE();
219 int mm_radio_get_state(MMHandleType hradio, MMRadioStateType *pState)
221 int result = MM_ERROR_NONE;
222 mm_radio_t *radio = (mm_radio_t *)hradio;
225 MMRADIO_LOG_FENTER();
227 MMRADIO_RETURN_VAL_IF_FAIL(radio, MM_ERROR_RADIO_NOT_INITIALIZED);
228 MMRADIO_RETURN_VAL_IF_FAIL(pState, MM_ERROR_COMMON_INVALID_ARGUMENT);
230 MMRADIO_CMD_LOCK(radio);
232 result = _mmradio_get_state(radio, &state);
236 MMRADIO_CMD_UNLOCK(radio);
238 MMRADIO_LOG_FLEAVE();
243 int mm_radio_start(MMHandleType hradio)
245 int result = MM_ERROR_NONE;
246 mm_radio_t *radio = (mm_radio_t *)hradio;
248 MMRADIO_LOG_FENTER();
250 MMRADIO_RETURN_VAL_IF_FAIL(radio, MM_ERROR_RADIO_NOT_INITIALIZED);
252 MMRADIO_CMD_LOCK(radio);
254 result = _mmradio_start(radio);
256 MMRADIO_CMD_UNLOCK(radio);
258 MMRADIO_LOG_FLEAVE();
263 int mm_radio_stop(MMHandleType hradio)
265 int result = MM_ERROR_NONE;
266 mm_radio_t *radio = (mm_radio_t *)hradio;
268 MMRADIO_LOG_FENTER();
270 MMRADIO_RETURN_VAL_IF_FAIL(radio, MM_ERROR_RADIO_NOT_INITIALIZED);
272 MMRADIO_CMD_LOCK(radio);
274 result = _mmradio_stop(radio);
276 MMRADIO_CMD_UNLOCK(radio);
278 MMRADIO_LOG_FLEAVE();
283 int mm_radio_seek(MMHandleType hradio, MMRadioSeekDirectionType direction)
285 int result = MM_ERROR_NONE;
286 mm_radio_t *radio = (mm_radio_t *)hradio;
288 MMRADIO_LOG_FENTER();
290 MMRADIO_RETURN_VAL_IF_FAIL(radio, MM_ERROR_RADIO_NOT_INITIALIZED);
291 MMRADIO_RETURN_VAL_IF_FAIL(direction >= MM_RADIO_SEEK_UP
292 && direction <= MM_RADIO_SEEK_DOWN, MM_ERROR_INVALID_ARGUMENT);
294 MMRADIO_CMD_LOCK(radio);
296 radio->seek_direction = direction;
298 result = _mmradio_seek(radio, direction);
300 MMRADIO_CMD_UNLOCK(radio);
302 MMRADIO_LOG_FLEAVE();
307 int mm_radio_set_frequency(MMHandleType hradio, int freq)
309 int result = MM_ERROR_NONE;
310 mm_radio_t *radio = (mm_radio_t *)hradio;
312 MMRADIO_LOG_FENTER();
314 MMRADIO_RETURN_VAL_IF_FAIL(radio, MM_ERROR_RADIO_NOT_INITIALIZED);
316 MMRADIO_CMD_LOCK(radio);
318 result = _mmradio_set_frequency(radio, freq);
320 MMRADIO_CMD_UNLOCK(radio);
322 MMRADIO_LOG_FLEAVE();
327 int mm_radio_get_frequency(MMHandleType hradio, int *pFreq)
329 int result = MM_ERROR_NONE;
330 mm_radio_t *radio = (mm_radio_t *)hradio;
333 MMRADIO_LOG_FENTER();
335 MMRADIO_RETURN_VAL_IF_FAIL(radio, MM_ERROR_RADIO_NOT_INITIALIZED);
336 MMRADIO_RETURN_VAL_IF_FAIL(pFreq, MM_ERROR_INVALID_ARGUMENT);
338 MMRADIO_CMD_LOCK(radio);
340 result = _mmradio_get_frequency(radio, &freq);
344 MMRADIO_CMD_UNLOCK(radio);
346 MMRADIO_LOG_FLEAVE();
351 int mm_radio_scan_start(MMHandleType hradio)
353 int result = MM_ERROR_NONE;
354 mm_radio_t *radio = (mm_radio_t *)hradio;
356 MMRADIO_LOG_FENTER();
358 MMRADIO_RETURN_VAL_IF_FAIL(radio, MM_ERROR_RADIO_NOT_INITIALIZED);
360 MMRADIO_CMD_LOCK(radio);
362 result = _mmradio_start_scan(radio);
364 MMRADIO_CMD_UNLOCK(radio);
366 MMRADIO_LOG_FLEAVE();
371 int mm_radio_scan_stop(MMHandleType hradio)
373 int result = MM_ERROR_NONE;
374 mm_radio_t *radio = (mm_radio_t *)hradio;
376 MMRADIO_LOG_FENTER();
378 MMRADIO_RETURN_VAL_IF_FAIL(radio, MM_ERROR_RADIO_NOT_INITIALIZED);
380 MMRADIO_CMD_LOCK(radio);
382 result = _mmradio_stop_scan(radio);
384 MMRADIO_CMD_UNLOCK(radio);
386 MMRADIO_LOG_FLEAVE();
391 int mm_radio_set_mute(MMHandleType hradio, bool muted)
393 int result = MM_ERROR_NONE;
394 mm_radio_t *radio = (mm_radio_t *)hradio;
396 MMRADIO_LOG_FENTER();
398 MMRADIO_RETURN_VAL_IF_FAIL(radio, MM_ERROR_RADIO_NOT_INITIALIZED);
400 MMRADIO_CMD_LOCK(radio);
403 result = _mmradio_mute(radio);
405 result = _mmradio_unmute(radio);
407 MMRADIO_CMD_UNLOCK(radio);
409 MMRADIO_LOG_FLEAVE();
414 int mm_radio_get_signal_strength(MMHandleType hradio, int *value)
416 MMRADIO_RETURN_VAL_IF_FAIL(hradio, MM_ERROR_RADIO_NOT_INITIALIZED);
417 MMRADIO_RETURN_VAL_IF_FAIL(value, MM_ERROR_INVALID_ARGUMENT);
419 MMRADIO_LOG_FENTER();
421 int ret = MM_ERROR_NONE;
423 mm_radio_t *radio = (mm_radio_t *)hradio;
425 MMRADIO_CMD_LOCK(radio);
427 ret = _mm_radio_get_signal_strength(radio, value);
429 MMRADIO_CMD_UNLOCK(radio);
431 MMRADIO_LOG_INFO("signal strength = %d", *value);
432 MMRADIO_LOG_FLEAVE();
437 int mm_radio_get_region_type(MMHandleType hradio, MMRadioRegionType *type)
439 MMRADIO_LOG_FENTER();
440 MMRADIO_RETURN_VAL_IF_FAIL(hradio, MM_ERROR_RADIO_NOT_INITIALIZED);
441 MMRADIO_RETURN_VAL_IF_FAIL(type, MM_ERROR_INVALID_ARGUMENT);
443 int result = MM_ERROR_NONE;
444 mm_radio_t *radio = (mm_radio_t *)hradio;
445 MMRadioRegionType cur_type = MM_RADIO_REGION_GROUP_NONE;
447 result = _mmradio_get_region_type(radio, &cur_type);
449 if (result == MM_ERROR_NONE)
452 MMRADIO_LOG_FLEAVE();
456 int mm_radio_get_region_frequency_range(MMHandleType hradio, unsigned int *min, unsigned int *max)
458 MMRADIO_LOG_FENTER();
460 MMRADIO_RETURN_VAL_IF_FAIL(hradio, MM_ERROR_RADIO_NOT_INITIALIZED);
461 MMRADIO_RETURN_VAL_IF_FAIL(min && max, MM_ERROR_INVALID_ARGUMENT);
463 int result = MM_ERROR_NONE;
464 mm_radio_t *radio = (mm_radio_t *)hradio;
465 unsigned int min_freq = 0;
466 unsigned int max_freq = 0;
468 result = _mmradio_get_region_frequency_range(radio, &min_freq, &max_freq);
470 if (result == MM_ERROR_NONE) {
475 MMRADIO_LOG_FLEAVE();
479 int mm_radio_get_channel_spacing(MMHandleType hradio, int *channel_spacing)
481 MMRADIO_LOG_FENTER();
483 MMRADIO_RETURN_VAL_IF_FAIL(hradio, MM_ERROR_RADIO_NOT_INITIALIZED);
484 MMRADIO_RETURN_VAL_IF_FAIL(channel_spacing, MM_ERROR_INVALID_ARGUMENT);
486 int result = MM_ERROR_NONE;
487 mm_radio_t *radio = (mm_radio_t *)hradio;
488 unsigned int ch_spacing = 0;
490 result = _mmradio_get_channel_spacing(radio, &ch_spacing);
492 if (result == MM_ERROR_NONE)
493 *channel_spacing = ch_spacing;
495 MMRADIO_LOG_FLEAVE();
499 int mm_radio_set_volume(MMHandleType hradio, float volume)
501 int result = MM_ERROR_NONE;
502 mm_radio_t *radio = (mm_radio_t *)hradio;
504 MMRADIO_LOG_FENTER();
506 MMRADIO_RETURN_VAL_IF_FAIL(radio, MM_ERROR_RADIO_NOT_INITIALIZED);
508 MMRADIO_CMD_LOCK(radio);
510 result = _mmradio_set_volume(radio, volume);
512 MMRADIO_CMD_UNLOCK(radio);
514 MMRADIO_LOG_FLEAVE();
519 int mm_radio_get_volume(MMHandleType hradio, float *pVolume)
521 int result = MM_ERROR_NONE;
522 mm_radio_t *radio = (mm_radio_t *)hradio;
525 MMRADIO_LOG_FENTER();
527 MMRADIO_RETURN_VAL_IF_FAIL(radio, MM_ERROR_RADIO_NOT_INITIALIZED);
528 MMRADIO_RETURN_VAL_IF_FAIL(pVolume, MM_ERROR_INVALID_ARGUMENT);
530 MMRADIO_CMD_LOCK(radio);
532 result = _mmradio_get_volume(radio, &volume);
533 if (result == MM_ERROR_NONE)
536 MMRADIO_CMD_UNLOCK(radio);
538 MMRADIO_LOG_FLEAVE();