return _convert_sound_manager_error_code(__func__, MM_ERROR_POLICY_INTERNAL);
}
- if (is_focus_cb_thread && (stream_h->prev_acquired_focus & focus_mask)) {
- LOGE("invalid state: focus_mask[0x%x], prev_acquired_focus[0x%x]", focus_mask, stream_h->prev_acquired_focus);
- return _convert_sound_manager_error_code(__func__, MM_ERROR_SOUND_INVALID_STATE);
- }
-
if (stream_h->acquired_focus & focus_mask) {
LOGE("invalid state: focus_mask[0x%x], acquired_focus[0x%x]", focus_mask, stream_h->acquired_focus);
return _convert_sound_manager_error_code(__func__, MM_ERROR_SOUND_INVALID_STATE);
}
+ if (is_focus_cb_thread && ((stream_h->prev_acquired_focus | ~stream_h->acquired_focus) & SOUND_STREAM_FOCUS_FOR_BOTH) != focus_mask) {
+ LOGE("just lost focus in this callback, it is not allowed to acquire the focus[0x%x] again. acquired_focus[0x%x], prev[0x%x]",
+ focus_mask, stream_h->acquired_focus, stream_h->prev_acquired_focus);
+ return _convert_sound_manager_error_code(__func__, MM_ERROR_POLICY_INTERNAL);
+ }
+
ret = mm_sound_acquire_focus_with_option(stream_h->index, (mm_sound_focus_type_e)focus_mask, sound_behavior, extra_info);
if (ret == MM_ERROR_NONE) {
stream_h->acquired_focus |= focus_mask;
_update_focus_status(stream_h->index, (unsigned int)stream_h->acquired_focus);
}
+ LOGI("acquired_focus[0x%x], prev[0x%x]", stream_h->acquired_focus, stream_h->prev_acquired_focus);
+
return _convert_sound_manager_error_code(__func__, ret);
}
if ((ret = mm_sound_focus_is_cb_thread(&is_focus_cb_thread)))
return _convert_sound_manager_error_code(__func__, ret);
- if (is_focus_cb_thread && !(stream_h->prev_acquired_focus & focus_mask)) {
- LOGE("invalid state: focus_mask[0x%x], prev_acquired_focus[0x%x]", focus_mask, stream_h->prev_acquired_focus);
+ if (!(stream_h->acquired_focus & focus_mask)) {
+ LOGE("invalid state: focus_mask[0x%x], acquired_focus[0x%x]", focus_mask, stream_h->acquired_focus);
return _convert_sound_manager_error_code(__func__, MM_ERROR_SOUND_INVALID_STATE);
}
- if (!(stream_h->acquired_focus & focus_mask)) {
- LOGE("invalid state: focus_mask[0x%x], acquired_focus[0x%x]", focus_mask, stream_h->acquired_focus);
+ if (is_focus_cb_thread && ((stream_h->prev_acquired_focus & stream_h->acquired_focus) != focus_mask)) {
+ LOGE("just acquired focus in this callback, it is not allowed to release the focus[0x%x] again. acquired_focus[0x%x], prev[0x%x]",
+ focus_mask, stream_h->acquired_focus, stream_h->prev_acquired_focus);
return _convert_sound_manager_error_code(__func__, MM_ERROR_SOUND_INVALID_STATE);
}
_update_focus_status(stream_h->index, (unsigned int)stream_h->acquired_focus);
}
+ LOGI("acquired_focus[0x%x], prev[0x%x]", stream_h->acquired_focus, stream_h->prev_acquired_focus);
+
return _convert_sound_manager_error_code(__func__, ret);
}
{
int ret = MM_ERROR_NONE;
int focus_mask = SOUND_STREAM_FOCUS_FOR_BOTH;
+ bool is_focus_cb_thread = false;
sound_stream_info_s *stream_h = (sound_stream_info_s*)stream_info;
LOGI(">> enter");
SM_INSTANCE_CHECK(stream_h);
+ if ((ret = mm_sound_focus_is_cb_thread(&is_focus_cb_thread)))
+ return _convert_sound_manager_error_code(__func__, ret);
+
if (stream_h->is_focus_unavailable) {
LOGE("acquiring focus is not allowed for this stream type(%s)", stream_h->stream_type);
return _convert_sound_manager_error_code(__func__, MM_ERROR_POLICY_INTERNAL);
return _convert_sound_manager_error_code(__func__, MM_ERROR_POLICY_INTERNAL);
}
- if ((stream_h->acquired_focus & focus_mask) || (stream_h->prev_acquired_focus & focus_mask)) {
- LOGE("invalid state : focus_mask[0x%x], acquired_focus[0x%x], prev[0x%x]",
- focus_mask, stream_h->acquired_focus, stream_h->prev_acquired_focus);
- return _convert_sound_manager_error_code(__func__, MM_ERROR_SOUND_INVALID_STATE);
+ if (is_focus_cb_thread && (stream_h->prev_acquired_focus > stream_h->acquired_focus)) {
+ LOGE("just lost focus in this callback, it is not allowed to acquire all again. acquired_focus[0x%x], prev[0x%x]",
+ stream_h->acquired_focus, stream_h->prev_acquired_focus);
+ return _convert_sound_manager_error_code(__func__, MM_ERROR_POLICY_INTERNAL);
}
focus_mask = SOUND_STREAM_FOCUS_FOR_BOTH & ~(stream_h->acquired_focus);
int sound_manager_release_focus_all(sound_stream_info_h stream_info, int sound_behavior, const char *extra_info)
{
int ret = MM_ERROR_NONE;
+ bool is_focus_cb_thread = false;
sound_stream_info_s *stream_h = (sound_stream_info_s*)stream_info;
LOGI(">> enter");
SM_INSTANCE_CHECK(stream_h);
+ if ((ret = mm_sound_focus_is_cb_thread(&is_focus_cb_thread)))
+ return _convert_sound_manager_error_code(__func__, ret);
+
+ if (is_focus_cb_thread && (stream_h->prev_acquired_focus < stream_h->acquired_focus)) {
+ LOGE("just acquired focus in this callback, it is not allowed to release all again. acquired_focus[0x%x], prev[0x%x]",
+ stream_h->acquired_focus, stream_h->prev_acquired_focus);
+ return _convert_sound_manager_error_code(__func__, MM_ERROR_POLICY_INTERNAL);
+ }
+
if (!stream_h->acquired_focus) {
LOGI("PLAYBACK/RECORDING focuses have already been RELEASED");
return SOUND_MANAGER_ERROR_NONE;