From edcbeb2088e8764255b422663924a17217ba9cbd Mon Sep 17 00:00:00 2001 From: Sangchul Lee Date: Wed, 14 Jun 2017 11:42:05 +0900 Subject: [PATCH] fixup! Check state before acquiring/releasing focus [Version] 0.4.6 [Issue Type] Bug fix Change-Id: Ib55f011d9968f28b58058887bbd966001415b5b1 Signed-off-by: Sangchul Lee --- packaging/capi-media-sound-manager.spec | 2 +- src/sound_manager.c | 28 ++++++++++++++++++++++------ 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/packaging/capi-media-sound-manager.spec b/packaging/capi-media-sound-manager.spec index 6dff7a4..92cecae 100644 --- a/packaging/capi-media-sound-manager.spec +++ b/packaging/capi-media-sound-manager.spec @@ -1,6 +1,6 @@ Name: capi-media-sound-manager Summary: Sound Manager library -Version: 0.4.5 +Version: 0.4.6 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/sound_manager.c b/src/sound_manager.c index b63c308..b255243 100644 --- a/src/sound_manager.c +++ b/src/sound_manager.c @@ -369,12 +369,16 @@ int sound_manager_get_focus_reacquisition(sound_stream_info_h stream_info, bool int sound_manager_acquire_focus(sound_stream_info_h stream_info, sound_stream_focus_mask_e focus_mask, int sound_behavior, const char *extra_info) { int ret = MM_ERROR_NONE; + bool is_focus_cb_thread = false; sound_stream_info_s *stream_h = (sound_stream_info_s*)stream_info; LOGI(">> enter"); SM_INSTANCE_CHECK(stream_h); + if ((ret = mm_sound_focus_is_cb_thread(&is_focus_cb_thread))) + return _convert_sound_manager_error_code(__func__, ret); + if (stream_h->is_focus_unavailable) { LOGE("acquiring focus is not allowed for this strema type(%s)", stream_h->stream_type); return _convert_sound_manager_error_code(__func__, MM_ERROR_POLICY_INTERNAL); @@ -385,9 +389,13 @@ int sound_manager_acquire_focus(sound_stream_info_h stream_info, sound_stream_fo return _convert_sound_manager_error_code(__func__, MM_ERROR_POLICY_INTERNAL); } - if ((stream_h->acquired_focus & focus_mask) || (stream_h->prev_acquired_focus & focus_mask)) { - LOGE("invalid state : focus_mask[0x%x], acquired_focus[0x%x], prev[0x%x]", - focus_mask, stream_h->acquired_focus, stream_h->prev_acquired_focus); + if (is_focus_cb_thread && (stream_h->prev_acquired_focus & focus_mask)) { + LOGE("invalid state: focus_mask[0x%x], prev_acquired_focus[0x%x]", focus_mask, stream_h->prev_acquired_focus); + return _convert_sound_manager_error_code(__func__, MM_ERROR_SOUND_INVALID_STATE); + } + + if (stream_h->acquired_focus & focus_mask) { + LOGE("invalid state: focus_mask[0x%x], acquired_focus[0x%x]", focus_mask, stream_h->acquired_focus); return _convert_sound_manager_error_code(__func__, MM_ERROR_SOUND_INVALID_STATE); } @@ -404,15 +412,23 @@ int sound_manager_acquire_focus(sound_stream_info_h stream_info, sound_stream_fo int sound_manager_release_focus(sound_stream_info_h stream_info, sound_stream_focus_mask_e focus_mask, int sound_behavior, const char *extra_info) { int ret = MM_ERROR_NONE; + bool is_focus_cb_thread = false; sound_stream_info_s *stream_h = (sound_stream_info_s*)stream_info; LOGI(">> enter"); SM_INSTANCE_CHECK(stream_h); - if (!(stream_h->acquired_focus & focus_mask) || !(stream_h->prev_acquired_focus & focus_mask)) { - LOGE("invalid state : focus_mask[0x%x], acquired_focus[0x%x], prev[0x%x]", - focus_mask, stream_h->acquired_focus, stream_h->prev_acquired_focus); + if ((ret = mm_sound_focus_is_cb_thread(&is_focus_cb_thread))) + return _convert_sound_manager_error_code(__func__, ret); + + if (is_focus_cb_thread && !(stream_h->prev_acquired_focus & focus_mask)) { + LOGE("invalid state: focus_mask[0x%x], prev_acquired_focus[0x%x]", focus_mask, stream_h->prev_acquired_focus); + return _convert_sound_manager_error_code(__func__, MM_ERROR_SOUND_INVALID_STATE); + } + + if (!(stream_h->acquired_focus & focus_mask)) { + LOGE("invalid state: focus_mask[0x%x], acquired_focus[0x%x]", focus_mask, stream_h->acquired_focus); return _convert_sound_manager_error_code(__func__, MM_ERROR_SOUND_INVALID_STATE); } -- 2.7.4