-/*
- * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-#include <unistd.h>
-#include <mm_error.h>
-#include "CAudioIODef.h"
-
-
-using namespace std;
-using namespace tizen_media_audio;
-
-
-/**
- * class CAudioSessionHandler
- */
-int CAudioSessionHandler::__sCaptureRef = 0;
-
-int CAudioSessionHandler::__pcmCaptureCountInc() {
- int actual;
- do {
- actual = __sCaptureRef;
- } while (!__sync_bool_compare_and_swap(&__sCaptureRef, actual, actual + 1));
- AUDIO_IO_LOGD("CaptureRefCount+1 > [%d]", __sCaptureRef);
- return __sCaptureRef;
-}
-
-int CAudioSessionHandler::__pcmCaptureCountDec() {
- int actual;
- do {
- actual = __sCaptureRef;
- } while (!__sync_bool_compare_and_swap(&__sCaptureRef, actual, actual - 1));
- AUDIO_IO_LOGD("CaptureRefCount-1 > [%d]", __sCaptureRef);
- if (__sCaptureRef < 0) {
- AUDIO_IO_LOGE("A CaptureRef[%d] is not valid! Something is wrong!", __sCaptureRef);
- __sCaptureRef = 0;
- }
- return __sCaptureRef;
-}
-
-int CAudioSessionHandler::__pcmCaptureCountGet() {
- AUDIO_IO_LOGD("CaptureRefCount > [%d]", __sCaptureRef);
- return __sCaptureRef;
-}
-
-int CAudioSessionHandler::__sFocusRef = 0;
-
-int CAudioSessionHandler::__focusIdCountInc() {
- int actual;
- do {
- actual = __sFocusRef;
- } while (!__sync_bool_compare_and_swap(&__sFocusRef, actual, actual + 1));
- AUDIO_IO_LOGD("FocusRefCount+1 > [%d]", __sFocusRef);
- return __sFocusRef;
-}
-
-int CAudioSessionHandler::__focusIdCountDec() {
- int actual;
- do {
- actual = __sFocusRef;
- } while (!__sync_bool_compare_and_swap(&__sFocusRef, actual, actual - 1));
- AUDIO_IO_LOGD("FocusRefCount-1 > [%d]", __sFocusRef);
- return __sFocusRef;
-}
-
-int CAudioSessionHandler::__focusIdCountGet() {
- /* AUDIO_IO_LOGD("FocusRefCount > [%d]", __sFocusRef); */
- return __sFocusRef;
-}
-
-void CAudioSessionHandler::__lockFocusIdMutex() {
- if (pthread_mutex_lock(&__mFocusIdMutex) != 0)
- THROW_ERROR_MSG(CAudioError::EError::ERROR_INTERNAL_OPERATION, "Failed pthread_mutex_lock() - FocusId Mutex");
-#ifdef _AUDIO_IO_DEBUG_TIMING_
- AUDIO_IO_LOGD(COLOR_RED "LOCK - FocusId Mutex" COLOR_END);
-#endif
-}
-
-void CAudioSessionHandler::__unlockFocusIdMutex() {
- if (pthread_mutex_unlock(&__mFocusIdMutex) != 0)
- THROW_ERROR_MSG(CAudioError::EError::ERROR_INTERNAL_OPERATION, "Failed pthread_mutex_unlock() - FocusId Mutex");
-#ifdef _AUDIO_IO_DEBUG_TIMING_
- AUDIO_IO_LOGD(COLOR_GREEN "UNLOCK - FocusId Mutex" COLOR_END);
-#endif
-}
-
-void CAudioSessionHandler::__lockFocusCBMutex() {
- if (pthread_mutex_lock(&__mFocusCBMutex) != 0)
- THROW_ERROR_MSG(CAudioError::EError::ERROR_INTERNAL_OPERATION, "Failed pthread_mutex_lock() - FocusCB Mutex");
-#ifdef _AUDIO_IO_DEBUG_TIMING_
- AUDIO_IO_LOGD(COLOR_RED "LOCK - FocusCB Mutex" COLOR_END);
-#endif
-}
-
-void CAudioSessionHandler::__unlockFocusCBMutex() {
- if (pthread_mutex_unlock(&__mFocusCBMutex) != 0)
- THROW_ERROR_MSG(CAudioError::EError::ERROR_INTERNAL_OPERATION, "Failed pthread_mutex_unlock() - FocusCB Mutex");
-#ifdef _AUDIO_IO_DEBUG_TIMING_
- AUDIO_IO_LOGD(COLOR_GREEN "UNLOCK - FocusCB Mutex" COLOR_END);
-#endif
-}
-
-CAudioSessionHandler::CAudioSessionHandler(EAudioSessionType sessionType, CAudioInfo& audioInfo, IAudioSessionEventListener* listener) :
- __mId(-1),
- __mOptions(0),
- __mAudioSession(sessionType),
- __mMultimediaSession(MM_SESSION_TYPE_MEDIA),
- __mpEventListener(listener),
- __mIsInit(false),
- __mSubscribeId(0),
- __mUseFocus(false),
- __mAcquiredFocus(FOCUS_NONE),
- __mReasonForChange(NULL),
- __mAdditionalInfo(NULL),
- __mFocusIdMutex(PTHREAD_MUTEX_INITIALIZER),
- __mFocusCBMutex(PTHREAD_MUTEX_INITIALIZER) {
- __mAudioInfo = audioInfo;
-}
-
-CAudioSessionHandler::~CAudioSessionHandler() {
-}
-
-CAudioError CAudioSessionHandler::__convertStreamType(EAudioSessionType type1, MMSessionType type2, int *index) {
- unsigned int i;
- int idx = -1;
-
- assert(index != NULL);
-
- if (type1 == EAudioSessionType::AUDIO_SESSION_TYPE_CAPTURE) {
- for (i = 0 ; i < sizeof(__STREAM_TYPE_TABLE_IN) / sizeof(__STREAM_TYPE_TABLE_IN[0]) ; i++) {
- if (__STREAM_TYPE_TABLE_IN[i].type == type2) {
- idx = i;
- break;
- }
- }
- } else {
- for (i = 0 ; i < sizeof(__STREAM_TYPE_TABLE_OUT) / sizeof(__STREAM_TYPE_TABLE_OUT[0]) ; i++) {
- if (__STREAM_TYPE_TABLE_OUT[i].type == type2) {
- idx = i;
- break;
- }
- }
- }
-
- if (idx < 0) {
- RET_ERROR_MSG(CAudioError::EError::ERROR_NOT_SUPPORTED, "Does not support session type.");
- }
- *index = idx;
- RET_ERROR(CAudioError::EError::ERROR_NONE);
-}
-
-CAudioError CAudioSessionHandler::__getAsmInformation(MMSessionType *type, int *options) {
- assert(type != NULL);
- assert(options != NULL);
-
- MMSessionType currentSession = MM_SESSION_TYPE_MEDIA;
- int sessionOptions = 0;
-
- /* Read session information */
- int ret = 0;
- if ((ret = _mm_session_util_read_information(-1, (int*)¤tSession, &sessionOptions)) < 0) {
- if (ret == (int) MM_ERROR_INVALID_HANDLE)
- RET_ERROR_MSG(CAudioError::EError::ERROR_INVALID_HANDLE, "Failed _mm_session_util_read_information(). Invalid handle");
- else
- RET_ERROR_MSG(CAudioError::EError::ERROR_FAILED_OPERATION, "Failed _mm_session_util_read_information(). Not exist");
- }
-
- *type = currentSession;
- *options = sessionOptions;
-
- RET_ERROR(CAudioError::EError::ERROR_NONE);
-}
-
-bool CAudioSessionHandler::__isFocusRequired(MMSessionType type, int options) {
- if ((options & MM_SESSION_OPTION_PAUSE_OTHERS)
- || ((type != MM_SESSION_TYPE_MEDIA) && (type != MM_SESSION_TYPE_MEDIA_RECORD)))
- return true;
- else
- 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;
-}
-
-bool CAudioSessionHandler::__checkNeedBlock(const char *focus_acquired_by) {
- assert(focus_acquired_by != NULL);
-
- if (!strcmp(focus_acquired_by, "alarm") ||
- !strcmp(focus_acquired_by, "ringtone-voip") ||
- !strcmp(focus_acquired_by, "ringtone-call") ||
- !strcmp(focus_acquired_by, "voip") ||
- !strcmp(focus_acquired_by, "call-voice") ||
- !strcmp(focus_acquired_by, "call-video")) {
- AUDIO_IO_LOGW("Blocked by session policy, focus_acquired_by[%s]", focus_acquired_by);
- return true;
- }
-
- return false;
-}
-
-int CAudioSessionHandler::getId() {
- return __mId;
-}
-
-int CAudioSessionHandler::getOptions() {
- return __mOptions;
-}
-
-CAudioSessionHandler::EAudioSessionType CAudioSessionHandler::getAudioSession() {
- return __mAudioSession;
-}
-
-MMSessionType CAudioSessionHandler::getMultimediaSession() {
- return __mMultimediaSession;
-}
-
-void CAudioSessionHandler::getInternalVoipStreamInfo(sound_stream_info_h *stream_info) {
-#if 0
- int ret;
- if ((ret = sound_manager_get_internal_voip_stream_information(stream_info))) {
- if (ret == SOUND_MANAGER_ERROR_NO_DATA)
- AUDIO_IO_LOGW("there's no internal voip stream info.");
- else
- AUDIO_IO_LOGE("failed to sound_manager_get_internal_voip_stream_information(), ret(0x%x)", ret);
- }
-#endif
- return;
-}
-
-unsigned int CAudioSessionHandler::getSubscribeId() {
- return __mSubscribeId;
-}
-
-CAudioInfo CAudioSessionHandler::getAudioInfo() {
- return __mAudioInfo;
-}
-
-void CAudioSessionHandler::__sound_pcm_signal_cb(mm_sound_signal_name_t signal, int value, void *user_data) {
- assert(user_data);
-
- AUDIO_IO_LOGD("[signal:%d], [value:%d], [user_data:%p]", signal, value, user_data);
-
- CAudioSessionHandler* pHandler = static_cast<CAudioSessionHandler*>(user_data);
- if (pHandler->__mpEventListener != NULL)
- pHandler->__mpEventListener->onSignal(pHandler, signal, value);
-}
-
-void CAudioSessionHandler::initialize() {
- AUDIO_IO_LOGD("");
- if (__mIsInit == true)
- return;
-
- MMSessionType currentSession = MM_SESSION_TYPE_MEDIA;
- int sessionOptions = 0; // Mix with others by default
-
- CAudioError err = __getAsmInformation(¤tSession, &sessionOptions);
- if (err == CAudioError::EError::ERROR_NONE) {
- 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) {
- // No session, No stream_info, No focus watch callback before
- // Use focus watch callback with signal subscribe
-
- int errorCode = mm_sound_subscribe_signal(MM_SOUND_SIGNAL_RELEASE_INTERNAL_FOCUS, &__mSubscribeId, __sound_pcm_signal_cb, static_cast<void*>(this));
- if (errorCode != MM_ERROR_NONE || __mSubscribeId == 0)
- THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_FAILED_OPERATION, "Failed mm_sound_subscribe_signal() err:0x%x, __mSubscribeId:%u",
- errorCode, __mSubscribeId);
-
- AUDIO_IO_LOGD("Subscribed mm_sound signal [id:%d]", __mSubscribeId);
-
- 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!");
- }
-
- if (__mAudioSession == EAudioSessionType::AUDIO_SESSION_TYPE_CAPTURE) {
- AUDIO_IO_LOGD("Set default \"Media_Record\" type");
- currentSession = MM_SESSION_TYPE_MEDIA_RECORD;
- } else {
- AUDIO_IO_LOGD("Set default \"Media\" type");
- currentSession = MM_SESSION_TYPE_MEDIA;
- }
- }
-
- // Updates session information
- __mMultimediaSession = currentSession;
- __mOptions = sessionOptions;
-
- if (this->__mAudioSession == EAudioSessionType::AUDIO_SESSION_TYPE_CAPTURE)
- __pcmCaptureCountInc();
-
- __mIsInit = true;
-}
-
-void CAudioSessionHandler::finalize() {
- AUDIO_IO_LOGD("");
- if (__mIsInit == false)
- return;
-
- if (__mAudioSession == EAudioSessionType::AUDIO_SESSION_TYPE_CAPTURE)
- __pcmCaptureCountDec();
-
- unregisterSound();
-
- if (__mSubscribeId > 0) {
- AUDIO_IO_LOGD("Unsubscribed mm_sound signal [id:%d]", __mSubscribeId);
- mm_sound_unsubscribe_signal(__mSubscribeId);
- __mSubscribeId = 0;
- }
-
- __mpEventListener = NULL;
-
- __mIsInit = false;
-}
-
-bool CAudioSessionHandler::isSkipSession() {
- if (__mMultimediaSession == MM_SESSION_TYPE_REPLACED_BY_STREAM ||
- __mMultimediaSession == MM_SESSION_TYPE_VOIP ||
- __mMultimediaSession == MM_SESSION_TYPE_CALL ||
- __mMultimediaSession == MM_SESSION_TYPE_VIDEOCALL) {
- AUDIO_IO_LOGD("__mMultimediaSession is [%d], skip session", __mMultimediaSession);
- return true;
- }
-
- return false;
-}
-
-void CAudioSessionHandler::__sound_pcm_focus_cb(int id, mm_sound_focus_type_e focus_type, mm_sound_focus_state_e state,
- const char *reason_for_change, int option, const char *additional_info, void *user_data) {
- assert(user_data);
-
- AUDIO_IO_LOGD("[id:%d], [focus_type:%d], [state:%d], [reason_for_change:%s], [additional_info:%s], [user_data:%p]",
- id, focus_type, state, reason_for_change, additional_info, user_data);
-
-/* FIXME: disable it temporarily */
-#ifndef DISABLE_SESSION_BACK_COMP
-
- CAudioSessionHandler* pHandler = static_cast<CAudioSessionHandler*>(user_data);
-
- pHandler->__lockFocusCBMutex();
-
- 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;
-
- if (pHandler->__mpEventListener != NULL)
- pHandler->__mpEventListener->onInterrupt(pHandler, id, focus_type, state, reason_for_change, additional_info);
-
- pHandler->__unlockFocusCBMutex();
-#endif
- return;
-}
-
-void CAudioSessionHandler::__sound_pcm_focus_watch_cb(int id, mm_sound_focus_type_e focus_type, mm_sound_focus_state_e state,
- const char *reason_for_change, const char *additional_info, void *user_data) {
- AUDIO_IO_LOGD("[id:%d], [focus_type:%d], [state:%d], [reason_for_change:%s], [additional_info:%s], [user_data:%p]",
- id, focus_type, state, reason_for_change, additional_info, user_data);
-
- CAudioSessionHandler::__sound_pcm_focus_cb(-1, focus_type, state, reason_for_change, 0, additional_info, user_data);
-
- return;
-}
-
-void CAudioSessionHandler::registerSound() {
- if (__mIsInit == false)
- THROW_ERROR_MSG(CAudioError::EError::ERROR_NOT_INITIALIZED, "Doesn't initialize CAudioSessionHandler");
-
- if (__mUseFocus == true) {
- __lockFocusIdMutex();
- if (__mId >= 0) {
- __unlockFocusIdMutex();
- THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_POLICY_BLOCKED, "Already registered [id:%d]", __mId);
- }
-
- int errorCode = 0;
-
- if (__isFocusRequired(__mMultimediaSession, __mOptions)) {
- int index = 0;
-
- CAudioError err = __convertStreamType(__mAudioSession, __mMultimediaSession, &index);
- if (err != CAudioError::EError::ERROR_NONE) {
- __unlockFocusIdMutex();
- throw err;
- }
-
- errorCode = mm_sound_focus_get_id(&__mId);
- if (errorCode != MM_ERROR_NONE) {
- __unlockFocusIdMutex();
- THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_FAILED_OPERATION, "Failed mm_sound_focus_get_id() err:0x%x", errorCode);
- }
-
- // 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));
- if (errorCode != MM_ERROR_NONE) {
- __unlockFocusIdMutex();
- 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) {
- __unlockFocusIdMutex();
- 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);
- } else if (!(__mOptions & MM_SESSION_OPTION_UNINTERRUPTIBLE)) {
- // Register focus watch callback
- 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) {
- __unlockFocusIdMutex();
- THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_FAILED_OPERATION, "Failed mm_sound_set_focus_watch_callback_for_session() err:0x%x", errorCode);
- }
-
- __focusIdCountInc();
-
- AUDIO_IO_LOGD("Focus watch callback registered successfully [id:%d]", __mId);
- }
- __unlockFocusIdMutex();
- }
-}
-
-void CAudioSessionHandler::unregisterSound() {
- if (__mIsInit == false)
- THROW_ERROR_MSG(CAudioError::EError::ERROR_NOT_INITIALIZED, "Doesn't initialize CAudioSessionHandler");
-
- __lockFocusIdMutex();
- if (__mUseFocus == true && __mId >= 0) {
- int errorCode = 0;
-
- if (__isFocusRequired(__mMultimediaSession, __mOptions)) {
- // Unregister focus callback
- errorCode = mm_sound_unregister_focus(__mId);
- if (errorCode != MM_ERROR_NONE) {
- __unlockFocusIdMutex();
- THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_FAILED_OPERATION, "Failed mm_sound_unregister_focus() err:0x%x", errorCode);
- }
-
- __focusIdCountDec();
-
- AUDIO_IO_LOGD("Focus callback unregistered successfully [id:%d]", __mId);
- __mId = -1;
- } else if (!(__mOptions & MM_SESSION_OPTION_UNINTERRUPTIBLE)) {
- // Unregister focus watch callback.
- errorCode = mm_sound_unset_focus_watch_callback(__mId);
- if (errorCode < 0) {
- __unlockFocusIdMutex();
- THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_FAILED_OPERATION, "Failed mm_sound_unset_focus_watch_callback() err:0x%x", errorCode);
- }
-
- __focusIdCountDec();
-
- AUDIO_IO_LOGD("Focus watch callback unregistered successfully [id:%d]", __mId);
- __mId = -1;
- }
- __mAcquiredFocus = FOCUS_NONE;
- }
- __unlockFocusIdMutex();
-}
-
-void CAudioSessionHandler::updatePlaying() {
- if (__mIsInit == false)
- THROW_ERROR_MSG(CAudioError::EError::ERROR_NOT_INITIALIZED, "Doesn't initialize CAudioSessionHandler");
-
- __lockFocusIdMutex();
- if (!__mUseFocus || __mId < 0) {
- __unlockFocusIdMutex();
- return;
- }
-
- if (__mUseFocus && __isFocusRequired(__mMultimediaSession, __mOptions)) {
- if (__mId >= 0) {
- int ret = MM_ERROR_NONE;
- int focus_type = 0;
- bool is_focus_cb_thread;
-
- if ((ret = mm_sound_focus_is_cb_thread(&is_focus_cb_thread))) {
- __unlockFocusIdMutex();
- THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INTERNAL_OPERATION, "Failed mm_sound_focus_is_cb_thread() err:0x%x", ret);
- }
-
- if (!is_focus_cb_thread)
- __lockFocusCBMutex();
-
- if (__mAcquiredFocus == FOCUS_FOR_BOTH) {
- AUDIO_IO_LOGW("Focus was already acquired, skip it...");
- if (!is_focus_cb_thread)
- __unlockFocusCBMutex();
- __unlockFocusIdMutex();
- return;
- }
-
- focus_type |= (FOCUS_FOR_BOTH & ~__mAcquiredFocus);
- if (__mMultimediaSession == MM_SESSION_TYPE_MEDIA)
- 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, (mm_sound_focus_type_e)focus_type, "audio-io acquire focus");
- if (ret != MM_ERROR_NONE) {
- if (!is_focus_cb_thread)
- __unlockFocusCBMutex();
- __unlockFocusIdMutex();
- 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);
-
- if (!is_focus_cb_thread)
- __unlockFocusCBMutex();
- }
- } else {
- int ret = MM_ERROR_NONE;
- char *stream_type = NULL;
- char *ext_info = NULL;
- int option = 0;
-
- if ((ret = mm_sound_get_stream_type_of_acquired_focus(FOCUS_FOR_BOTH, &stream_type, &option, &ext_info))) {
- __unlockFocusIdMutex();
- return;
- }
-
- AUDIO_IO_LOGD("Focus is acquired by stream_type[%s], option[%d], ext_info[%s]", stream_type, option, ext_info);
-
- if (__checkNeedBlock((const char*)stream_type)) {
- free(stream_type);
- free(ext_info);
- __unlockFocusIdMutex();
- THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_POLICY_BLOCKED, "Blocked by an acquired focus");
- }
- free(stream_type);
- free(ext_info);
- }
- __unlockFocusIdMutex();
-}
-
-void CAudioSessionHandler::updateStop() {
- if (__mIsInit == false)
- THROW_ERROR_MSG(CAudioError::EError::ERROR_NOT_INITIALIZED, "Doesn't initialize CAudioSessionHandler");
-
- if (__mUseFocus && __isFocusRequired(__mMultimediaSession, __mOptions)) {
- __lockFocusIdMutex();
- if (__mId >= 0) {
- int ret = MM_ERROR_NONE;
- bool is_focus_cb_thread;
-
- if ((ret = mm_sound_focus_is_cb_thread(&is_focus_cb_thread))) {
- __unlockFocusIdMutex();
- THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INTERNAL_OPERATION, "Failed mm_sound_focus_is_cb_thread() err:0x%x", ret);
- }
-
- if (!is_focus_cb_thread)
- __lockFocusCBMutex();
-
- if (__mAcquiredFocus == FOCUS_NONE) {
- AUDIO_IO_LOGW("Focus was already released, skip it...");
- if (!is_focus_cb_thread)
- __unlockFocusCBMutex();
- __unlockFocusIdMutex();
- return;
- }
-
- if (__mMultimediaSession == MM_SESSION_TYPE_MEDIA)
- 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, (mm_sound_focus_type_e)__mAcquiredFocus, "audio-io release focus");
- if (ret != MM_ERROR_NONE) {
- if (!is_focus_cb_thread)
- __unlockFocusCBMutex();
- __unlockFocusIdMutex();
- 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);
-
- if (!is_focus_cb_thread)
- __unlockFocusCBMutex();
- }
- __unlockFocusIdMutex();
- }
-}
-
-void CAudioSessionHandler::disableSessionHandler() {
- CAudioSessionHandler::updateStop();
- CAudioSessionHandler::unregisterSound();
-
- CAudioSessionHandler::__mUseFocus = false;
-}
-
-/**
- * class IAudioSessionEventListener
- */
-IAudioSessionEventListener::EInterruptCode IAudioSessionEventListener::convertInterruptedCode(int code, const char *reason_for_change) {
- EInterruptCode e = EInterruptCode::INTERRUPT_BY_MEDIA;
-
- switch (code) {
- case FOCUS_IS_ACQUIRED:
- e = EInterruptCode::INTERRUPT_COMPLETED;
- break;
-
- case FOCUS_IS_RELEASED:
- if (!strcmp(reason_for_change, "media")) e = EInterruptCode::INTERRUPT_BY_MEDIA;
- if (!strcmp(reason_for_change, "radio")) e = EInterruptCode::INTERRUPT_BY_MEDIA;
- if (!strcmp(reason_for_change, "loopback")) e = EInterruptCode::INTERRUPT_BY_MEDIA;
- if (!strcmp(reason_for_change, "system")) e = EInterruptCode::INTERRUPT_BY_MEDIA;
- if (!strcmp(reason_for_change, "alarm")) e = EInterruptCode::INTERRUPT_BY_ALARM;
- if (!strcmp(reason_for_change, "notification")) e = EInterruptCode::INTERRUPT_BY_NOTIFICATION;
- if (!strcmp(reason_for_change, "emergency")) e = EInterruptCode::INTERRUPT_BY_EMERGENCY;
- if (!strcmp(reason_for_change, "voice-information")) e = EInterruptCode::INTERRUPT_BY_MEDIA;
- if (!strcmp(reason_for_change, "voice-recognition")) e = EInterruptCode::INTERRUPT_BY_MEDIA;
- if (!strcmp(reason_for_change, "voice-recognition-service")) e = EInterruptCode::INTERRUPT_BY_MEDIA;
- if (!strcmp(reason_for_change, "ringtone-voip")) e = EInterruptCode::INTERRUPT_BY_CALL;
- if (!strcmp(reason_for_change, "ringtone-call")) e = EInterruptCode::INTERRUPT_BY_CALL;
- if (!strcmp(reason_for_change, "voip")) e = EInterruptCode::INTERRUPT_BY_CALL;
- if (!strcmp(reason_for_change, "call-voice")) e = EInterruptCode::INTERRUPT_BY_CALL;
- if (!strcmp(reason_for_change, "call-video")) e = EInterruptCode::INTERRUPT_BY_CALL;
- break;
- }
-
- return e;
-}