Check state before acquiring/releasing focus 08/129308/1
authorSangchul Lee <sc11.lee@samsung.com>
Fri, 3 Mar 2017 07:54:51 +0000 (16:54 +0900)
committerSangchul Lee <sc11.lee@samsung.com>
Fri, 12 May 2017 08:50:17 +0000 (17:50 +0900)
[Version] 0.4.1
[Issue Type] Enhancement

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

index dbe5cd9..a380cf2 100644 (file)
@@ -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;
index 2e7a9dd..6ab8763 100644 (file)
@@ -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
index 3608c3b..b63c308 100644 (file)
@@ -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);
        }