diff options
author | Gilbok Lee <gilbok.lee@samsung.com> | 2017-04-27 17:57:32 +0900 |
---|---|---|
committer | Gilbok Lee <gilbok.lee@samsung.com> | 2017-04-28 19:15:13 +0900 |
commit | 82239203347f19d3a772faff4f6f2e1fd56550c7 (patch) | |
tree | 708d37300e0720422d606bb75f4e7616fc6c68d1 /src/mm_radio_priv_hal.c | |
parent | 42e03880d935d628608776e138915c23cbe6f780 (diff) | |
download | libmm-radio-82239203347f19d3a772faff4f6f2e1fd56550c7.tar.gz libmm-radio-82239203347f19d3a772faff4f6f2e1fd56550c7.tar.bz2 libmm-radio-82239203347f19d3a772faff4f6f2e1fd56550c7.zip |
Fix bug for resource conflict casetizen_4.0.m1_releasesubmit/tizen/20170428.102059accepted/tizen/unified/20170429.024432
unnecessary resource_manager_release in _mmradio_stop function.
[Version] 0.2.26
[Profile] Mobile, Wearable
[Issue Type] Fix bugs
Change-Id: I3d6de3493b409a2c8912819df6977bcbea1cd3bb
Diffstat (limited to 'src/mm_radio_priv_hal.c')
-rw-r--r-- | src/mm_radio_priv_hal.c | 73 |
1 files changed, 51 insertions, 22 deletions
diff --git a/src/mm_radio_priv_hal.c b/src/mm_radio_priv_hal.c index f4a92e9..5fc7d30 100644 --- a/src/mm_radio_priv_hal.c +++ b/src/mm_radio_priv_hal.c @@ -270,12 +270,6 @@ int _mmradio_realize(mm_radio_t *radio) ret = _mmradio_apply_region(radio, region, update); - ret = mmradio_resource_manager_prepare(&radio->resource_manager, MM_RADIO_RESOURCE_TYPE_RADIO); - if (ret != MM_ERROR_NONE) { - MMRADIO_LOG_ERROR("resource manager prepare fail"); - return MM_ERROR_RADIO_INTERNAL; - } - #ifdef TIZEN_FEATURE_SOUND_VSTREAM ret = sound_manager_create_stream_information_internal(SOUND_STREAM_TYPE_RADIO, NULL, radio, &radio->stream_info); if (ret != MM_ERROR_NONE) { @@ -345,9 +339,6 @@ int _mmradio_unrealize(mm_radio_t *radio) sound_manager_destroy_virtual_stream(radio->vstream); sound_manager_destroy_stream_information(radio->stream_info); #endif - mmradio_resource_manager_unprepare(&radio->resource_manager); - if (ret != MM_ERROR_NONE) - MMRADIO_LOG_ERROR("resource manager unprepare fail"); pthread_mutex_destroy(&radio->seek_cancel_mutex); @@ -565,9 +556,15 @@ int _mmradio_start(mm_radio_t *radio) #endif if (!radio->is_ready) { + ret = mmradio_resource_manager_prepare(&radio->resource_manager, MM_RADIO_RESOURCE_TYPE_RADIO); + if (ret != MM_ERROR_NONE) { + MMRADIO_LOG_ERROR("resource manager prepare fail"); + return MM_ERROR_RADIO_INTERNAL; + } ret = mmradio_resource_manager_acquire(&radio->resource_manager); if (ret != MM_ERROR_NONE) { MMRADIO_LOG_ERROR("failed to acquire resource manager"); + mmradio_resource_manager_unprepare(&radio->resource_manager); return ret; } ret = radio_hal_prepare(radio->hal_inf); @@ -644,6 +641,7 @@ error2: int _mmradio_stop(mm_radio_t *radio) { int ret = MM_ERROR_NONE; + mm_radio_resource_state_e resource_state = MM_RADIO_RESOURCE_STATE_NONE; MMRADIO_LOG_FENTER(); @@ -688,10 +686,23 @@ int _mmradio_stop(mm_radio_t *radio) radio->is_ready = FALSE; - ret = mmradio_resource_manager_release(&radio->resource_manager); - if (ret != MM_ERROR_NONE) { - MMRADIO_LOG_ERROR("failed to release resource"); - return ret; + if (!radio->resource_manager.by_rm_cb && /* is being released */ + mmradio_resource_manager_get_state(&radio->resource_manager, &resource_state) == MM_ERROR_NONE) { + if (resource_state == MM_RADIO_RESOURCE_STATE_ACQUIRED) { + ret = mmradio_resource_manager_release(&radio->resource_manager); + if (ret != MM_ERROR_NONE) { + MMRADIO_LOG_ERROR("failed to release resource, ret(0x%x)", ret); + return ret; + } + } + } + + if (mmradio_resource_manager_get_state(&radio->resource_manager, &resource_state) == MM_ERROR_NONE) { + if (resource_state == MM_RADIO_RESOURCE_STATE_PREPARED) { + ret = mmradio_resource_manager_unprepare(&radio->resource_manager); + if (ret != MM_ERROR_NONE) + MMRADIO_LOG_ERROR("resource manager unprepare fail"); + } } #ifdef TIZEN_FEATURE_SOUND_FOCUS @@ -811,9 +822,15 @@ int _mmradio_start_scan(mm_radio_t *radio) radio->stop_scan = false; if (!radio->is_ready) { + ret = mmradio_resource_manager_prepare(&radio->resource_manager, MM_RADIO_RESOURCE_TYPE_RADIO); + if (ret != MM_ERROR_NONE) { + MMRADIO_LOG_ERROR("resource manager prepare fail"); + return MM_ERROR_RADIO_INTERNAL; + } ret = mmradio_resource_manager_acquire(&radio->resource_manager); if (ret != MM_ERROR_NONE) { MMRADIO_LOG_ERROR("failed to acquire resource manager"); + mmradio_resource_manager_unprepare(&radio->resource_manager); return ret; } @@ -913,6 +930,7 @@ void __mmradio_scan_thread(mm_radio_t *radio) { int ret = MM_ERROR_NONE; int prev_freq = 0; + mm_radio_resource_state_e resource_state = MM_RADIO_RESOURCE_STATE_NONE; MMRADIO_LOG_FENTER(); MMRADIO_CHECK_INSTANCE_RETURN_VOID(radio); @@ -1029,9 +1047,22 @@ FINISHED_ERR: radio->is_ready = FALSE; - ret = mmradio_resource_manager_release(&radio->resource_manager); - if (ret != MM_ERROR_NONE) - MMRADIO_LOG_ERROR("failed to release resource"); + if (!radio->resource_manager.by_rm_cb && /* is being released */ + mmradio_resource_manager_get_state(&radio->resource_manager, &resource_state) == MM_ERROR_NONE) { + if (resource_state == MM_RADIO_RESOURCE_STATE_ACQUIRED) { + ret = mmradio_resource_manager_release(&radio->resource_manager); + if (ret != MM_ERROR_NONE) + MMRADIO_LOG_ERROR("failed to release resource, ret(0x%x)", ret); + } + } + + if (mmradio_resource_manager_get_state(&radio->resource_manager, &resource_state) == MM_ERROR_NONE) { + if (resource_state == MM_RADIO_RESOURCE_STATE_PREPARED) { + ret = mmradio_resource_manager_unprepare(&radio->resource_manager); + if (ret != MM_ERROR_NONE) + MMRADIO_LOG_ERROR("resource manager unprepare fail"); + } + } MMRADIO_SET_STATE(radio, MM_RADIO_STATE_READY); } @@ -1344,6 +1375,7 @@ static bool __mmradio_set_state(mm_radio_t *radio, int new_state) radio->current_state = new_state; /* fill message param */ + msg.union_type = MM_MSG_UNION_STATE; msg.state.previous = radio->old_state; msg.state.current = radio->current_state; @@ -1351,13 +1383,11 @@ static bool __mmradio_set_state(mm_radio_t *radio, int new_state) /* post message to application */ if (radio->sound_focus.by_focus_cb) { msg_type = MM_MESSAGE_STATE_INTERRUPTED; - msg.union_type = MM_MSG_UNION_CODE; - msg.code = radio->sound_focus.event_src; + msg.state.code = radio->sound_focus.event_src; MMRADIO_POST_MSG(radio, msg_type, &msg); } else if (radio->resource_manager.by_rm_cb) { msg_type = MM_MESSAGE_STATE_INTERRUPTED; - msg.union_type = MM_MSG_UNION_CODE; - msg.code = MM_MSG_CODE_INTERRUPTED_BY_RESOURCE_CONFLICT; + msg.state.code = MM_MSG_CODE_INTERRUPTED_BY_RESOURCE_CONFLICT; MMRADIO_POST_MSG(radio, msg_type, &msg); } else { msg_type = MM_MESSAGE_STATE_CHANGED; @@ -1366,8 +1396,7 @@ static bool __mmradio_set_state(mm_radio_t *radio, int new_state) #else if (radio->resource_manager.by_rm_cb) { msg_type = MM_MESSAGE_STATE_INTERRUPTED; - msg.union_type = MM_MSG_UNION_CODE; - msg.code = MM_MSG_CODE_INTERRUPTED_BY_RESOURCE_CONFLICT; + msg.state.code = MM_MSG_CODE_INTERRUPTED_BY_RESOURCE_CONFLICT; MMRADIO_POST_MSG(radio, msg_type, &msg); } else { msg_type = MM_MESSAGE_STATE_CHANGED; |