Expect MM_SESSION_TYPE_REPLACED_BY_STREAM to skip working on backward compatibility...
[platform/core/api/audio-io.git] / src / cpp / CAudioSessionHandler.cpp
index 73aa20a..b9f050a 100644 (file)
@@ -15,6 +15,7 @@
  */
 
 
+#include <unistd.h>
 #include <mm_error.h>
 #include "CAudioIODef.h"
 
@@ -87,8 +88,12 @@ CAudioSessionHandler::CAudioSessionHandler(EAudioSessionType sessionType, CAudio
     __mMultimediaSession(MM_SESSION_TYPE_MEDIA),
     __mpEventListener(listener),
     __mIsInit(false),
+    __mSubscribeId(-1),
     __mUseFocus(false),
-    __mSubscribeId(-1) {
+    __mFocusType(FOCUS_NONE),
+    __mState(FOCUS_IS_RELEASED),
+    __mReasonForChange(NULL),
+    __mAdditionalInfo(NULL) {
     __mAudioInfo = audioInfo;
 }
 
@@ -201,38 +206,30 @@ void CAudioSessionHandler::initialize() throw (CAudioError) {
 
     CAudioError err = __getAsmInformation(&currentSession, &sessionOptions);
     if (err == CAudioError::EError::ERROR_NONE) {
-        // Session was configured before, use focus callback
-        __mUseFocus = true;
-        AUDIO_IO_LOGD("Use audio focus concept internally!");
+        if (currentSession == MM_SESSION_TYPE_REPLACED_BY_STREAM) {
+            __mUseFocus = false;
+            AUDIO_IO_LOGD("Stream info. was created outside, skip audio focus concept internally!");
+        } else {
+            // Session was configured before, use focus callback
+            __mUseFocus = true;
+            AUDIO_IO_LOGD("Use audio focus concept internally!");
+        }
     } else {
         if (err == CAudioError::EError::ERROR_INVALID_HANDLE) {
-            int value = 0;
+            // No session, No stream_info, No focus watch callback before
+            // Use focus watch callback with signal subscribe
             unsigned int subscribe_id;
-
-            int errorCode = mm_sound_get_signal_value(MM_SOUND_SIGNAL_RELEASE_INTERNAL_FOCUS, &value);
+            int errorCode = mm_sound_subscribe_signal(MM_SOUND_SIGNAL_RELEASE_INTERNAL_FOCUS, &subscribe_id, __sound_pcm_signal_cb, static_cast<void*>(this));
             if (errorCode != MM_ERROR_NONE) {
-                THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_POLICY_BLOCKED, "Failed mm_sound_get_signal_value() err:0x%x", errorCode);
+                THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_POLICY_BLOCKED, "Failed mm_sound_subscribe_signal() err:0x%x", errorCode);
             }
 
-            if (value == 1) {
-                // stream_info was created or focus watch callback was configured before
-                __mUseFocus = false;
-                AUDIO_IO_LOGD("Skip audio focus concept!");
-            } else if (value == 0) {
-                // No session, No stream_info, No focus watch callback before
-                // Use focus watch callback with signal subscribe
-                errorCode = mm_sound_subscribe_signal(MM_SOUND_SIGNAL_RELEASE_INTERNAL_FOCUS, &subscribe_id, __sound_pcm_signal_cb, static_cast<void*>(this));
-                if (errorCode != MM_ERROR_NONE) {
-                    THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_POLICY_BLOCKED, "Failed mm_sound_get_signal_value() err:0x%x", errorCode);
-                }
-
-                __mSubscribeId = (int)subscribe_id;
-                AUDIO_IO_LOGD("Subscribed mm_sound signal");
+            __mSubscribeId = (int)subscribe_id;
+            AUDIO_IO_LOGD("Subscribed mm_sound signal");
 
-                sessionOptions = 0;  // Mix with others by default
-                __mUseFocus = true;
-                AUDIO_IO_LOGD("Use audio focus(watch) concept internally!");
-            }
+            sessionOptions = 0;  // Mix with others by default
+            __mUseFocus = true;
+            AUDIO_IO_LOGD("Use audio focus(watch) concept internally!");
         } else {
             __mUseFocus = false;
             AUDIO_IO_LOGD("Skip audio focus concept!");
@@ -369,6 +366,7 @@ void CAudioSessionHandler::registerSound() throw (CAudioError) {
 
             // Register focus callback
             errorCode = mm_sound_register_focus_for_session(__mId,
+                                                getpid(),
                                                 __mAudioSession == EAudioSessionType::AUDIO_SESSION_TYPE_CAPTURE ? __STREAM_TYPE_TABLE_IN[index].name : __STREAM_TYPE_TABLE_OUT[index].name,
                                                 __sound_pcm_focus_cb,
                                                 static_cast<void*>(this));
@@ -381,9 +379,9 @@ void CAudioSessionHandler::registerSound() throw (CAudioError) {
             AUDIO_IO_LOGD("Focus callback registered successfully [id:%d]", __mId);
         } else if (!(__mOptions & MM_SESSION_OPTION_UNINTERRUPTIBLE)) {
             // Register focus watch callback
-            errorCode = mm_sound_set_focus_watch_callback(FOCUS_FOR_BOTH, __sound_pcm_focus_watch_cb, static_cast<void*>(this), &__mId);
+            errorCode = mm_sound_set_focus_watch_callback_for_session(getpid(), FOCUS_FOR_BOTH, __sound_pcm_focus_watch_cb, static_cast<void*>(this), &__mId);
             if (errorCode < 0) {
-                THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_POLICY_BLOCKED, "Failed mm_sound_set_focus_watch_callback() err:0x%x", errorCode);
+                THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_POLICY_BLOCKED, "Failed mm_sound_set_focus_watch_callback_for_session() err:0x%x", errorCode);
             }
 
             __focusIdCountInc();