Rearrange internalLock() 83/155483/1 accepted/tizen/unified/20171016.064339 submit/tizen/20171013.081720
authorSangchul Lee <sc11.lee@samsung.com>
Fri, 29 Sep 2017 01:33:25 +0000 (10:33 +0900)
committerSangchul Lee <sc11.lee@samsung.com>
Fri, 13 Oct 2017 08:16:47 +0000 (08:16 +0000)
'internalLock' is for protecting mpPulseAudioClient handle.
But in some functions, it is used too widely it causes dead-lock
issue with internal focus callback for session backward compatibility.

Original patch
 : https://review.tizen.org/gerrit/#/c/153596/

[Version] 0.4.2
[Issue Type] Bug fix

Change-Id: I5c4633e3a9ecfa631bd860a85edf8511cd05c28c
Signed-off-by: Sangchul Lee <sc11.lee@samsung.com>
(cherry picked from commit f3f84b6d2c5257f2a25d710a336a0a52ddd42b78)

packaging/capi-media-audio-io.spec
src/cpp/CAudioInput.cpp
src/cpp/CAudioOutput.cpp

index e7f667e..85e4135 100644 (file)
@@ -1,6 +1,6 @@
 Name:           capi-media-audio-io
 Summary:        An Audio Input & Audio Output library in Tizen Native API
-Version:        0.4.1
+Version:        0.4.2
 Release:        0
 Group:          Multimedia/API
 License:        Apache-2.0
index 22f2b01..59eeb40 100644 (file)
@@ -255,20 +255,17 @@ void CAudioInput::prepare() {
         return;
     }
 
-    try {
-        internalLock();
-
-        // Check to invalid AudioType
-        CAudioInfo::EAudioType audioType = mAudioInfo.getAudioType();
-        if (audioType < CAudioInfo::EAudioType::AUDIO_IN_TYPE_MEDIA || audioType >= CAudioInfo::EAudioType::AUDIO_OUT_TYPE_MEDIA) {
-            THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
-                                   "The audioType is invalid [type:%d]", static_cast<int>(audioType));
-        }
+    /* Check invalid AudioType */
+    CAudioInfo::EAudioType audioType = mAudioInfo.getAudioType();
+    if (audioType < CAudioInfo::EAudioType::AUDIO_IN_TYPE_MEDIA || audioType >= CAudioInfo::EAudioType::AUDIO_OUT_TYPE_MEDIA) {
+        THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
+                               "The audioType is invalid [type:%d]", static_cast<int>(audioType));
+    }
 
