mm_sound_focus_changed_cb focus_callback;
mm_sound_focus_changed_watch_cb watch_callback;
void* user_data;
+ bool unset_watch_callback_requested;
bool is_for_session; /* will be removed when the session concept is completely left out*/
} focus_sound_info_t;
tid, cb_data.handle, cb_data.type, cb_data.state, cb_data.stream_type);
if (focus_handle->watch_callback == NULL) {
- debug_msg("watch callback is null..");
- } else {
- debug_msg("[CALLBACK(%p) START]", focus_handle->watch_callback);
- (focus_handle->watch_callback)(cb_data.handle, cb_data.type, cb_data.state, cb_data.stream_type,
- cb_data.ext_info, focus_handle->user_data);
- debug_msg("[CALLBACK END]");
- if (g_focus_session_interrupt_info.user_cb) {
- debug_msg("sending session interrupt callback(%p)", g_focus_session_interrupt_info.user_cb);
- (g_focus_session_interrupt_info.user_cb)(cb_data.state, cb_data.stream_type, true,
- g_focus_session_interrupt_info.user_data);
- }
+ debug_warning("watch callback is null..");
+ goto SKIP_CB_AND_RET;
+ }
+ if (focus_handle->unset_watch_callback_requested == true) {
+ debug_warning("unset_watch_callback_requested..");
+ goto SKIP_CB_AND_RET;
+ }
+
+ debug_msg("[CALLBACK(%p) START]", focus_handle->watch_callback);
+ (focus_handle->watch_callback)(cb_data.handle, cb_data.type, cb_data.state, cb_data.stream_type,
+ cb_data.ext_info, focus_handle->user_data);
+ debug_msg("[CALLBACK END]");
+ if (g_focus_session_interrupt_info.user_cb) {
+ debug_msg("sending session interrupt callback(%p)", g_focus_session_interrupt_info.user_cb);
+ (g_focus_session_interrupt_info.user_cb)(cb_data.state, cb_data.stream_type, true,
+ g_focus_session_interrupt_info.user_data);
}
SKIP_CB_AND_RET:
g_focus_sound_handle[index].watch_callback = callback;
g_focus_sound_handle[index].user_data = user_data;
g_focus_sound_handle[index].is_for_session = is_for_session;
+ g_focus_sound_handle[index].unset_watch_callback_requested = false;
ret = mm_sound_proxy_set_focus_watch_callback(pid, g_focus_sound_handle[index].handle, focus_type,
callback, is_for_session, user_data);
return ret;
}
+int mm_sound_client_request_unset_focus_watch_callback(int id)
+{
+ int ret = MM_ERROR_NONE;
+ int index = -1;
+
+ debug_fenter();
+ MMSOUND_ENTER_CRITICAL_SECTION_WITH_RETURN(&g_index_mutex, MM_ERROR_SOUND_INTERNAL);
+
+ index = _focus_watch_find_index_by_handle(id);
+ if (index == -1) {
+ debug_error("Could not find index");
+ ret = MM_ERROR_INVALID_ARGUMENT;
+ goto cleanup;
+ }
+ g_focus_sound_handle[index].unset_watch_callback_requested = true;
+
+cleanup:
+ MMSOUND_LEAVE_CRITICAL_SECTION(&g_index_mutex);
+ debug_fleave();
+ return ret;
+}
+
int mm_sound_client_unset_focus_watch_callback(int id)
{
int ret = MM_ERROR_NONE;
int index = -1;
+
debug_fenter();
MMSOUND_ENTER_CRITICAL_SECTION_WITH_RETURN(&g_index_mutex, MM_ERROR_SOUND_INTERNAL);
return MM_ERROR_INVALID_ARGUMENT;
}
+ if ((ret = mm_sound_client_request_unset_focus_watch_callback(id))) {
+ debug_error("failed to mm_sound_client_request_unset_focus_watch_callback, ret[0x%x]\n", ret);
+ return ret;
+ }
+
mm_sound_client_is_focus_cb_thread(g_thread_self(), &result);
if (!result) {
if ((ret = mm_sound_client_unset_focus_watch_callback(id)))
debug_error("Could not unset focus watch callback, id(%d), ret[0x%x]\n", id, ret);
} else {
ret = mm_sound_client_execute_focus_func_in_main_context(IDLE_EVENT_TYPE_UNSET_FOCUS_WATCH_CB, id);
+ debug_msg("mm_sound_client_execute_focus_func_in_main_context() is called, id(%d), ret[0x%x]\n", id, ret);
}
debug_fleave();