From fe0109f5862d420053ce7fa463a3aa878f89fc9d Mon Sep 17 00:00:00 2001 From: Seungbae Shin Date: Fri, 29 Oct 2021 20:44:03 +0900 Subject: [PATCH] Skip waiting of disconnection for the invalid stream when stopping the virtual stream [Version] 0.6.38 [Issue Type] Bug fix Change-Id: I84a5a2d1f4896f4d22346818687944d27fb2990e --- packaging/capi-media-sound-manager.spec | 2 +- src/sound_manager_private.c | 22 +++++++++++++++------- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/packaging/capi-media-sound-manager.spec b/packaging/capi-media-sound-manager.spec index 95879b8..41b2638 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.37 +Version: 0.6.38 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/sound_manager_private.c b/src/sound_manager_private.c index 53e9c39..b27dcdd 100644 --- a/src/sound_manager_private.c +++ b/src/sound_manager_private.c @@ -3115,6 +3115,7 @@ ERROR_WITH_UNLOCK: int _stop_virtual_stream(virtual_sound_stream_info_s *virtual_stream) { int i = 0; + int ret = 0; SM_ARG_CHECK(virtual_stream); SM_STATE_CHECK(virtual_stream, _VSTREAM_STATE_RUNNING); @@ -3122,21 +3123,28 @@ int _stop_virtual_stream(virtual_sound_stream_info_s *virtual_stream) pa_threaded_mainloop_lock(virtual_stream->pa_mainloop); for (i = 0; i < SOUND_STREAM_DIRECTION_MAX; i++) { - if (virtual_stream->pa_stream[i]) { - pa_stream_disconnect(virtual_stream->pa_stream[i]); + if (!virtual_stream->pa_stream[i]) + continue; + + LOGI("[%d] disconnecting vstream_h[%p] index[%d] state[%d]", + i, virtual_stream, pa_stream_get_index(virtual_stream->pa_stream[i]), pa_stream_get_state(virtual_stream->pa_stream[i])); + ret = pa_stream_disconnect(virtual_stream->pa_stream[i]); + if (ret == 0) { /* wait for terminated state of the stream */ for (;;) { - pa_stream_state_t state; - state = pa_stream_get_state(virtual_stream->pa_stream[i]); + pa_stream_state_t state = pa_stream_get_state(virtual_stream->pa_stream[i]); if (state == PA_STREAM_TERMINATED) break; pa_threaded_mainloop_wait(virtual_stream->pa_mainloop); } - - pa_stream_unref(virtual_stream->pa_stream[i]); - virtual_stream->pa_stream[i] = NULL; + } else { + LOGE("[%d] disconnection failed for vstream_h[%p] index[%d], ret[%d][%s]", + i, virtual_stream, pa_stream_get_index(virtual_stream->pa_stream[i]), ret, pa_strerror(ret)); } + + pa_stream_unref(virtual_stream->pa_stream[i]); + virtual_stream->pa_stream[i] = NULL; } pa_threaded_mainloop_unlock(virtual_stream->pa_mainloop); -- 2.34.1