-        if (mpAudioSessionHandler->getId() < 0) {  // Did not registerSound()
-            // Check session to skip registration
+    try {
+        if (mpAudioSessionHandler->getId() < 0) {
             if (isForceIgnore() == false && mpAudioSessionHandler->isSkipSession() == false) {
-                // Register ASM Listener
+                /* Register ASM Listener */
                 AUDIO_IO_LOGD("Register ASM Listener");
                 mpAudioSessionHandler->registerSound();
             }
@@ -276,27 +273,32 @@ void CAudioInput::prepare() {
 
         CAudioIO::setInternalStreamInfo();
 
-        // Init StreamSpec
+        if (isForceIgnore() == false && mpAudioSessionHandler->isSkipSession() == false)
+            mpAudioSessionHandler->updatePlaying();
+    } catch (CAudioError& e) {
+        throw;
+    }
+
+    try {
+        /* Init StreamSpec */
         AUDIO_IO_LOGD("Set Stream Spec : CPulseStreamSpec::STREAM_LATENCY_INPUT_DEFAULT");
         CPulseStreamSpec::EStreamLatency streamSpec = CPulseStreamSpec::EStreamLatency::STREAM_LATENCY_INPUT_DEFAULT;
         CPulseStreamSpec spec(streamSpec, mAudioInfo);
 
-        // Create PulseAudio Handler
-        mpPulseAudioClient = new CPulseAudioClient(CPulseAudioClient::EStreamDirection::STREAM_DIRECTION_RECORD, spec, this);
+        internalLock();
 
-        if (isForceIgnore() == false && mpAudioSessionHandler->isSkipSession() == false)
-            mpAudioSessionHandler->updatePlaying();
+        /* Create PulseAudio Handler */
+        mpPulseAudioClient = new CPulseAudioClient(CPulseAudioClient::EStreamDirection::STREAM_DIRECTION_RECORD, spec, this);
 
-        // Initialize PulseAudio Handler
+        /* Initialize PulseAudio Handler */
         mpPulseAudioClient->initialize();
 #ifndef DISABLE_MOBILE_BACK_COMP
-        // Uncork stream which is created with CORKED flag */
+        /* Uncork stream which is created with CORKED flag */
         mpPulseAudioClient->cork(false);
 #endif
 
         internalUnlock();
 
-        // Do Prepare
         CAudioIO::prepare();
     } catch (CAudioError& e) {
         SAFE_FINALIZE(mpPulseAudioClient);
@@ -329,7 +331,12 @@ void CAudioInput::unprepare() {
         SAFE_DELETE(mpPulseAudioClient);
 
         internalUnlock();
+    } catch (CAudioError& e) {
+        internalUnlock();
+        throw;
+    }
 
+    try {
         if (mpAudioSessionHandler->getId() >= 0) {
             if (isForceIgnore() == false && mpAudioSessionHandler->isSkipSession() == false)
                 mpAudioSessionHandler->updateStop();
index 80f17b9..b4aeb8a 100644 (file)
@@ -147,19 +147,17 @@ void CAudioOutput::prepare() {
         return;
     }
 
-    try {
-        internalLock();
-
-        // Check to invalid AudioType
-        CAudioInfo::EAudioType audioType = mAudioInfo.getAudioType();
-        if (audioType < CAudioInfo::EAudioType::AUDIO_OUT_TYPE_MEDIA || audioType >= CAudioInfo::EAudioType::AUDIO_TYPE_MAX) {
-            THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
-                                   "The audioType is invalid [type:%d]", static_cast<int>(audioType));
-        }
+    /* Check invalid AudioType */
+    CAudioInfo::EAudioType audioType = mAudioInfo.getAudioType();
+    if (audioType < CAudioInfo::EAudioType::AUDIO_OUT_TYPE_MEDIA || audioType >= CAudioInfo::EAudioType::AUDIO_TYPE_MAX) {
+        THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
+                               "The audioType is invalid [type:%d]", static_cast<int>(audioType));
+    }
 
+    try {
         if (mpAudioSessionHandler->getId() < 0) {  // Did not registerSound()
             if (isForceIgnore() == false && mpAudioSessionHandler->isSkipSession() == false) {
-                // Register ASM Listener
+                /* Register ASM Listener */
                 AUDIO_IO_LOGD("Register ASM Listener");
                 mpAudioSessionHandler->registerSound();
             }
@@ -167,7 +165,14 @@ void CAudioOutput::prepare() {
 
         CAudioIO::setInternalStreamInfo();
 
-        // Init StreamSpec
+        if (isForceIgnore() == false && mpAudioSessionHandler->isSkipSession() == false)
+            mpAudioSessionHandler->updatePlaying();
+    } catch (CAudioError& e) {
+        throw;
+    }
+
+    try {
+        /* Init StreamSpec */
         CPulseStreamSpec::EStreamLatency streamSpec = CPulseStreamSpec::EStreamLatency::STREAM_LATENCY_OUTPUT_DEFAULT;
 #ifndef DISABLE_MOBILE_BACK_COMP
         if (!mStreamCallback.onStream) {
@@ -180,16 +185,15 @@ void CAudioOutput::prepare() {
 #endif
         CPulseStreamSpec spec(streamSpec, mAudioInfo);
 
-        // Create PulseAudio Handler
-        mpPulseAudioClient = new CPulseAudioClient(CPulseAudioClient::EStreamDirection::STREAM_DIRECTION_PLAYBACK, spec, this);
+        internalLock();
 
-        if (isForceIgnore() == false && mpAudioSessionHandler->isSkipSession() == false)
-            mpAudioSessionHandler->updatePlaying();
+        /* Create PulseAudio Handler */
+        mpPulseAudioClient = new CPulseAudioClient(CPulseAudioClient::EStreamDirection::STREAM_DIRECTION_PLAYBACK, spec, this);
 
-        // Initialize PulseAudio Handler
+        /* Initialize PulseAudio Handler */
         mpPulseAudioClient->initialize();
 #ifndef DISABLE_MOBILE_BACK_COMP
-        // Uncork stream which is created with CORKED flag */
+        /* Uncork stream which is created with CORKED flag */
         mpPulseAudioClient->cork(false);
 #endif
         internalUnlock();
@@ -235,11 +239,16 @@ void CAudioOutput::unprepare() {
 
         internalUnlock();
 
+    } catch (CAudioError& e) {
+        internalUnlock();
+        throw;
+    }
+
+    try {
         if (mpAudioSessionHandler->getId() >= 0) {
             if (isForceIgnore() == false && mpAudioSessionHandler->isSkipSession() == false)
                 mpAudioSessionHandler->updateStop();
         }
-
         CAudioIO::onStateChanged(CAudioInfo::EAudioIOState::AUDIO_IO_STATE_IDLE);
     } catch (CAudioError& e) {
         internalUnlock();