void *stream = NULL;
DBusMessage *reply = NULL;
pa_stream_manager *m = (pa_stream_manager*)userdata;
+ int prev_status = STREAM_FOCUS_ACQUIRED_NONE;
pa_assert(conn);
pa_assert(msg);
pa_assert_se((reply = dbus_message_new_method_return(msg)));
- sp = pa_hashmap_get(m->stream_parents, (const void*)id);
- if (sp) {
- if (sp->focus_status != (acquired_focus_status & (STREAM_FOCUS_ACQUIRED_PLAYBACK|STREAM_FOCUS_ACQUIRED_CAPTURE))) {
+ if ((sp = pa_hashmap_get(m->stream_parents, (const void*)id))) {
+ if (sp->focus_status != acquired_focus_status) {
/* need to update */
- sp->focus_status = acquired_focus_status & (STREAM_FOCUS_ACQUIRED_PLAYBACK|STREAM_FOCUS_ACQUIRED_CAPTURE);
- if (sp->idx_sink_inputs) {
+ prev_status = sp->focus_status;
+ sp->focus_status = acquired_focus_status;
+ if (((prev_status ^ sp->focus_status) & STREAM_FOCUS_ACQUIRED_PLAYBACK) && sp->idx_sink_inputs) {
count = pa_idxset_size(sp->idx_sink_inputs);
PA_IDXSET_FOREACH(stream, sp->idx_sink_inputs, idx) {
pa_proplist_sets(GET_STREAM_PROPLIST(stream, STREAM_SINK_INPUT), PA_PROP_MEDIA_FOCUS_STATUS,
- IS_FOCUS_ACQUIRED(sp->focus_status, STREAM_SINK_INPUT) ? STREAM_FOCUS_PLAYBACK : STREAM_FOCUS_NONE);
+ GET_FOCUS_STATUS(sp->focus_status, STREAM_SINK_INPUT) ? STREAM_FOCUS_PLAYBACK : STREAM_FOCUS_NONE);
if (--count == 0)
process_stream(m, stream, STREAM_SINK_INPUT, PROCESS_COMMAND_CHANGE_ROUTE_BY_STREAM_FOCUS_CHANGED, false);
}
}
- if (sp->idx_source_outputs) {
+ if (((prev_status ^ sp->focus_status) & STREAM_FOCUS_ACQUIRED_CAPTURE) && sp->idx_source_outputs) {
count = pa_idxset_size(sp->idx_source_outputs);
PA_IDXSET_FOREACH(stream, sp->idx_source_outputs, idx) {
pa_proplist_sets(GET_STREAM_PROPLIST(stream, STREAM_SOURCE_OUTPUT), PA_PROP_MEDIA_FOCUS_STATUS,
- IS_FOCUS_ACQUIRED(sp->focus_status, STREAM_SOURCE_OUTPUT) ? STREAM_FOCUS_CAPTURE : STREAM_FOCUS_NONE);
+ GET_FOCUS_STATUS(sp->focus_status, STREAM_SOURCE_OUTPUT) ? STREAM_FOCUS_CAPTURE : STREAM_FOCUS_NONE);
if (--count == 0)
process_stream(m, stream, STREAM_SOURCE_OUTPUT, PROCESS_COMMAND_CHANGE_ROUTE_BY_STREAM_FOCUS_CHANGED, false);
}
return false;
} else {
if (priority && cur_max_priority) {
- if (IS_FOCUS_ACQUIRED(focus_status, type) ||
- (!IS_FOCUS_ACQUIRED(cur_max_focus_status, type) && *priority >= *cur_max_priority)) {
+ if (GET_FOCUS_STATUS(focus_status, type) ||
+ (!GET_FOCUS_STATUS(cur_max_focus_status, type) && *priority >= *cur_max_priority)) {
*need_to_update = true;
pa_log_debug("update cur_highest to mine(%s)", role);
} else {
cur_max_role = _role;
}
if (cur_max_priority && priority) {
- if (IS_FOCUS_ACQUIRED(cur_max_focus_status, type) ||
- (!IS_FOCUS_ACQUIRED(focus_status, type) && (*cur_max_priority > *priority))) {
+ if (GET_FOCUS_STATUS(cur_max_focus_status, type) ||
+ (!GET_FOCUS_STATUS(focus_status, type) && (*cur_max_priority > *priority))) {
/* skip */
} else {
cur_max_priority = priority;