From: Sangchul Lee Date: Wed, 12 Apr 2017 07:14:38 +0000 (+0900) Subject: Fix session interrupted callback X-Git-Tag: submit/tizen/20170502.041616^2~3 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=1801a6a8e2e5bca54a5db3d56a4aa822a30acd08;p=platform%2Fcore%2Fapi%2Fsound-manager.git Fix session interrupted callback [Version] 0.3.110 [Profile] Common [Issue Type] Backward compatibility Change-Id: I18b54542a9cc11d48da78d8e6e8e394d35f0ed2c Signed-off-by: Sangchul Lee --- diff --git a/include/sound_manager_private.h b/include/sound_manager_private.h index 33d4e66..979f58b 100644 --- a/include/sound_manager_private.h +++ b/include/sound_manager_private.h @@ -226,7 +226,7 @@ typedef struct { sound_device_information_changed_cb user_cb; } _device_changed_info_s; -void _focus_session_interrupt_cb(mm_sound_focus_state_e state, const char *reason, bool is_wcb, void *user_data); +void _focus_session_interrupt_cb(mm_sound_focus_state_e state, const char *reason, void *user_data); void _voip_focus_state_change_callback(sound_stream_info_h stream_info, sound_stream_focus_mask_e focus_mask, sound_stream_focus_state_e focus_state, diff --git a/packaging/capi-media-sound-manager.spec b/packaging/capi-media-sound-manager.spec index cdced72..062dfe9 100755 --- 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.109 +Version: 0.3.110 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/sound_manager.c b/src/sound_manager.c index 8caaf24..8f5ebde 100644 --- a/src/sound_manager.c +++ b/src/sound_manager.c @@ -1093,13 +1093,14 @@ int sound_manager_set_session_interrupted_cb(sound_session_interrupted_cb callba } if (g_session_interrupt_cb_table.user_cb == NULL) { - ret = mm_sound_add_device_connected_callback(SOUND_DEVICE_ALL_MASK, (mm_sound_device_connected_cb)_device_connected_cb, NULL, &subs_id); - if (ret) + if ((ret = mm_sound_add_device_connected_callback(SOUND_DEVICE_ALL_MASK, (mm_sound_device_connected_cb)_device_connected_cb, NULL, &subs_id))) { + ret = MM_ERROR_INVALID_ARGUMENT; goto LEAVE; - ret = mm_sound_focus_set_session_interrupt_callback((mm_sound_focus_session_interrupt_cb)_focus_session_interrupt_cb, NULL); - if (ret) { + } + if ((ret = mm_sound_focus_set_session_interrupt_callback((mm_sound_focus_session_interrupt_cb)_focus_session_interrupt_cb, NULL))) { if (mm_sound_remove_device_connected_callback(subs_id) != MM_ERROR_NONE) LOGW("mm_sound_remove_device_connected_callback failed"); + ret = MM_ERROR_INVALID_ARGUMENT; goto LEAVE; } g_session_interrupt_cb_table.subs_id = subs_id; @@ -1125,16 +1126,17 @@ int sound_manager_unset_session_interrupted_cb(void) goto LEAVE; } - ret = mm_sound_focus_unset_session_interrupt_callback(); - if (ret) { + if ((ret = mm_sound_focus_unset_session_interrupt_callback())) { if (mm_sound_remove_device_connected_callback(g_session_interrupt_cb_table.subs_id) != MM_ERROR_NONE) LOGW("mm_sound_remove_device_connected_callback failed"); + ret = MM_ERROR_SOUND_INTERNAL; goto LEAVE; } - ret = mm_sound_remove_device_connected_callback(g_session_interrupt_cb_table.subs_id); - if (ret) + if ((ret = mm_sound_remove_device_connected_callback(g_session_interrupt_cb_table.subs_id))) { + ret = MM_ERROR_SOUND_INTERNAL; goto LEAVE; + } g_session_interrupt_cb_table.subs_id = 0; g_session_interrupt_cb_table.user_cb = NULL; diff --git a/src/sound_manager_private.c b/src/sound_manager_private.c index 15cce5a..a35ba58 100644 --- a/src/sound_manager_private.c +++ b/src/sound_manager_private.c @@ -289,7 +289,6 @@ static int _convert_stream_type_to_interrupt_reason(const char *stream_type, sou if (!strncmp(stream_type, "media", SOUND_STREAM_TYPE_LEN) || !strncmp(stream_type, "radio", SOUND_STREAM_TYPE_LEN) || - !strncmp(stream_type, "system", SOUND_STREAM_TYPE_LEN) || !strncmp(stream_type, "voice-information", SOUND_STREAM_TYPE_LEN) || !strncmp(stream_type, "voice-recognition", SOUND_STREAM_TYPE_LEN) || !strncmp(stream_type, "loopback", SOUND_STREAM_TYPE_LEN) || @@ -314,7 +313,7 @@ static int _convert_stream_type_to_interrupt_reason(const char *stream_type, sou *change_reason = SOUND_SESSION_INTERRUPTED_BY_CALL; } else { - LOGE("not supported stream_type(%s)", stream_type); + LOGE("not supported stream_type(%s) for session interrupted cb", stream_type); return MM_ERROR_INVALID_ARGUMENT; } @@ -1250,25 +1249,50 @@ LEAVE: return; } -void _focus_session_interrupt_cb(mm_sound_focus_state_e state, const char *reason, bool is_wcb, void *user_data) +void _focus_session_interrupt_cb(mm_sound_focus_state_e state, const char *reason, void *user_data) { sound_session_interrupted_code_e e; - LOGE("session interrupted by [%s]", reason); - if (g_session_interrupt_cb_table.user_cb) { - if (is_wcb) { - if (state == FOCUS_IS_RELEASED) - e = SOUND_SESSION_INTERRUPTED_COMPLETED; - else - _convert_stream_type_to_interrupt_reason(reason, &e); - } else { - if (state == FOCUS_IS_ACQUIRED) - e = SOUND_SESSION_INTERRUPTED_COMPLETED; - else - _convert_stream_type_to_interrupt_reason(reason, &e); + int ret = MM_ERROR_NONE; + int cur_session = -1; + int cur_session_option = -1; + + if (!g_session_interrupt_cb_table.user_cb) { + LOGE("user_cb is null"); + return; + } + if (_convert_stream_type_to_interrupt_reason(reason, &e)) { + LOGE("failed to session _convert_stream_type_to_interrupt_reason[%s]", reason); + return; + } + + ret = mm_session_get_current_information(&cur_session, &cur_session_option); + if (ret == MM_ERROR_INVALID_HANDLE) { + cur_session = MM_SESSION_TYPE_MEDIA; + } else if (ret != MM_ERROR_NONE) { + LOGE("failed to mm_session_get_current_type()"); + return; + } + + if (state == FOCUS_IS_RELEASED) { + if (cur_session != MM_SESSION_TYPE_MEDIA && + cur_session != MM_SESSION_TYPE_MEDIA_RECORD) { + LOGI("current session is not media, skip resumption"); + return; } - g_session_interrupt_cb_table.user_cb(e, g_session_interrupt_cb_table.user_data); + if (e == SOUND_SESSION_INTERRUPTED_BY_MEDIA) { + /* check if this media session is resumable */ + if (cur_session_option == -1 || + !(cur_session_option & MM_SESSION_OPTION_RESUME_BY_SYSTEM_OR_MEDIA_PAUSED)) { + LOGI("current media session option is not resumable by media, skip resumption"); + return; + } + } + e = SOUND_SESSION_INTERRUPTED_COMPLETED; } + LOGE("session interrupted by [%s], interrupted code[%d], user_cb[%p]", reason, e, g_session_interrupt_cb_table.user_cb); + g_session_interrupt_cb_table.user_cb(e, g_session_interrupt_cb_table.user_data); + return; }