From 7299d8e18cdb11ed0f4d0cafc54a6adff2dcc16b Mon Sep 17 00:00:00 2001 From: Sangchul Lee Date: Fri, 3 Mar 2017 16:54:51 +0900 Subject: [PATCH] Check state before acquiring/releasing focus [Version] 0.4.1 [Issue Type] Enhancement Change-Id: I9d2b200497b625eab7016216732d189926f4b376 Signed-off-by: Sangchul Lee --- include/sound_manager_private.h | 1 + packaging/capi-media-sound-manager.spec | 2 +- src/sound_manager.c | 14 ++++++++++++++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/include/sound_manager_private.h b/include/sound_manager_private.h index dbe5cd9..a380cf2 100644 --- a/include/sound_manager_private.h +++ b/include/sound_manager_private.h @@ -168,6 +168,7 @@ typedef struct _sound_stream_info_s { pa_threaded_mainloop *pa_mainloop; pa_context *pa_context; stream_conf_info_s stream_conf_info; + unsigned int prev_acquired_focus; unsigned int acquired_focus; sound_stream_focus_state_changed_cb user_cb; void *user_data; diff --git a/packaging/capi-media-sound-manager.spec b/packaging/capi-media-sound-manager.spec index 2e7a9dd..6ab8763 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.3.114 +Version: 0.4.1 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/sound_manager.c b/src/sound_manager.c index 3608c3b..b63c308 100644 --- a/src/sound_manager.c +++ b/src/sound_manager.c @@ -385,9 +385,16 @@ 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); + return _convert_sound_manager_error_code(__func__, MM_ERROR_SOUND_INVALID_STATE); + } + ret = mm_sound_acquire_focus_with_option(stream_h->index, (mm_sound_focus_type_e)focus_mask, sound_behavior, extra_info); if (ret == MM_ERROR_NONE) { stream_h->acquired_focus |= focus_mask; + stream_h->prev_acquired_focus |= focus_mask; _update_focus_status(stream_h->index, (unsigned int)stream_h->acquired_focus); } @@ -403,9 +410,16 @@ int sound_manager_release_focus(sound_stream_info_h stream_info, sound_stream_fo 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); + return _convert_sound_manager_error_code(__func__, MM_ERROR_SOUND_INVALID_STATE); + } + ret = mm_sound_release_focus_with_option(stream_h->index, (mm_sound_focus_type_e)focus_mask, sound_behavior, extra_info); if (ret == MM_ERROR_NONE) { stream_h->acquired_focus &= ~focus_mask; + stream_h->prev_acquired_focus &= ~focus_mask; _update_focus_status(stream_h->index, (unsigned int)stream_h->acquired_focus); } -- 2.7.4