From 87e0ac3d1d6d575d932d062a524fbcbe4c8c7536 Mon Sep 17 00:00:00 2001 From: Sangchul Lee Date: Fri, 29 Sep 2017 10:33:25 +0900 Subject: [PATCH] Rearrange internalLock() '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 (cherry picked from commit f3f84b6d2c5257f2a25d710a336a0a52ddd42b78) --- packaging/capi-media-audio-io.spec | 2 +- src/cpp/CAudioInput.cpp | 47 ++++++++++++++++++++++---------------- src/cpp/CAudioOutput.cpp | 45 +++++++++++++++++++++--------------- 3 files changed, 55 insertions(+), 39 deletions(-) diff --git a/packaging/capi-media-audio-io.spec b/packaging/capi-media-audio-io.spec index e7f667e..85e4135 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.4.1 +Version: 0.4.2 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/cpp/CAudioInput.cpp b/src/cpp/CAudioInput.cpp index 22f2b01..59eeb40 100644 --- a/src/cpp/CAudioInput.cpp +++ b/src/cpp/CAudioInput.cpp @@ -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(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(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(); diff --git a/src/cpp/CAudioOutput.cpp b/src/cpp/CAudioOutput.cpp index 80f17b9..b4aeb8a 100644 --- a/src/cpp/CAudioOutput.cpp +++ b/src/cpp/CAudioOutput.cpp @@ -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(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(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(); -- 2.7.4