void *cbdata;
bool reacquisition;
- bool is_for_session; /* will be removed when the session concept is completely left out*/
+ /* It will be removed when the session concept is completely left out*/
+ bool is_for_session;
} _mm_sound_mgr_focus_param_t;
typedef struct _taken_by_id
void *cbdata;
bool reacquisition;
- bool is_for_session; /* will be removed when the session concept is completely left out*/
-
+ /* These will be removed when the session concept is completely left out*/
+ bool is_for_session;
+ bool reacquisition_with_released_state;
} focus_node_t;
int MMSoundMgrFocusInit(void);
}
}
- victim_node->status = (command == FOCUS_COMMAND_RELEASE) ? (victim_node->status & ~(cb_data.type)) : (victim_node->status | cb_data.type);
+ if (command == FOCUS_COMMAND_RELEASE || victim_node->reacquisition_with_released_state)
+ victim_node->status = victim_node->status & ~(cb_data.type);
+ else if (command == FOCUS_COMMAND_ACQUIRE)
+ victim_node->status = victim_node->status | cb_data.type;
if (strncmp(assaulter_stream_type, victim_node->stream_type, MAX_STREAM_TYPE_LEN))
_mm_sound_mgr_focus_do_watch_callback((focus_type_e)assaulter_param->request_type, command, victim_node, assaulter_param);
return ret;
}
+static void update_reacquisition_with_released_state(focus_node_t *node, int direction)
+{
+ if (!node) {
+ debug_error("node is null");
+ return;
+ }
+ if (direction >= NUM_OF_STREAM_IO_TYPE) {
+ debug_error("invalid direction(%d)", direction);
+ return;
+ }
+
+ /* In case of session backward compatibility for audio-io, mm-player, mm-camcorder, we mark a specific flag here.
+ When invoking focus state changed callback for acquiring, state of the node will not be updated rather updated
+ when the next request to acquire. */
+ if (!strncmp("audio-io acquire focus", node->ext_info[direction], strlen(node->ext_info[direction])) ||
+ !strncmp("mm-player acquire focus", node->ext_info[direction], strlen(node->ext_info[direction])) ||
+ !strncmp("mm-camcorder acquire focus", node->ext_info[direction], strlen(node->ext_info[direction]))) {
+ debug_msg("this node needs reacquisition with focus released state\n");
+ node->reacquisition_with_released_state = true;
+ }
+}
+
int mm_sound_mgr_focus_request_acquire(const _mm_sound_mgr_focus_param_t *param)
{
int ret = MM_ERROR_NONE;
if (param->request_type & (i+1)) {
MMSOUND_STRNCPY(my_node->ext_info[i], param->ext_info, MM_SOUND_NAME_NUM);
my_node->option[i] = param->option;
+ update_reacquisition_with_released_state(my_node, i);
}
}
/* update status */