From: Sangchul Lee Date: Thu, 9 Feb 2017 04:47:38 +0000 (+0900) Subject: Avoid deadlock situation between onInterrupt() and unprepare() X-Git-Tag: submit/tizen_3.0/20170210.094941^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F44%2F113844%2F1;p=platform%2Fcore%2Fapi%2Faudio-io.git Avoid deadlock situation between onInterrupt() and unprepare() [Version] 0.3.66 [Profile] Common [Issue Type] Bug fix Change-Id: I2774538bf32d7fd34fbc0944ba8975f73cded29d Signed-off-by: Sangchul Lee --- diff --git a/packaging/capi-media-audio-io.spec b/packaging/capi-media-audio-io.spec index cf2e0c5..9f5316a 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.3.65 +Version: 0.3.66 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/cpp/CAudioIO.cpp b/src/cpp/CAudioIO.cpp index 71f38fe..4991b80 100644 --- a/src/cpp/CAudioIO.cpp +++ b/src/cpp/CAudioIO.cpp @@ -222,10 +222,10 @@ void CAudioIO::onInterrupt(CAudioSessionHandler* pHandler, int id, mm_sound_focu if (state == FOCUS_IS_RELEASED) { // Focus handle(id) of the other application was released, do resume if possible internalLock(); - - mpPulseAudioClient->cork(false); - onStateChanged(CAudioInfo::EAudioIOState::AUDIO_IO_STATE_RUNNING); - + if (mpPulseAudioClient) { + mpPulseAudioClient->cork(false); + onStateChanged(CAudioInfo::EAudioIOState::AUDIO_IO_STATE_RUNNING); + } internalUnlock(); // Focus watch callback doesn't have focus handle, but it need to convert & report to application for convenience @@ -233,16 +233,15 @@ void CAudioIO::onInterrupt(CAudioSessionHandler* pHandler, int id, mm_sound_focu } else if (state == FOCUS_IS_ACQUIRED) { // Focus handle(id) of the other application was acquired, do pause if possible internalLock(); - - if (mpPulseAudioClient->getStreamDirection() == CPulseAudioClient::EStreamDirection::STREAM_DIRECTION_PLAYBACK) { - if (mpPulseAudioClient->drain() == false) { - AUDIO_IO_LOGE("Failed CPulseAudioClient::drain()"); + if (mpPulseAudioClient) { + if (mpPulseAudioClient->getStreamDirection() == CPulseAudioClient::EStreamDirection::STREAM_DIRECTION_PLAYBACK) { + if (mpPulseAudioClient->drain() == false) { + AUDIO_IO_LOGE("Failed CPulseAudioClient::drain()"); + } } + mpPulseAudioClient->cork(true); + onStateChanged(CAudioInfo::EAudioIOState::AUDIO_IO_STATE_PAUSED); } - - mpPulseAudioClient->cork(true); - onStateChanged(CAudioInfo::EAudioIOState::AUDIO_IO_STATE_PAUSED); - internalUnlock(); // Focus watch callback doesn't have focus handle, but it need to convert & report to application for convenience @@ -265,26 +264,25 @@ void CAudioIO::onInterrupt(CAudioSessionHandler* pHandler, int id, mm_sound_focu if (state == FOCUS_IS_RELEASED) { // Focus handle(id) was released, do pause here internalLock(); - - if (mpPulseAudioClient->getStreamDirection() == CPulseAudioClient::EStreamDirection::STREAM_DIRECTION_PLAYBACK) { - if (mpPulseAudioClient->drain() == false) { - AUDIO_IO_LOGE("Failed CPulseAudioClient::drain()"); + if (mpPulseAudioClient) { + if (mpPulseAudioClient->getStreamDirection() == CPulseAudioClient::EStreamDirection::STREAM_DIRECTION_PLAYBACK) { + if (mpPulseAudioClient->drain() == false) { + AUDIO_IO_LOGE("Failed CPulseAudioClient::drain()"); + } } + mpPulseAudioClient->cork(true); + onStateChanged(CAudioInfo::EAudioIOState::AUDIO_IO_STATE_PAUSED); } - - mpPulseAudioClient->cork(true); - onStateChanged(CAudioInfo::EAudioIOState::AUDIO_IO_STATE_PAUSED); - internalUnlock(); } else if (state == FOCUS_IS_ACQUIRED) { // Focus handle(id) was acquired again, // check reason_for_change ("call-voice","call-video","voip","alarm","notification", ...) // do resume here and call interrupt completed callback to application. internalLock(); - - mpPulseAudioClient->cork(false); - onStateChanged(CAudioInfo::EAudioIOState::AUDIO_IO_STATE_RUNNING); - + if (mpPulseAudioClient) { + mpPulseAudioClient->cork(false); + onStateChanged(CAudioInfo::EAudioIOState::AUDIO_IO_STATE_RUNNING); + } internalUnlock(); } } diff --git a/src/cpp/CAudioInput.cpp b/src/cpp/CAudioInput.cpp index 2e489d2..2ca4d0a 100644 --- a/src/cpp/CAudioInput.cpp +++ b/src/cpp/CAudioInput.cpp @@ -320,6 +320,8 @@ void CAudioInput::unprepare() throw(CAudioError) { SAFE_FINALIZE(mpPulseAudioClient); SAFE_DELETE(mpPulseAudioClient); + internalUnlock(); + if (mpAudioSessionHandler->getId() >= 0) { if (isForceIgnore() == false && mpAudioSessionHandler->isSkipSession() == false) mpAudioSessionHandler->updateStop(); @@ -328,8 +330,6 @@ void CAudioInput::unprepare() throw(CAudioError) { mpAudioSessionHandler->unregisterSound(); } - internalUnlock(); - CAudioIO::onStateChanged(CAudioInfo::EAudioIOState::AUDIO_IO_STATE_IDLE); } catch (CAudioError e) { internalUnlock(); diff --git a/src/cpp/CAudioOutput.cpp b/src/cpp/CAudioOutput.cpp index 0fdcdc2..75fbed4 100644 --- a/src/cpp/CAudioOutput.cpp +++ b/src/cpp/CAudioOutput.cpp @@ -211,6 +211,8 @@ void CAudioOutput::unprepare() throw(CAudioError) { SAFE_FINALIZE(mpPulseAudioClient); SAFE_DELETE(mpPulseAudioClient); + internalUnlock(); + if (mpAudioSessionHandler->getId() >= 0) { if (isForceIgnore() == false && mpAudioSessionHandler->isSkipSession() == false) mpAudioSessionHandler->updateStop(); @@ -219,8 +221,6 @@ void CAudioOutput::unprepare() throw(CAudioError) { mpAudioSessionHandler->unregisterSound(); } - internalUnlock(); - CAudioIO::onStateChanged(CAudioInfo::EAudioIOState::AUDIO_IO_STATE_IDLE); } catch (CAudioError e) { internalUnlock();