From f1072a392f1ce10f48684fb3e305dcf19bf072b5 Mon Sep 17 00:00:00 2001 From: Seungbae Shin Date: Tue, 15 Dec 2020 01:19:09 +0900 Subject: [PATCH 1/1] CPulseAudioClient: fix improper initialize error handling [Version] 0.5.37 [Issue Type] Error Handling Change-Id: I1960a42a6898e30eb04b052ff87e92346461beb6 --- include/CPulseAudioClient.h | 2 + packaging/capi-media-audio-io.spec | 2 +- src/cpp/CPulseAudioClient.cpp | 79 ++++++++++++++++++++++---------------- 3 files changed, 48 insertions(+), 35 deletions(-) diff --git a/include/CPulseAudioClient.h b/include/CPulseAudioClient.h index c09e499..80bfb70 100644 --- a/include/CPulseAudioClient.h +++ b/include/CPulseAudioClient.h @@ -100,6 +100,8 @@ namespace tizen_media_audio { /* Static Methods */ /* Private Method */ + void resetStreamCallbacks(); + void resetInternalObjects(); /* Private Callback Method */ static void __contextStateChangeCb(pa_context* c, void* user_data); diff --git a/packaging/capi-media-audio-io.spec b/packaging/capi-media-audio-io.spec index 1ae28fe..2232729 100644 --- a/packaging/capi-media-audio-io.spec +++ b/packaging/capi-media-audio-io.spec @@ -1,6 +1,6 @@ Name: capi-media-audio-io Summary: An Audio Input & Audio Output library in Tizen Native API -Version: 0.5.36 +Version: 0.5.37 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/cpp/CPulseAudioClient.cpp b/src/cpp/CPulseAudioClient.cpp index e5b3f88..92d2a79 100644 --- a/src/cpp/CPulseAudioClient.cpp +++ b/src/cpp/CPulseAudioClient.cpp @@ -335,6 +335,46 @@ void CPulseAudioClient::__successVolumeCb(pa_context *c, int success, void *user AUDIO_IO_LOGD("pa_context[%p], success[%d], user_data[%p]", c, success, user_data); } +void CPulseAudioClient::resetStreamCallbacks() { + if (!__mpStream) + return; + + if (__mDirection == EStreamDirection::STREAM_DIRECTION_PLAYBACK) + pa_stream_set_write_callback(__mpStream, NULL, NULL); + else + pa_stream_set_read_callback(__mpStream, NULL, NULL); + + pa_stream_set_latency_update_callback(__mpStream, NULL, NULL); + pa_stream_set_event_callback(__mpStream, NULL, NULL); +} + +void CPulseAudioClient::resetInternalObjects() { + if (__mpMainloop) + pa_threaded_mainloop_stop(__mpMainloop); + + if (__mpStream) { + pa_stream_disconnect(__mpStream); + pa_stream_unref(__mpStream); + __mpStream = nullptr; + } + + if (__mpContext) { + pa_context_disconnect(__mpContext); + pa_context_unref(__mpContext); + __mpContext = nullptr; + } + + if (__mpMainloop) { + pa_threaded_mainloop_free(__mpMainloop); + __mpMainloop = nullptr; + } + + if (__mpPropList) { + pa_proplist_free(__mpPropList); + __mpPropList = nullptr; + } +} + void CPulseAudioClient::initialize() { if (__mIsInit) return; @@ -492,7 +532,8 @@ void CPulseAudioClient::initialize() { // __mIsInit = true; // Moved to __streamStateChangeCb() } catch (const CAudioError& e) { //LCOV_EXCL_START - finalize(); + resetStreamCallbacks(); + resetInternalObjects(); throw; //LCOV_EXCL_END } @@ -511,15 +552,8 @@ void CPulseAudioClient::finalize() { pa_threaded_mainloop_lock(__mpMainloop); __mIsInit = false; - /* clear callbacks */ - if (__mpStream) { - if (__mDirection == EStreamDirection::STREAM_DIRECTION_PLAYBACK) - pa_stream_set_write_callback(__mpStream, NULL, NULL); - else - pa_stream_set_read_callback(__mpStream, NULL, NULL); - pa_stream_set_latency_update_callback(__mpStream, NULL, NULL); - pa_stream_set_event_callback(__mpStream, NULL, NULL); - } + + resetStreamCallbacks(); if (!is_in_thread) pa_threaded_mainloop_unlock(__mpMainloop); @@ -533,30 +567,7 @@ void CPulseAudioClient::finalize() { drain_wait_count, drain_wait_interval); } - if (__mpMainloop) - pa_threaded_mainloop_stop(__mpMainloop); - - if (__mpStream) { - pa_stream_disconnect(__mpStream); - pa_stream_unref(__mpStream); - __mpStream = nullptr; - } - - if (__mpContext) { - pa_context_disconnect(__mpContext); - pa_context_unref(__mpContext); - __mpContext = nullptr; - } - - if (__mpMainloop) { - pa_threaded_mainloop_free(__mpMainloop); - __mpMainloop = nullptr; - } - - if (__mpPropList) { - pa_proplist_free(__mpPropList); - __mpPropList = nullptr; - } + resetInternalObjects(); AUDIO_IO_LOGD("Done"); } -- 2.7.4