Add mutex to stream_info structure for virtual stream APIs 54/235854/3
authorJaechul Lee <jcsing.lee@samsung.com>
Wed, 10 Jun 2020 08:34:56 +0000 (17:34 +0900)
committerJaechul Lee <jcsing.lee@samsung.com>
Wed, 10 Jun 2020 10:10:21 +0000 (19:10 +0900)
pthread_mutex is added in stream_info structure for managing a virtual
stream instance and INVAILD_STATE error is returned when
destroy_stream_information is called without destroying a virtual
stream.

[Version] 0.6.7
[Issue Type] BUG(MMFWN-4276)

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

index f65fdd521746c51e78f5b996958d0499e7fbda74..1772cc0911344b4a1ded1fb6e3e764215e03e3c3 100644 (file)
@@ -207,6 +207,8 @@ typedef struct _preferred_device_info_s {
        int out;
 } preferred_device_info_s;
 
+typedef struct _virtual_stream_info_s virtual_sound_stream_info_s;
+
 typedef struct _sound_stream_info_s {
        int focus_id;
        char *stream_type;
@@ -222,6 +224,8 @@ typedef struct _sound_stream_info_s {
        preferred_device_info_s preferred_device_info;
        pthread_mutex_t focus_state_mutex;
        pthread_mutex_t focus_cb_mutex;
+       pthread_mutex_t vstream_mutex;
+       virtual_sound_stream_h vstream;
 } sound_stream_info_s;
 
 typedef struct _sound_stream_ducking_s {
index 85023681873a6b180a636f1908f0ba8055f19a26..cac5194cfef0a14875e401df5bd888ef6e0fc364 100644 (file)
@@ -1,6 +1,6 @@
 Name:       capi-media-sound-manager
 Summary:    Sound Manager library
-Version:    0.6.6
+Version:    0.6.7
 Release:    0
 Group:      Multimedia/API
 License:    Apache-2.0
index f3636c300ae531c29f0de7a7a1449d0b3f1c3cb7..e36578aceade2580aea7009e18e7ce021a3dac0b 100644 (file)
@@ -189,6 +189,14 @@ int sound_manager_destroy_stream_information(sound_stream_info_h stream_info)
 
        SM_INSTANCE_CHECK(stream_h);
 
+       SM_ENTER_CRITICAL_SECTION_WITH_RETURN(&stream_h->vstream_mutex, SOUND_MANAGER_ERROR_INTERNAL);
+       if (stream_h->vstream) {
+               LOGE("virtual stream is still alive");
+               SM_LEAVE_CRITICAL_SECTION(&stream_h->vstream_mutex);
+               return _convert_sound_manager_error_code(__func__, MM_ERROR_SOUND_INVALID_STATE);
+       }
+       SM_LEAVE_CRITICAL_SECTION(&stream_h->vstream_mutex);
+
        SM_ENTER_CRITICAL_SECTION_WITH_RETURN(&stream_h->focus_state_mutex, MM_ERROR_SOUND_INTERNAL);
        ret = _destroy_pa_connection_and_unregister_focus(stream_h);
        SM_LEAVE_CRITICAL_SECTION(&stream_h->focus_state_mutex);
index ac6f963995ccbc3f6f5c9d77210b48f517dcf9ac..6a9dde586b015a830d8cfd2d493f6af96215950a 100644 (file)
@@ -482,9 +482,21 @@ int sound_manager_create_virtual_stream(sound_stream_info_h stream_info, virtual
 
        LOGI(">> enter");
 
+       SM_INSTANCE_CHECK(stream_h);
+
+       SM_ENTER_CRITICAL_SECTION_WITH_RETURN(&stream_h->vstream_mutex, SOUND_MANAGER_ERROR_INTERNAL);
+
+       if (stream_h->vstream) {
+               LOGE("virtual stream was already created. stream_h(%p), vstream(%p)", stream_h, stream_h->vstream);
+               SM_LEAVE_CRITICAL_SECTION(&stream_h->vstream_mutex);
+               return _convert_sound_manager_error_code(__func__, MM_ERROR_SOUND_INVALID_STATE);
+       }
+
        ret = _create_virtual_stream(stream_h, &vstream_h);
        if (ret == MM_ERROR_NONE)
-               *virtual_stream = (virtual_sound_stream_h)vstream_h;
+               *virtual_stream = stream_h->vstream = (virtual_sound_stream_h)vstream_h;
+
+       SM_LEAVE_CRITICAL_SECTION(&stream_h->vstream_mutex);
 
        return _convert_sound_manager_error_code(__func__, ret);
 }
@@ -492,11 +504,22 @@ int sound_manager_create_virtual_stream(sound_stream_info_h stream_info, virtual
 int sound_manager_destroy_virtual_stream(virtual_sound_stream_h virtual_stream)
 {
        int ret = MM_ERROR_NONE;
+       pthread_mutex_t *vstream_mutex;
        virtual_sound_stream_info_s *vstream_h = (virtual_sound_stream_info_s*)virtual_stream;
 
        LOGI(">> enter");
 
+       SM_INSTANCE_CHECK(vstream_h);
+       SM_INSTANCE_CHECK(vstream_h->stream_info);
+
+       vstream_mutex = &vstream_h->stream_info->vstream_mutex;
+
+       SM_ENTER_CRITICAL_SECTION_WITH_RETURN(vstream_mutex, SOUND_MANAGER_ERROR_INTERNAL);
+
        ret = _destroy_virtual_stream(vstream_h);
+       vstream_h->stream_info->vstream = NULL;
+
+       SM_LEAVE_CRITICAL_SECTION(vstream_mutex);
 
        return _convert_sound_manager_error_code(__func__, ret);
 }
@@ -504,36 +527,66 @@ int sound_manager_destroy_virtual_stream(virtual_sound_stream_h virtual_stream)
 int sound_manager_start_virtual_stream(virtual_sound_stream_h virtual_stream)
 {
        int ret = MM_ERROR_NONE;
+       pthread_mutex_t *vstream_mutex;
        virtual_sound_stream_info_s *vstream_h = (virtual_sound_stream_info_s*)virtual_stream;
 
        LOGI(">> enter");
 
+       SM_INSTANCE_CHECK(vstream_h);
+       SM_INSTANCE_CHECK(vstream_h->stream_info);
+
+       vstream_mutex = &vstream_h->stream_info->vstream_mutex;
+
+       SM_ENTER_CRITICAL_SECTION_WITH_RETURN(vstream_mutex, SOUND_MANAGER_ERROR_INTERNAL);
+
        ret = _start_virtual_stream(vstream_h);
 
+       SM_LEAVE_CRITICAL_SECTION(vstream_mutex);
+
        return _convert_sound_manager_error_code(__func__, ret);
 }
 
 int sound_manager_stop_virtual_stream(virtual_sound_stream_h virtual_stream)
 {
        int ret = MM_ERROR_NONE;
+       pthread_mutex_t *vstream_mutex;
        virtual_sound_stream_info_s *vstream_h = (virtual_sound_stream_info_s*)virtual_stream;
 
        LOGI(">> enter");
 
+       SM_INSTANCE_CHECK(vstream_h);
+       SM_INSTANCE_CHECK(vstream_h->stream_info);
+
+       vstream_mutex = &vstream_h->stream_info->vstream_mutex;
+
+       SM_ENTER_CRITICAL_SECTION_WITH_RETURN(vstream_mutex, SOUND_MANAGER_ERROR_INTERNAL);
+
        ret = _stop_virtual_stream(vstream_h);
 
+       SM_LEAVE_CRITICAL_SECTION(vstream_mutex);
+
        return _convert_sound_manager_error_code(__func__, ret);
 }
 
 int sound_manager_set_virtual_stream_volume(virtual_sound_stream_h virtual_stream, double ratio)
 {
        int ret = MM_ERROR_NONE;
+       pthread_mutex_t *vstream_mutex;
        virtual_sound_stream_info_s *vstream_h = (virtual_sound_stream_info_s*)virtual_stream;
 
        LOGI(">> enter");
 
+       SM_INSTANCE_CHECK(vstream_h);
+       SM_INSTANCE_CHECK(vstream_h->stream_info);
+
+       vstream_mutex = &vstream_h->stream_info->vstream_mutex;
+
+       SM_ENTER_CRITICAL_SECTION_WITH_RETURN(vstream_mutex, MM_ERROR_SOUND_INTERNAL);
+
        ret = _set_virtual_stream_volume(vstream_h, ratio);
 
+       SM_LEAVE_CRITICAL_SECTION(vstream_mutex);
+
        return _convert_sound_manager_error_code(__func__, ret);
 }