x_node->taken_##x_postfix[i].by_session = x_by_session; \
} while (0)
-#define CHECK_MY_NODE(x_node, x_param) \
- (x_node && !x_node->is_for_watch && (x_node->pid == x_param->pid) && (x_node->handle_id == x_param->handle_id) && (x_node->is_for_session == x_param->is_for_session))
+#define CONTINUE_IF_LIST_DATA_IS_NULL(x_node, x_list) \
+ if (!((x_node) = (focus_node_t *)(x_list)->data)) \
+ continue; \
+
+#define CONTINUE_IF_NOT_MY_FOCUS_NODE(x_node, x_param) \
+ if ((x_node)->is_for_watch || ((x_node)->pid != (x_param)->pid) || ((x_node)->handle_id != (x_param)->handle_id) || \
+ ((x_node)->is_for_session != (x_param)->is_for_session)) \
+ continue; \
static char* __get_focus_pipe_path(int instance_id, int handle, const char* postfix, bool is_watch)
{
}
for (list = g_focus_node_list; list != NULL; list = list->next) {
- if (!(node = (focus_node_t *)list->data))
- continue;
+ CONTINUE_IF_LIST_DATA_IS_NULL(node, list);
if (node == my_node)
continue;
if (!node->is_for_watch || !node->is_for_monitor || !node->is_for_session)
}
for (list = g_focus_node_list; list != NULL; list = list->next) {
- if (!(node = (focus_node_t *)list->data))
- continue;
+ CONTINUE_IF_LIST_DATA_IS_NULL(node, list);
if (!node->is_for_watch || !node->is_for_monitor || !node->is_for_session)
continue;
if (node == my_node || !(node->pid == my_node->pid && my_node->is_for_session))
}
for (list = g_focus_node_list; list != NULL; list = list->next) {
- if (!(node = (focus_node_t *)list->data))
- continue;
+ CONTINUE_IF_LIST_DATA_IS_NULL(node, list);
if (node == my_node || (node->pid == my_node->pid && node->is_for_session && my_node->is_for_session))
continue;
if (!node->is_for_watch || !(node->status & focus_type))
if (reacquisition_changed) {
if (!victim_node->reacquisition) {
for (list = g_focus_node_list; list != NULL; list = list->next) {
- if (!(node = (focus_node_t *)list->data))
- continue;
+ CONTINUE_IF_LIST_DATA_IS_NULL(node, list);
if (node->taken_by_id[i].pid == victim_node->pid) {
UPDATE_FOCUS_TAKEN_INFO(backup, node, node->taken_by_id[i].pid, node->taken_by_id[i].handle_id, node->taken_by_id[i].by_session);
UPDATE_FOCUS_TAKEN_INFO(by_id, node, taken_pid, taken_hid, taken_by_session);
}
} else {
for (list = g_focus_node_list; list != NULL; list = list->next) {
- if (!(node = (focus_node_t *)list->data))
- continue;
+ CONTINUE_IF_LIST_DATA_IS_NULL(node, list);
if (node->taken_backup[i].pid == victim_node->pid) {
UPDATE_FOCUS_TAKEN_INFO(by_id, node, node->taken_backup[i].pid, node->taken_backup[i].handle_id, node->taken_backup[i].by_session);
UPDATE_FOCUS_TAKEN_INFO(backup, node, 0, 0, false);
g_list_foreach (g_focus_node_list, (GFunc)_clear_focus_node_list_func, NULL);
for (list = g_focus_node_list; list != NULL; list = list->next) {
- node = (focus_node_t *)list->data;
- if (CHECK_MY_NODE(node, param)) {
- debug_error("the node of pid[%d]/handle_id[%d] is already created\n", param->pid, param->handle_id);
- ret = MM_ERROR_INVALID_ARGUMENT;
- goto FINISH;
- }
+ CONTINUE_IF_LIST_DATA_IS_NULL(node, list);
+ CONTINUE_IF_NOT_MY_FOCUS_NODE(node, param);
+
+ debug_error("the node of pid[%d]/handle_id[%d] is already created\n", param->pid, param->handle_id);
+ ret = MM_ERROR_INVALID_ARGUMENT;
+ goto FINISH;
}
/* get priority from stream type */
g_list_foreach (g_focus_node_list, (GFunc)_clear_focus_node_list_func, NULL);
for (list = g_focus_node_list; list != NULL; list = list->next) {
- node = (focus_node_t *)list->data;
- if (CHECK_MY_NODE(node, param)) {
- debug_log("found the node of pid[%d]/handle_id[%d]\n", param->pid, param->handle_id);
- my_node = node;
- break;
- }
+ CONTINUE_IF_LIST_DATA_IS_NULL(node, list);
+ CONTINUE_IF_NOT_MY_FOCUS_NODE(node, param);
+
+ debug_log("found the node of pid[%d]/handle_id[%d]\n", param->pid, param->handle_id);
+ my_node = node;
+ break;
}
if (my_node == NULL) {
debug_error("could not find any node of pid[%d]/handle_id[%d]/is_for_session[%d]\n", param->pid, param->handle_id, param->is_for_session);
/* Check if there's remaining focus for session for the same PID of incomming param */
if (my_node->is_for_session) {
for (list = g_focus_node_list; list != NULL; list = list->next) {
- if (!(node = (focus_node_t *)list->data))
- continue;
+ CONTINUE_IF_LIST_DATA_IS_NULL(node, list);
if (my_node == node || node->is_for_watch)
continue;
if (node->pid == my_node->pid && node->is_for_session && node->status) {
MMSOUND_STRNCPY(new_param->ext_info, my_node->ext_info[i], MM_SOUND_NAME_NUM);
for (list = g_focus_node_list; list != NULL; list = list->next) {
- if (!(node = (focus_node_t *)list->data))
- continue;
+ CONTINUE_IF_LIST_DATA_IS_NULL(node, list);
if (my_node == node || node->is_for_watch)
continue;
for (i = 0; i < NUM_OF_STREAM_IO_TYPE; i++) {
- if (node->taken_by_id[i].pid == param->pid) {
- if (my_node->taken_by_id[i].pid) {
- /* If exists update the taken focus info to my victim node */
- if (node->taken_by_id[i].by_session && !node->status) {
- UPDATE_FOCUS_TAKEN_INFO(by_id, 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 (node->taken_by_id[i].handle_id == param->handle_id) {
- UPDATE_FOCUS_TAKEN_INFO(by_id, node, my_node->taken_by_id[i].pid, my_node->taken_by_id[i].handle_id, false);
- }
- } else if (my_node->status & (i+1)) {
- if (node->is_for_session)
- continue;
- if (node->taken_by_id[i].handle_id == new_param->handle_id || node->taken_by_id[i].by_session) {
- /* do callback for resumption */
- if ((ret = _mm_sound_mgr_focus_do_callback(FOCUS_COMMAND_ACQUIRE, node, new_param)))
- debug_error("Fail to _focus_do_callback for COMMAND ACQUIRE to node[%x], ret[0x%x]\n", node, ret);
- if (!strncmp(my_node->stream_type, node->stream_type, MAX_STREAM_TYPE_LEN)) {
- need_to_trigger_watch_cb = false;
- my_node->status &= ~(new_param->request_type);
- }
+ if (node->taken_by_id[i].pid != param->pid)
+ continue;
+
+ if (my_node->taken_by_id[i].pid) {
+ /* If exists update the taken focus info to my victim node */
+ if (node->taken_by_id[i].by_session && !node->status) {
+ UPDATE_FOCUS_TAKEN_INFO(by_id, 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 (node->taken_by_id[i].handle_id == param->handle_id) {
+ UPDATE_FOCUS_TAKEN_INFO(by_id, node, my_node->taken_by_id[i].pid, my_node->taken_by_id[i].handle_id, false);
+ }
+ } else if (my_node->status & (i+1)) {
+ if (node->is_for_session)
+ continue;
+ if (node->taken_by_id[i].handle_id == new_param->handle_id || node->taken_by_id[i].by_session) {
+ /* do callback for resumption */
+ if ((ret = _mm_sound_mgr_focus_do_callback(FOCUS_COMMAND_ACQUIRE, node, new_param)))
+ debug_error("Fail to _focus_do_callback for COMMAND ACQUIRE to node[%x], ret[0x%x]\n", node, ret);
+ if (!strncmp(my_node->stream_type, node->stream_type, MAX_STREAM_TYPE_LEN)) {
+ need_to_trigger_watch_cb = false;
+ my_node->status &= ~(new_param->request_type);
}
}
}
/* Find node to set reacquisition */
for (list = g_focus_node_list; list != NULL; list = list->next) {
- node = (focus_node_t *)list->data;
- if (CHECK_MY_NODE(node, param)) {
- if (node->reacquisition == param->reacquisition) {
- debug_msg("it is already set as same value of reacquisition(%d)\n", param->reacquisition);
- goto FINISH;
- }
- node->reacquisition = param->reacquisition;
- debug_msg("found a node(pid[%d]/handle_id[%d]) to set reacquisition to (%d)\n", node->pid, node->handle_id, param->reacquisition);
- my_node = node;
- break;
+ CONTINUE_IF_LIST_DATA_IS_NULL(node, list);
+ CONTINUE_IF_NOT_MY_FOCUS_NODE(node, param);
+
+ if (node->reacquisition == param->reacquisition) {
+ debug_msg("it is already set as same value of reacquisition(%d)\n", param->reacquisition);
+ goto FINISH;
}
+ node->reacquisition = param->reacquisition;
+ debug_msg("found a node(pid[%d]/handle_id[%d]) to set reacquisition to (%d)\n", node->pid, node->handle_id, param->reacquisition);
+ my_node = node;
+ break;
}
if (my_node == NULL) {
debug_error("could not find any node of pid[%d]/handle_id[%d]\n", param->pid, param->handle_id);
if (!param->reacquisition) {
for (list = g_focus_node_list; list != NULL; list = list->next) {
- if (!(node = (focus_node_t *)list->data))
- continue;
+ CONTINUE_IF_LIST_DATA_IS_NULL(node, list);
for (i = 0; i < NUM_OF_STREAM_IO_TYPE; i++) {
if (node->taken_by_id[i].pid == param->pid) {
/* victim node : append my node's taken info to my victim node */
}
} else {
for (list = g_focus_node_list; list != NULL; list = list->next) {
- if (!(node = (focus_node_t *)list->data))
- continue;
+ CONTINUE_IF_LIST_DATA_IS_NULL(node, list);
for (i = 0; i < NUM_OF_STREAM_IO_TYPE; i++) {
/* rollback and reset backup info. */
if (node->taken_by_id[i].pid && (node->taken_by_id[i].pid == my_node->taken_backup[i].pid)) {
/* Find node to set reacquisition */
for (list = g_focus_node_list; list != NULL; list = list->next) {
- if (!(node = (focus_node_t *)list->data))
- continue;
+ CONTINUE_IF_LIST_DATA_IS_NULL(node, list);
if (!node->is_for_watch && (node->status & focus_type)) {
/* In case of FOCUS_TYPE_BOTH, we use index for FOCUS_TYPE_PLAYBACK's forcedly.
* It is because this function can not return both index of option, ext_info results
g_list_foreach (g_focus_node_list, (GFunc)_clear_focus_node_list_func, NULL);
for (list = g_focus_node_list; list != NULL; list = list->next) {
- node = (focus_node_t *)list->data;
- if (CHECK_MY_NODE(node, param)) {
- my_node = node;
- if ((my_node->status > FOCUS_STATUS_DEACTIVATED) && (my_node->status & param->request_type)) {
- debug_error("focus status is already activated");
- ret = MM_ERROR_SOUND_INVALID_STATE;
- goto FINISH;
- }
+ CONTINUE_IF_LIST_DATA_IS_NULL(node, list);
+ CONTINUE_IF_NOT_MY_FOCUS_NODE(node, param);
+
+ my_node = node;
+ if ((my_node->status > FOCUS_STATUS_DEACTIVATED) && (my_node->status & param->request_type)) {
+ debug_error("focus status is already activated");
+ ret = MM_ERROR_SOUND_INVALID_STATE;
+ goto FINISH;
}
}
/* check if the priority of any node is higher than its based on io direction */
for (list = g_focus_node_list; list != NULL; list = list->next) {
- if (!(node = (focus_node_t *)list->data))
- continue;
+ CONTINUE_IF_LIST_DATA_IS_NULL(node, list);
if (my_node == node || node->is_for_watch)
continue;
if (param->request_type == FOCUS_TYPE_BOTH || node->status == FOCUS_STATUS_ACTIVATED_BOTH ||
param_s->is_for_session = my_node->is_for_session;
MMSOUND_STRNCPY(param_s->stream_type, my_node->stream_type, MAX_STREAM_TYPE_LEN);
for (list = g_focus_node_list; list != NULL; list = list->next) {
- if (!(node = (focus_node_t *)list->data))
+ CONTINUE_IF_LIST_DATA_IS_NULL(node, list);
+ if (node == my_node || node->is_for_watch)
continue;
- if (node == my_node || node->is_for_watch || (node->pid == my_node->pid && node->is_for_session && my_node->is_for_session))
+ if (node->pid == my_node->pid && node->is_for_session && my_node->is_for_session)
continue;
if (param_s->request_type == FOCUS_TYPE_BOTH || node->status == FOCUS_STATUS_ACTIVATED_BOTH ||
(node->status & param_s->request_type)) {
/* but, keep going */
ret = MM_ERROR_NONE;
}
- if (!strncmp(my_node->stream_type, node->stream_type, MAX_STREAM_TYPE_LEN)) {
+ if (!strncmp(my_node->stream_type, node->stream_type, MAX_STREAM_TYPE_LEN))
need_to_trigger_watch_cb = false;
- }
+
need_to_trigger_monitor_cb = false;
}
}
g_list_foreach (g_focus_node_list, (GFunc)_clear_focus_node_list_func, NULL);
for (list = g_focus_node_list; list != NULL; list = list->next) {
- node = (focus_node_t *)list->data;
- if (CHECK_MY_NODE(node, param)) {
- my_node = node;
- if (my_node->status == FOCUS_STATUS_DEACTIVATED) {
- debug_error("focus status is already deactivated");
- ret = MM_ERROR_SOUND_INVALID_STATE;
- goto FINISH;
- } else if ((my_node->status != FOCUS_STATUS_ACTIVATED_BOTH) && (my_node->status != (focus_status_e)param->request_type)) {
- debug_error("request type is not matched with current focus type");
- ret = MM_ERROR_SOUND_INVALID_STATE;
- goto FINISH;
- }
- break;
+ CONTINUE_IF_LIST_DATA_IS_NULL(node, list);
+ CONTINUE_IF_NOT_MY_FOCUS_NODE(node, param);
+
+ my_node = node;
+ if (my_node->status == FOCUS_STATUS_DEACTIVATED) {
+ debug_error("focus status is already deactivated");
+ ret = MM_ERROR_SOUND_INVALID_STATE;
+ goto FINISH;
+ } else if ((my_node->status != FOCUS_STATUS_ACTIVATED_BOTH) && (my_node->status != (focus_status_e)param->request_type)) {
+ debug_error("request type is not matched with current focus type");
+ ret = MM_ERROR_SOUND_INVALID_STATE;
+ goto FINISH;
}
+ break;
}
if (my_node == NULL) {
/* Check if there's activating focus for session for the same PID of incomming param*/
if (my_node->is_for_session) {
for (list = g_focus_node_list; list != NULL; list = list->next) {
- if (!(node = (focus_node_t *)list->data))
- continue;
+ CONTINUE_IF_LIST_DATA_IS_NULL(node, list);
if (node == my_node || node->is_for_watch)
continue;
if (node->pid == my_node->pid && node->is_for_session && node->status) {
param_s->is_for_session = my_node->is_for_session;
MMSOUND_STRNCPY(param_s->stream_type, my_node->stream_type, MAX_STREAM_TYPE_LEN);
for (list = g_focus_node_list; list != NULL; list = list->next) {
- if (!(node = (focus_node_t *)list->data))
- continue;
+ CONTINUE_IF_LIST_DATA_IS_NULL(node, list);
if (node == my_node || node->is_for_watch)
continue;
for (i = 0; i < NUM_OF_STREAM_IO_TYPE; i++) {
g_list_foreach (g_focus_node_list, (GFunc)_clear_focus_node_list_func, NULL);
for (list = g_focus_node_list; list != NULL; list = list->next) {
- if (!(node = (focus_node_t *)list->data))
- continue;
+ CONTINUE_IF_LIST_DATA_IS_NULL(node, list);
if ((node->pid == param->pid) && (node->handle_id == param->handle_id) && node->is_for_watch) {
debug_error("the node of pid[%d]/handle_id[%d] for watch focus is already created\n", param->pid, param->handle_id);
ret = MM_ERROR_INVALID_ARGUMENT;
g_list_foreach (g_focus_node_list, (GFunc)_clear_focus_node_list_func, NULL);
for (list = g_focus_node_list; list != NULL; list = list->next) {
- if (!(node = (focus_node_t *)list->data))
- continue;
+ CONTINUE_IF_LIST_DATA_IS_NULL(node, list);
if ((node->pid == param->pid) && (node->handle_id == param->handle_id) && node->is_for_watch) {
debug_log("found the node of pid[%d]/handle_id[%d] for watch focus\n", param->pid, param->handle_id);
__clear_focus_pipe(node);
g_list_foreach (g_focus_node_list, (GFunc)_clear_focus_node_list_func, NULL);
for (list = g_focus_node_list; list != NULL; list = list->next) {
- if (!(src_node = (focus_node_t *)list->data))
- continue;
+ CONTINUE_IF_LIST_DATA_IS_NULL(src_node, list);
if ((src_node->pid == param->pid) && (src_node->handle_id == param->handle_id)) {
debug_log("SRC: found the node of pid[%d]/handle_id[%d] for watch focus\n",
param->pid, param->handle_id);
}
for (list = g_focus_node_list; list != NULL; list = list->next) {
- if (!(dst_node = (focus_node_t *)list->data))
- continue;
+ CONTINUE_IF_LIST_DATA_IS_NULL(dst_node, list);
if ((dst_node->pid == param->pid) && (dst_node->handle_id == param->handle_id_dst)) {
debug_log("DST: found the destination node of param, pid[%d]/handle_id[%d]\n",
param->pid, param->handle_id_dst);
continue;
for (list = g_focus_node_list; list != NULL; list = list->next) {
- if (!(node = (focus_node_t *)list->data))
- continue;
+ CONTINUE_IF_LIST_DATA_IS_NULL(node, list);
if ((node->taken_by_id[i].pid == src_node->pid) &&
(node->taken_by_id[i].handle_id == src_node->handle_id) &&
(node->taken_by_id[i].by_session == false)) {
list = g_focus_node_list;
while (list) {
- if (!(node = (focus_node_t *)list->data))
- continue;
+ CONTINUE_IF_LIST_DATA_IS_NULL(node, list);
if (node->pid != param->pid) {
list = list->next;
debug_log("node not found, next list = %p",list);
my_node = node;
/* update info of nodes that are lost their focus by the process exited */
for (list_s = g_focus_node_list; list_s != NULL; list_s = list_s->next) {
- if (!(node = (focus_node_t *)list_s->data))
- continue;
+ CONTINUE_IF_LIST_DATA_IS_NULL(node, list_s);
for (i = 0; i < NUM_OF_STREAM_IO_TYPE; i++) {
if (node->taken_by_id[i].pid == param->pid) {
if (my_node->taken_by_id[i].pid) {
param_s.request_type = my_node->status;
MMSOUND_STRNCPY(param_s.stream_type, my_node->stream_type, MAX_STREAM_TYPE_LEN);
for (list_s = g_focus_node_list; list_s != NULL; list_s = list_s->next) {
- if (!(node = (focus_node_t *)list_s->data))
- continue;
+ CONTINUE_IF_LIST_DATA_IS_NULL(node, list_s);
if (my_node->pid == node->pid || node->is_for_watch)
continue;
for (i = 0; i < NUM_OF_STREAM_IO_TYPE; i++) {