Merge branch 'tizen_3.0' into tizen 32/120832/2 accepted/tizen_common accepted/tizen_ivi accepted/tizen_mobile accepted/tizen_tv accepted/tizen_wearable accepted/tizen/common/20170329.172626 accepted/tizen/ivi/20170329.222748 accepted/tizen/mobile/20170329.222626 accepted/tizen/tv/20170329.222700 accepted/tizen/unified/20170329.222808 accepted/tizen/wearable/20170329.222724 submit/tizen/20170329.121135 tizen_4.0.m1_release
authorJeongho Mok <jho.mok@samsung.com>
Fri, 24 Mar 2017 09:55:42 +0000 (18:55 +0900)
committerJeongho Mok <jho.mok@samsung.com>
Fri, 24 Mar 2017 09:58:28 +0000 (18:58 +0900)
Change-Id: Ia1c6ddf672ed79f00335455cc4cc98853f56c115

include/CAudioSessionHandler.h
src/cpp/CAudioIO.cpp
src/cpp/CAudioSessionHandler.cpp

index 3d360a8..06a3619 100644 (file)
@@ -115,6 +115,7 @@ namespace tizen_media_audio {
         CAudioError __convertStreamType(EAudioSessionType type1, MMSessionType type2, int *index);
         CAudioError __getAsmInformation(MMSessionType *type, int *options);
         bool __isFocusRequired(MMSessionType type, int options);
+        bool __isFocusDisableReacquisitionRequired(MMSessionType type, int options);
 
         /* Static Member */
         static int                  __sCaptureRef;
index 87758c8..d669e3a 100644 (file)
@@ -236,11 +236,13 @@ void CAudioIO::onInterrupt(CAudioSessionHandler* pHandler, int id, mm_sound_focu
             // Focus handle(id) of the other application was acquired, do pause if possible
             internalLock();
             if (mpPulseAudioClient) {
+                /* FIXME: Skip this codes due to the blocking of drain() function
                 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);
             }
@@ -267,11 +269,13 @@ void CAudioIO::onInterrupt(CAudioSessionHandler* pHandler, int id, mm_sound_focu
             // Focus handle(id) was released, do pause here
             internalLock();
             if (mpPulseAudioClient) {
+                /* FIXME: Skip this codes due to the blocking of drain() function
                 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);
             }
index 1f2e04b..f31675d 100644 (file)
@@ -160,6 +160,14 @@ bool CAudioSessionHandler::__isFocusRequired(MMSessionType type, int options) {
         return false;
 }
 
+bool CAudioSessionHandler::__isFocusDisableReacquisitionRequired(MMSessionType type, int options) {
+    if ((type == MM_SESSION_TYPE_MEDIA) &&
+        !(options & MM_SESSION_OPTION_RESUME_BY_SYSTEM_OR_MEDIA_PAUSED))
+        return true;
+
+    return false;
+}
+
 int CAudioSessionHandler::getId() {
     return __mId;
 }
@@ -362,6 +370,13 @@ void CAudioSessionHandler::registerSound() throw(CAudioError) {
                 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_FAILED_OPERATION, "Failed mm_sound_register_focus_for_session() err:0x%x", errorCode);
             }
 
+            if (__isFocusDisableReacquisitionRequired(__mMultimediaSession, __mOptions)) {
+                errorCode = mm_sound_set_focus_reacquisition_for_session(__mId, false);
+                if (errorCode != MM_ERROR_NONE) {
+                    THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_FAILED_OPERATION, "Failed mm_sound_set_focus_reacquisition() err:0x%x", errorCode);
+                }
+            }
+
             __focusIdCountInc();
 
             AUDIO_IO_LOGD("Focus callback registered successfully [id:%d]", __mId);
@@ -420,7 +435,11 @@ void CAudioSessionHandler::updatePlaying() throw(CAudioError) {
 
     if (__mUseFocus && __isFocusRequired(__mMultimediaSession, __mOptions)) {
         if (__mId >= 0) {
-            int ret = mm_sound_acquire_focus(__mId, FOCUS_FOR_BOTH, "audio-io acquire focus");
+            int ret = MM_ERROR_NONE;
+            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 */
+            else
+                ret = mm_sound_acquire_focus(__mId, FOCUS_FOR_BOTH, "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);
             }
@@ -436,7 +455,11 @@ void CAudioSessionHandler::updateStop() throw(CAudioError) {
 
     if (__mUseFocus && __isFocusRequired(__mMultimediaSession, __mOptions)) {
         if (__mId >= 0) {
-            int ret = mm_sound_release_focus(__mId, FOCUS_FOR_BOTH, "audio-io release focus");
+            int ret = MM_ERROR_NONE;
+            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 */
+            else
+                ret = mm_sound_release_focus(__mId, FOCUS_FOR_BOTH, "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);
             }