Fix session interrupted callback 36/124736/1
authorSangchul Lee <sc11.lee@samsung.com>
Wed, 12 Apr 2017 07:14:38 +0000 (16:14 +0900)
committerSangchul Lee <sc11.lee@samsung.com>
Wed, 12 Apr 2017 07:14:38 +0000 (16:14 +0900)
[Version] 0.3.110
[Profile] Common
[Issue Type] Backward compatibility

Change-Id: I18b54542a9cc11d48da78d8e6e8e394d35f0ed2c
Signed-off-by: Sangchul Lee <sc11.lee@samsung.com>
include/sound_manager_private.h
packaging/capi-media-sound-manager.spec
src/sound_manager.c
src/sound_manager_private.c

index 33d4e6602433367a5d3563e6a3a287c408e75048..979f58b9a6135ef4562633e2b7006e878efb3832 100644 (file)
@@ -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,
index cdced72b72b5f9d2cdc9df2ff87464449d5e43e3..062dfe97102c98e84f75c7a11e1df1a804eefc92 100755 (executable)
@@ -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
index 8caaf2429b8a7f672dd3d5a2ddb094f9075e8502..8f5ebdea896b64a598a9efd9bb4e9fd35367385b 100644 (file)
@@ -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;
index 15cce5a2ce8423555b1da2803b51abd93bff58d8..a35ba58eed154c6895bc5cfeacaafd75f6a31612 100644 (file)
@@ -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;
 }