focus_type_e request_type;
void *callback;
void *cbdata;
+ bool reacquisition;
bool is_for_session; /* will be removed when the session concept is completely left out*/
} _mm_sound_mgr_focus_param_t;
_focus_taken_by_id_t taken_by_id[NUM_OF_STREAM_IO_TYPE];
void *callback;
void *cbdata;
+ bool reacquisition;
bool is_for_session; /* will be removed when the session concept is completely left out*/
int MMSoundMgrFocusFini(void);
int mm_sound_mgr_focus_create_node (const _mm_sound_mgr_focus_param_t *param);
int mm_sound_mgr_focus_destroy_node (const _mm_sound_mgr_focus_param_t *param);
+int mm_sound_mgr_focus_set_reacquisition (const _mm_sound_mgr_focus_param_t *param);
int mm_sound_mgr_focus_request_acquire (const _mm_sound_mgr_focus_param_t *param);
int mm_sound_mgr_focus_request_release (const _mm_sound_mgr_focus_param_t *param);
int mm_sound_mgr_focus_set_watch_cb (const _mm_sound_mgr_focus_param_t *param);
//int __mm_sound_mgr_ipc_destroy_focus_node(mm_ipc_msg_t *msg);
int __mm_sound_mgr_focus_ipc_unregister_focus(int pid, int handle_id);
+int __mm_sound_mgr_focus_ipc_set_focus_reacquisition(int pid, int handle_id, bool reacquisition);
+
int __mm_sound_mgr_focus_ipc_acquire_focus(int pid, int handle_id, int focus_type, const char* name );
int __mm_sound_mgr_focus_ipc_release_focus(int pid, int handle_id, int focus_type, const char* name);
int taken_pid = 0;
int taken_hid = 0;
int ret_handle = -1;
- bool auto_reacquire = true;
bool taken_by_session = false;
focus_cb_data cb_data;
goto fail;
}
ret_handle = (int)(ret & 0x0000ffff);
- auto_reacquire = (bool)((ret >> 16) & 0xf);
+ victim_node->reacquisition= (bool)((ret >> 16) & 0xf);
}
g_free(filename2);
filename2 = NULL;
}
//debug_log("[RETCB] Return value 0x%x\n", buf);
- if (auto_reacquire) {
- /* update victim node */
- if (command == FOCUS_COMMAND_RELEASE) {
- taken_pid = assaulter_param->pid;
- taken_hid = assaulter_param->handle_id;
- taken_by_session = assaulter_param->is_for_session;
- flag_for_taken_index = assaulter_param->request_type & victim_node->status;
- } else {
- taken_pid = 0;
- taken_hid = 0;
- taken_by_session = false;
- flag_for_taken_index = assaulter_param->request_type;
- }
+ /* update victim node */
+ if (command == FOCUS_COMMAND_RELEASE) {
+ taken_pid = assaulter_param->pid;
+ taken_hid = assaulter_param->handle_id;
+ taken_by_session = assaulter_param->is_for_session;
+ flag_for_taken_index = assaulter_param->request_type & victim_node->status;
+ } else {
+ taken_pid = 0;
+ taken_hid = 0;
+ taken_by_session = false;
+ flag_for_taken_index = assaulter_param->request_type;
+ }
- for (i = 0; i < NUM_OF_STREAM_IO_TYPE; i++) {
- if (flag_for_taken_index & (i+1)) {
- if (command == FOCUS_COMMAND_ACQUIRE && (victim_node->taken_by_id[i].pid != assaulter_param->pid || (victim_node->taken_by_id[i].handle_id != assaulter_param->handle_id && !(victim_node->taken_by_id[i].by_session & assaulter_param->is_for_session)))) {
- /* skip */
- debug_error("skip updating victim node");
- continue;
+ for (i = 0; i < NUM_OF_STREAM_IO_TYPE; i++) {
+ if (flag_for_taken_index & (i+1)) {
+ if (command == FOCUS_COMMAND_ACQUIRE && (victim_node->taken_by_id[i].pid != assaulter_param->pid || (victim_node->taken_by_id[i].handle_id != assaulter_param->handle_id && !(victim_node->taken_by_id[i].by_session & assaulter_param->is_for_session)))) {
+ /* skip */
+ debug_error("skip updating victim node");
+ continue;
+ }
+ if (!victim_node->reacquisition) {
+ GList *list = NULL;
+ focus_node_t *node = NULL;
+ for (list = g_focus_node_list; list != NULL; list = list->next) {
+ node = (focus_node_t *)list->data;
+ if (node && (node->taken_by_id[i].pid == victim_node->pid)) {
+ UPDATE_FOCUS_TAKEN_INFO(node, taken_pid, taken_hid, taken_by_session);
+ } else if (!list->next) {
+ UPDATE_FOCUS_TAKEN_INFO(victim_node, 0, 0, false);
+ }
}
+ } else {
UPDATE_FOCUS_TAKEN_INFO(victim_node, taken_pid, taken_hid, taken_by_session);
}
}
}
+
if (ret_handle == victim_node->handle_id) {
/* return from client is success, ret_handle will be its handle_id */
victim_node->status = (command == FOCUS_COMMAND_RELEASE) ? (victim_node->status & ~(cb_data.type)) : (victim_node->status | cb_data.type);
return ret;
}
+int mm_sound_mgr_focus_set_reacquisition (const _mm_sound_mgr_focus_param_t *param)
+{
+ int ret = MM_ERROR_NONE;
+ GList *list = NULL;
+ focus_node_t *node = NULL;
+ focus_node_t *my_node = NULL;
+
+ debug_fenter();
+
+ MMSOUND_ENTER_CRITICAL_SECTION_WITH_RETURN(&g_focus_node_list_mutex, MM_ERROR_SOUND_INTERNAL);
+
+ /* Update list for dead process */
+ g_list_foreach (g_focus_node_list, (GFunc)_clear_focus_node_list_func, NULL);
+
+ /* Find node to set reacquisition */
+ for (list = g_focus_node_list; list != NULL; list = list->next) {
+ node = (focus_node_t *)list->data;
+ if (node && !node->is_for_watch && (node->pid == param->pid) && (node->handle_id == param->handle_id)) {
+ node->reacquisition = param->reacquisition;
+ my_node = node;
+ break;
+ }
+ }
+
+ /* Append my node's taken info to my victim node */
+ if(!param->reacquisition) {
+ int i;
+ for (list = g_focus_node_list; list != NULL; list = list->next) {
+ node = (focus_node_t *)list->data;
+ for (i = 0; i < NUM_OF_STREAM_IO_TYPE; i++) {
+ if (node && (node->taken_by_id[i].pid == param->pid)) {
+ if (my_node->taken_by_id[i].pid) {
+ UPDATE_FOCUS_TAKEN_INFO(node, my_node->taken_by_id[i].pid, my_node->taken_by_id[i].handle_id, my_node->taken_by_id[i].by_session);
+ }
+ } else if (!list->next) {
+ UPDATE_FOCUS_TAKEN_INFO(my_node, 0, 0, false);
+ }
+ }
+ }
+ }
+
+ _mm_sound_mgr_focus_list_dump();
+ MMSOUND_LEAVE_CRITICAL_SECTION(&g_focus_node_list_mutex);
+
+ debug_fleave();
+ return ret;
+}
+
int mm_sound_mgr_focus_request_acquire (const _mm_sound_mgr_focus_param_t *param)
{
int ret = MM_ERROR_NONE;
" <arg name='handle_id' type='i' direction='in'/>"
" <arg name='is_for_session' type='b' direction='in'/>"
" </method>"
+ " <method name='SetFocusReacquisition'>"
+ " <arg name='pid' type='i' direction='in'/>"
+ " <arg name='handle_id' type='i' direction='in'/>"
+ " <arg name='reacquisition' type='b' direction='in'/>"
+ " </method>"
" <method name='AcquireFocus'>"
" <arg name='pid' type='i' direction='in'/>"
" <arg name='handle_id' type='i' direction='in'/>"
static void handle_method_get_unique_id(GDBusMethodInvocation* invocation);
static void handle_method_register_focus(GDBusMethodInvocation* invocation);
static void handle_method_unregister_focus(GDBusMethodInvocation* invocation);
+static void handle_method_set_focus_reacquisition(GDBusMethodInvocation* invocation);
static void handle_method_acquire_focus(GDBusMethodInvocation* invocation);
static void handle_method_release_focus(GDBusMethodInvocation* invocation);
static void handle_method_watch_focus(GDBusMethodInvocation* invocation);
},
.handler = handle_method_unregister_focus
},
+ [METHOD_CALL_SET_FOCUS_REACQUISITION] = {
+ .info = {
+ .name = "SetFocusReacquisition",
+ },
+ .handler = handle_method_set_focus_reacquisition
+ },
[METHOD_CALL_ACQUIRE_FOCUS] = {
.info = {
.name = "AcquireFocus",
debug_fleave();
}
+static void handle_method_set_focus_reacquisition(GDBusMethodInvocation* invocation)
+{
+ int ret = MM_ERROR_NONE;
+ int pid = 0, handle_id = 0;
+ gboolean reacquisition;
+ GVariant *params = NULL;
+
+ debug_fenter();
+
+ if (!(params = g_dbus_method_invocation_get_parameters(invocation))) {
+ debug_error("Parameter for Method is NULL");
+ ret = MM_ERROR_SOUND_INTERNAL;
+ goto send_reply;
+ }
+
+ g_variant_get(params, "(iib)", &pid, &handle_id, &reacquisition);
+ ret = __mm_sound_mgr_focus_ipc_set_focus_reacquisition(_get_sender_pid(invocation), handle_id, reacquisition);
+
+send_reply:
+ if (ret == MM_ERROR_NONE) {
+ _method_call_return_value(invocation, g_variant_new("()"));
+ } else {
+ _method_call_return_error(invocation, ret);
+ }
+
+ debug_fleave();
+}
+
static void handle_method_acquire_focus(GDBusMethodInvocation* invocation)
{
int ret = MM_ERROR_NONE;
}
// method -> callback
+int __mm_sound_mgr_focus_ipc_set_focus_reacquisition(int pid, int handle_id, bool reacquisition)
+{
+ _mm_sound_mgr_focus_param_t param;
+ int ret = MM_ERROR_NONE;
+
+ memset(¶m, 0x00, sizeof(_mm_sound_mgr_focus_param_t));
+ param.pid = pid;
+ param.handle_id = handle_id;
+ param.reacquisition = reacquisition;
+
+ ret = mm_sound_mgr_focus_set_reacquisition(¶m);
+
+ return ret;
+}
+
+// method -> callback
int __mm_sound_mgr_focus_ipc_acquire_focus(int pid, int handle_id, int focus_type, const char* name )
{
_mm_sound_mgr_focus_param_t param;
#ifdef USE_FOCUS
int mm_sound_client_dbus_register_focus(int id, int instance, const char *stream_type, mm_sound_focus_changed_cb callback, bool is_for_session, void* user_data);
int mm_sound_client_dbus_unregister_focus(int instance, int id, bool is_for_session);
+int mm_sound_client_dbus_set_foucs_reacquisition(int instance, int id, bool reacquisition);
int mm_sound_client_dbus_acquire_focus(int instance, int id, mm_sound_focus_type_e type, const char *option, bool is_for_session);
int mm_sound_client_dbus_release_focus(int instance, int id, mm_sound_focus_type_e type, const char *option, bool is_for_session);
int mm_sound_client_dbus_set_focus_watch_callback(int instance, int handle, mm_sound_focus_type_e type, mm_sound_focus_changed_watch_cb callback, bool is_for_session, void *user_data);
METHOD_CALL_GET_UNIQUE_ID,
METHOD_CALL_REGISTER_FOCUS,
METHOD_CALL_UNREGISTER_FOCUS,
+ METHOD_CALL_SET_FOCUS_REACQUISITION,
METHOD_CALL_ACQUIRE_FOCUS,
METHOD_CALL_RELEASE_FOCUS,
METHOD_CALL_WATCH_FOCUS,
int mm_sound_client_set_focus_reacquisition(int id, bool reacquisition)
{
int ret = MM_ERROR_NONE;
+ int instance;
int index = -1;
+ bool result;
debug_fenter();
debug_error("Could not find index");
return MM_ERROR_INVALID_ARGUMENT;
}
+ instance = g_focus_sound_handle[index].focus_tid;
+
+ ret = mm_sound_client_is_focus_cb_thread(g_thread_self(), &result);
+ if (ret) {
+ debug_error("[Client] mm_sound_client_is_focus_cb_thread failed");
+ goto cleanup;
+ } else if (!result) {
+ ret = mm_sound_client_dbus_set_foucs_reacquisition(instance, id, reacquisition);
+ if (ret == MM_ERROR_NONE) {
+ debug_msg("[Client] Success to set focus reacquisition\n");
+ } else {
+ debug_error("[Client] Error occurred : %d \n",ret);
+ goto cleanup;
+ }
+ } else {
+ debug_warning("[Client] Inside the focus cb thread, bypassing dbus method call");
+ }
g_focus_sound_handle[index].auto_reacquire = reacquisition;
- debug_fleave();
+cleanup:
+ debug_fleave();
return ret;
}
*reacquisition = g_focus_sound_handle[index].auto_reacquire;
debug_fleave();
-
return ret;
}
[METHOD_CALL_UNREGISTER_FOCUS] = {
.name = "UnregisterFocus",
},
+ [METHOD_CALL_SET_FOCUS_REACQUISITION] = {
+ .name = "SetFocusReacquisition",
+ },
[METHOD_CALL_ACQUIRE_FOCUS] = {
.name = "AcquireFocus",
},
return ret;
}
+int mm_sound_client_dbus_set_foucs_reacquisition(int instance, int id, bool reacquisition)
+{
+ int ret = MM_ERROR_NONE;
+ GVariant* params = NULL, *result = NULL;
+
+ debug_fenter();
+
+ params = g_variant_new("(iib)", instance, id, reacquisition);
+ if (params) {
+ if ((ret = _dbus_method_call_to(DBUS_TO_FOCUS_SERVER, METHOD_CALL_SET_FOCUS_REACQUISITION, params, &result)) != MM_ERROR_NONE) {
+ debug_error("dbus set focus reacquisition failed");
+ }
+ } else {
+ debug_error("Construct Param for method call failed");
+ }
+
+ if (ret != MM_ERROR_NONE)
+ g_variant_get(result, "(i)", &ret);
+ if (result)
+ g_variant_unref(result);
+
+ debug_fleave();
+ return ret;
+}
+
int mm_sound_client_dbus_acquire_focus(int instance, int id, mm_sound_focus_type_e type, const char *option, bool is_for_session)
{
int ret = MM_ERROR_NONE;
Name: libmm-sound
Summary: MMSound Package contains client lib and sound_server binary
-Version: 0.9.273
+Version: 0.9.274
Release: 0
Group: System/Libraries
License: Apache-2.0