CPulseAudioClient: fix improper initialize error handling 46/249546/3 accepted/tizen/unified/20201216.215923 submit/tizen/20201215.130336
authorSeungbae Shin <seungbae.shin@samsung.com>
Mon, 14 Dec 2020 16:19:09 +0000 (01:19 +0900)
committerSeungbae Shin <seungbae.shin@samsung.com>
Mon, 14 Dec 2020 16:22:34 +0000 (01:22 +0900)
[Version] 0.5.37
[Issue Type] Error Handling

Change-Id: I1960a42a6898e30eb04b052ff87e92346461beb6

include/CPulseAudioClient.h
packaging/capi-media-audio-io.spec
src/cpp/CPulseAudioClient.cpp

index c09e499..80bfb70 100644 (file)
@@ -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);
index 1ae28fe..2232729 100644 (file)
@@ -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
index e5b3f88..92d2a79 100644 (file)
@@ -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");
 }