From 053af7be605eff1758b343ff9c925d4be928c714 Mon Sep 17 00:00:00 2001 From: Sangchul Lee Date: Thu, 9 Feb 2017 13:47:38 +0900 Subject: [PATCH] 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 --- packaging/capi-media-audio-io.spec | 2 +- src/cpp/CAudioIO.cpp | 46 ++++++++++++++---------------- src/cpp/CAudioInput.cpp | 4 +-- src/cpp/CAudioOutput.cpp | 4 +-- 4 files changed, 27 insertions(+), 29 deletions(-) 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(); -- 2.34.1