x_node->taken_##x_postfix[i].handle_id = x_hid; \
} while (0)
-#define CONTINUE_IF_LIST_DATA_IS_NULL(x_node, x_list) \
+#define SET_NODE_FROM_LIST_DATA(x_node, x_list) \
if (!((x_node) = (focus_node_t *)(x_list)->data)) \
continue; \
}
for (list = g_focus_node_list; list != NULL; list = list->next) {
- CONTINUE_IF_LIST_DATA_IS_NULL(node, list);
+ SET_NODE_FROM_LIST_DATA(node, list);
if (node == my_node)
continue;
if (!node->is_for_watch || !(node->status & focus_type))
GList *list = NULL;
focus_node_t *node = NULL;
for (list = g_focus_node_list; list != NULL; list = list->next) {
- CONTINUE_IF_LIST_DATA_IS_NULL(node, list);
+ SET_NODE_FROM_LIST_DATA(node, list);
if (node->taken_by_id[i].pid == victim_node->pid &&
node->taken_by_id[i].handle_id == victim_node->handle_id) {
UPDATE_FOCUS_TAKEN_INFO(backup, node, node->taken_by_id[i].pid, node->taken_by_id[i].handle_id);
return;
}
+static int get_my_focus_node(GList *glist, const _mm_sound_mgr_focus_param_t *param, focus_node_t **my_node)
+{
+ GList *list = NULL;
+ focus_node_t *node = NULL;
+
+ if (!param || !my_node)
+ return MM_ERROR_INVALID_ARGUMENT;
+
+ for (list = glist; list != NULL; list = list->next) {
+ SET_NODE_FROM_LIST_DATA(node, list);
+ CONTINUE_IF_NOT_MY_FOCUS_NODE(node, param);
+ break;
+ }
+
+ if (node == NULL) {
+ debug_error("node is null");
+ return MM_ERROR_INVALID_ARGUMENT;
+ }
+
+ *my_node = node;
+
+ return MM_ERROR_NONE;
+}
+
int mm_sound_mgr_focus_create_node(const _mm_sound_mgr_focus_param_t *param)
{
int ret = MM_ERROR_NONE;
MMSOUND_ENTER_CRITICAL_SECTION_WITH_RETURN(&g_focus_node_list_mutex, MM_ERROR_SOUND_INTERNAL);
for (list = g_focus_node_list; list != NULL; list = list->next) {
- CONTINUE_IF_LIST_DATA_IS_NULL(node, list);
+ SET_NODE_FROM_LIST_DATA(node, list);
CONTINUE_IF_NOT_MY_FOCUS_NODE(node, param);
debug_error("the node of pid[%d]/handle_id[%d] is already created", param->pid, param->handle_id);
MMSOUND_ENTER_CRITICAL_SECTION_WITH_RETURN(&g_focus_node_list_mutex, MM_ERROR_SOUND_INTERNAL);
- for (list = g_focus_node_list; list != NULL; list = list->next) {
- 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]", 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]", param->pid, param->handle_id);
- ret = MM_ERROR_INVALID_ARGUMENT;
+ if ((ret = get_my_focus_node(g_focus_node_list, param, &my_node)))
goto FINISH;
- }
if (need_to_trigger) {
bool need_to_trigger_watch_cb = true;
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) {
- CONTINUE_IF_LIST_DATA_IS_NULL(node, list);
+ SET_NODE_FROM_LIST_DATA(node, list);
if (my_node == node || node->is_for_watch)
continue;
for (i = 0; i < NUM_OF_STREAM_IO_TYPE; i++) {
/* Find node to set reacquisition */
for (list = g_focus_node_list; list != NULL; list = list->next) {
- CONTINUE_IF_LIST_DATA_IS_NULL(node, list);
+ SET_NODE_FROM_LIST_DATA(node, list);
CONTINUE_IF_NOT_MY_FOCUS_NODE(node, param);
if (node->reacquisition == param->reacquisition) {
if (!param->reacquisition) {
for (list = g_focus_node_list; list != NULL; list = list->next) {
- CONTINUE_IF_LIST_DATA_IS_NULL(node, list);
+ SET_NODE_FROM_LIST_DATA(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) {
- CONTINUE_IF_LIST_DATA_IS_NULL(node, list);
+ SET_NODE_FROM_LIST_DATA(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) {
- CONTINUE_IF_LIST_DATA_IS_NULL(node, list);
+ SET_NODE_FROM_LIST_DATA(node, list);
if (!node->is_for_watch && (node->status & focus_type)) {
int index = focus_type - 1;
if (!param->is_in_thread)
MMSOUND_ENTER_CRITICAL_SECTION_WITH_RETURN(&g_focus_node_list_mutex, MM_ERROR_SOUND_INTERNAL);
- for (list = g_focus_node_list; list != NULL; list = list->next) {
- 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;
- }
- }
+ if ((ret = get_my_focus_node(g_focus_node_list, param, &my_node)))
+ goto FINISH;
- if (my_node == NULL) {
- debug_error("node is null");
- ret = MM_ERROR_INVALID_ARGUMENT;
+ 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) {
- CONTINUE_IF_LIST_DATA_IS_NULL(node, list);
+ SET_NODE_FROM_LIST_DATA(node, list);
if (my_node == node || node->is_for_watch)
continue;
if (param->request_type == FOCUS_TYPE_BOTH || node->status == FOCUS_STATUS_ACTIVATED_BOTH ||
_mm_sound_mgr_focus_param_t *param_s = (_mm_sound_mgr_focus_param_t *)param;
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) {
- CONTINUE_IF_LIST_DATA_IS_NULL(node, list);
+ SET_NODE_FROM_LIST_DATA(node, list);
if (node == my_node || node->is_for_watch)
continue;
if (param_s->request_type == FOCUS_TYPE_BOTH || node->status == FOCUS_STATUS_ACTIVATED_BOTH ||
focus_node_t *node = NULL;
focus_node_t *my_node = NULL;
bool need_to_trigger_watch_cb = true;
- bool need_to_trigger_cb = true;
int i = 0;
debug_fenter();
if (!param->is_in_thread)
MMSOUND_ENTER_CRITICAL_SECTION_WITH_RETURN(&g_focus_node_list_mutex, MM_ERROR_SOUND_INTERNAL);
- for (list = g_focus_node_list; list != NULL; list = list->next) {
- CONTINUE_IF_LIST_DATA_IS_NULL(node, list);
- CONTINUE_IF_NOT_MY_FOCUS_NODE(node, param);
+ if ((ret = get_my_focus_node(g_focus_node_list, param, &my_node)))
+ goto FINISH;
- my_node = node;
- if (my_node->status == FOCUS_STATUS_DEACTIVATED) {
+ 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)) {
+ } 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) {
- debug_error("node is null");
- ret = MM_ERROR_INVALID_ARGUMENT;
- goto FINISH;
- }
-
- if (need_to_trigger_cb) {
- _mm_sound_mgr_focus_param_t *param_s = (_mm_sound_mgr_focus_param_t *)param;
- 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) {
- 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++) {
- if (param_s->request_type & (i+1)) {
- if (node->taken_by_id[i].pid == param_s->pid &&
- node->taken_by_id[i].handle_id == param_s->handle_id) {
- /* do callback for resumption */
- if ((ret = _mm_sound_mgr_focus_do_callback(FOCUS_COMMAND_ACQUIRE, node, param_s)))
- debug_error("Fail to _focus_do_callback for COMMAND ACQUIRE to node[%p], ret[0x%x]", node, ret);
- if (!strncmp(my_node->stream_type, node->stream_type, MAX_STREAM_TYPE_LEN))
- need_to_trigger_watch_cb = false;
- }
+ _mm_sound_mgr_focus_param_t *param_s = (_mm_sound_mgr_focus_param_t *)param;
+ 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) {
+ SET_NODE_FROM_LIST_DATA(node, list);
+ if (node == my_node || node->is_for_watch)
+ continue;
+ for (i = 0; i < NUM_OF_STREAM_IO_TYPE; i++) {
+ if (param_s->request_type & (i+1)) {
+ if (node->taken_by_id[i].pid == param_s->pid &&
+ node->taken_by_id[i].handle_id == param_s->handle_id) {
+ /* do callback for resumption */
+ if ((ret = _mm_sound_mgr_focus_do_callback(FOCUS_COMMAND_ACQUIRE, node, param_s)))
+ debug_error("Fail to _focus_do_callback for COMMAND ACQUIRE to node[%p], ret[0x%x]", node, ret);
+ if (!strncmp(my_node->stream_type, node->stream_type, MAX_STREAM_TYPE_LEN))
+ need_to_trigger_watch_cb = false;
}
}
}
}
+
/* update status */
my_node->status &= ~(param->request_type);
/* remove ext info. */
MMSOUND_ENTER_CRITICAL_SECTION_WITH_RETURN(&g_focus_node_list_mutex, MM_ERROR_SOUND_INTERNAL);
for (list = g_focus_node_list; list != NULL; list = list->next) {
- CONTINUE_IF_LIST_DATA_IS_NULL(node, list);
+ SET_NODE_FROM_LIST_DATA(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", param->pid, param->handle_id);
ret = MM_ERROR_INVALID_ARGUMENT;
MMSOUND_ENTER_CRITICAL_SECTION_WITH_RETURN(&g_focus_node_list_mutex, MM_ERROR_SOUND_INTERNAL);
for (list = g_focus_node_list; list != NULL; list = list->next) {
- CONTINUE_IF_LIST_DATA_IS_NULL(node, list);
+ SET_NODE_FROM_LIST_DATA(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", param->pid, param->handle_id);
__clear_focus_pipe(node);
MMSOUND_ENTER_CRITICAL_SECTION_WITH_RETURN(&g_focus_node_list_mutex, MM_ERROR_SOUND_INTERNAL);
- for (list = g_focus_node_list; list != NULL; list = list->next) {
- 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",
- param->pid, param->handle_id);
- break;
- }
- }
- if (src_node == NULL) {
- debug_error("could not find the source node of param, pid[%d]/handle_id[%d]",
- param->pid, param->handle_id);
- ret = MM_ERROR_INVALID_ARGUMENT;
+ if ((ret = get_my_focus_node(g_focus_node_list, param, &src_node)))
goto FINISH;
- }
if (!(src_node->status & param->request_type)) {
debug_error("invalid request type(0x%x), src_node->status(0x%x)",
}
for (list = g_focus_node_list; list != NULL; list = list->next) {
- CONTINUE_IF_LIST_DATA_IS_NULL(dst_node, list);
+ SET_NODE_FROM_LIST_DATA(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]",
param->pid, param->handle_id_dst);
continue;
for (list = g_focus_node_list; list != NULL; list = list->next) {
- CONTINUE_IF_LIST_DATA_IS_NULL(node, list);
+ SET_NODE_FROM_LIST_DATA(node, list);
if ((node->taken_by_id[i].pid == src_node->pid) &&
(node->taken_by_id[i].handle_id == src_node->handle_id)) {
debug_log("found the node pid[%d]/handle_id[%d] that focus was taken by this src node, update it",
list = g_focus_node_list;
while (list) {
- CONTINUE_IF_LIST_DATA_IS_NULL(node, list);
+ SET_NODE_FROM_LIST_DATA(node, list);
if (node->handle_id != id) {
list = list->next;
continue;
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) {
- CONTINUE_IF_LIST_DATA_IS_NULL(node, list_s);
+ SET_NODE_FROM_LIST_DATA(node, list_s);
for (i = 0; i < NUM_OF_STREAM_IO_TYPE; i++) {
if (node->taken_by_id[i].handle_id == id) {
if (my_node->taken_by_id[i].handle_id)
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) {
- CONTINUE_IF_LIST_DATA_IS_NULL(node, list_s);
+ SET_NODE_FROM_LIST_DATA(node, list_s);
if (my_node->handle_id == node->handle_id || node->is_for_watch)
continue;
for (i = 0; i < NUM_OF_STREAM_IO_TYPE; i++) {