From: Sangchul Lee Date: Wed, 21 Jun 2017 01:31:07 +0000 (+0900) Subject: Manage current acquired focus state and check it before acquiring/releasing focus X-Git-Tag: submit/tizen/20170626.070713~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=6df96ee829ca775efbe13c0e659ad43fafd0b527;p=platform%2Fcore%2Fapi%2Faudio-io.git Manage current acquired focus state and check it before acquiring/releasing focus [Version] 0.3.76 [Profile] Common [Issue Type] Backward compatibility Change-Id: Ifa9a06a8402932e454803b579d97ba48eac3b263 Signed-off-by: Sangchul Lee --- diff --git a/include/CAudioSessionHandler.h b/include/CAudioSessionHandler.h index 06a3619..66bd2ab 100644 --- a/include/CAudioSessionHandler.h +++ b/include/CAudioSessionHandler.h @@ -136,8 +136,7 @@ namespace tizen_media_audio { unsigned int __mSubscribeId; bool __mUseFocus; - mm_sound_focus_type_e __mFocusType; /* For audio focus */ - mm_sound_focus_state_e __mState; /* For audio focus */ + int __mAcquiredFocus; /* For audio focus */ char* __mReasonForChange; /* For audio focus */ char* __mAdditionalInfo; /* For audio focus */ }; diff --git a/packaging/capi-media-audio-io.spec b/packaging/capi-media-audio-io.spec index 6bd1ca8..0710006 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.75 +Version: 0.3.76 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/cpp/CAudioSessionHandler.cpp b/src/cpp/CAudioSessionHandler.cpp index 0fe1271..7091980 100644 --- a/src/cpp/CAudioSessionHandler.cpp +++ b/src/cpp/CAudioSessionHandler.cpp @@ -90,8 +90,7 @@ CAudioSessionHandler::CAudioSessionHandler(EAudioSessionType sessionType, CAudio __mIsInit(false), __mSubscribeId(0), __mUseFocus(false), - __mFocusType(FOCUS_NONE), - __mState(FOCUS_IS_RELEASED), + __mAcquiredFocus(FOCUS_NONE), __mReasonForChange(NULL), __mAdditionalInfo(NULL) { __mAudioInfo = audioInfo; @@ -317,8 +316,11 @@ void CAudioSessionHandler::__sound_pcm_focus_cb(int id, mm_sound_focus_type_e fo #ifndef DISABLE_SESSION_BACK_COMP CAudioSessionHandler* pHandler = static_cast(user_data); - pHandler->__mFocusType = focus_type; - pHandler->__mState = state; + + if (state == FOCUS_IS_RELEASED) + pHandler->__mAcquiredFocus &= ~focus_type; + else if (state == FOCUS_IS_ACQUIRED) + pHandler->__mAcquiredFocus |= focus_type; pHandler->__mReasonForChange = (char *)reason_for_change; pHandler->__mAdditionalInfo = (char *)additional_info; @@ -425,6 +427,7 @@ void CAudioSessionHandler::unregisterSound() throw(CAudioError) { AUDIO_IO_LOGD("Focus watch callback unregistered successfully [id:%d]", __mId); __mId = -1; } + __mAcquiredFocus = FOCUS_NONE; } } @@ -436,13 +439,20 @@ void CAudioSessionHandler::updatePlaying() throw(CAudioError) { if (__mUseFocus && __isFocusRequired(__mMultimediaSession, __mOptions)) { if (__mId >= 0) { int ret = MM_ERROR_NONE; + int focus_type = 0; + if (__mAcquiredFocus == FOCUS_FOR_BOTH) { + AUDIO_IO_LOGW("Focus was already acquired, skip it..."); + return; + } + focus_type |= (FOCUS_FOR_BOTH & ~__mAcquiredFocus); if (__mMultimediaSession == MM_SESSION_TYPE_MEDIA) - ret = mm_sound_acquire_focus_with_option(__mId, FOCUS_FOR_BOTH, 1, "audio-io acquire focus"); /* option: 1 for no-resume */ + ret = mm_sound_acquire_focus_with_option(__mId, (mm_sound_focus_type_e)focus_type, 1, "audio-io acquire focus"); /* option: 1 for no-resume */ else - ret = mm_sound_acquire_focus(__mId, FOCUS_FOR_BOTH, "audio-io acquire focus"); + ret = mm_sound_acquire_focus(__mId, (mm_sound_focus_type_e)focus_type, "audio-io acquire focus"); if (ret != MM_ERROR_NONE) { THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_POLICY_BLOCKED, "Failed mm_sound_acquire_focus() err:0x%x", ret); } + __mAcquiredFocus = FOCUS_FOR_BOTH; AUDIO_IO_LOGD("Focus acquired successfully [id:%d]", __mId); } } @@ -456,13 +466,18 @@ void CAudioSessionHandler::updateStop() throw(CAudioError) { if (__mUseFocus && __isFocusRequired(__mMultimediaSession, __mOptions)) { if (__mId >= 0) { int ret = MM_ERROR_NONE; + if (__mAcquiredFocus == FOCUS_NONE) { + AUDIO_IO_LOGW("Focus was already released, skip it..."); + return; + } if (__mMultimediaSession == MM_SESSION_TYPE_MEDIA) - ret = mm_sound_release_focus_with_option(__mId, FOCUS_FOR_BOTH, 1, "audio-io release focus"); /* option: 1 for no-resume */ + ret = mm_sound_release_focus_with_option(__mId, (mm_sound_focus_type_e)__mAcquiredFocus, 1, "audio-io release focus"); /* option: 1 for no-resume */ else - ret = mm_sound_release_focus(__mId, FOCUS_FOR_BOTH, "audio-io release focus"); + ret = mm_sound_release_focus(__mId, (mm_sound_focus_type_e)__mAcquiredFocus, "audio-io release focus"); if (ret != MM_ERROR_NONE) { THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_FAILED_OPERATION, "Failed mm_sound_release_focus() err:0x%x", ret); } + __mAcquiredFocus = FOCUS_NONE; AUDIO_IO_LOGD("Focus released successfully [id:%d]", __mId); } }