From: Jaechul Lee Date: Wed, 10 Jun 2020 08:34:56 +0000 (+0900) Subject: Add mutex to stream_info structure for virtual stream APIs X-Git-Tag: submit/tizen/20200611.091235~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=562682c1637bb3cab26b59ac31485d8da94d3bda;p=platform%2Fcore%2Fapi%2Fsound-manager.git Add mutex to stream_info structure for virtual stream APIs 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 --- diff --git a/include/sound_manager_private.h b/include/sound_manager_private.h index f65fdd5..1772cc0 100644 --- a/include/sound_manager_private.h +++ b/include/sound_manager_private.h @@ -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 { diff --git a/packaging/capi-media-sound-manager.spec b/packaging/capi-media-sound-manager.spec index 8502368..cac5194 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.6.6 +Version: 0.6.7 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/sound_manager.c b/src/sound_manager.c index f3636c3..e36578a 100644 --- a/src/sound_manager.c +++ b/src/sound_manager.c @@ -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); diff --git a/src/sound_manager_internal.c b/src/sound_manager_internal.c index ac6f963..6a9dde5 100644 --- a/src/sound_manager_internal.c +++ b/src/sound_manager_internal.c @@ -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); }