From: Sangchul Lee Date: Wed, 1 Apr 2020 00:02:46 +0000 (+0900) Subject: stream-manager: Add conditions not to notify stream connection/disconnection twice X-Git-Tag: submit/tizen/20200403.080755~2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=975b8a22fe5ce82af024d828e549274d400d185d;p=platform%2Fcore%2Fmultimedia%2Fpulseaudio-modules-tizen.git stream-manager: Add conditions not to notify stream connection/disconnection twice This notification invokes HAL function for stream connection changed. There were cases that this functions is invoked twice unintentionally according to the scenario related to calling cork/uncork from client side. For example, gstreamer pulsesink and playbacks from sound-server. It is now fixed to trigger the notification one at a time properly. [Version] 13.0.8 [Issue Type] Improvement Change-Id: I1ef748ad514c87e01034e4f5bd8fc9b1083be34b Signed-off-by: Sangchul Lee --- diff --git a/packaging/pulseaudio-modules-tizen.spec b/packaging/pulseaudio-modules-tizen.spec index df7fb6b..8220f51 100644 --- a/packaging/pulseaudio-modules-tizen.spec +++ b/packaging/pulseaudio-modules-tizen.spec @@ -1,6 +1,6 @@ Name: pulseaudio-modules-tizen Summary: Pulseaudio modules for Tizen -Version: 13.0.7 +Version: 13.0.8 Release: 0 Group: Multimedia/Audio License: LGPL-2.1+ diff --git a/src/stream-manager-priv.h b/src/stream-manager-priv.h index 339b4b8..6425e99 100644 --- a/src/stream-manager-priv.h +++ b/src/stream-manager-priv.h @@ -68,6 +68,8 @@ typedef enum _process_command_type { PROCESS_COMMAND_PREPARE, PROCESS_COMMAND_CHANGE_ROUTE_BY_STREAM_STARTED, PROCESS_COMMAND_CHANGE_ROUTE_BY_STREAM_ENDED, + PROCESS_COMMAND_CHANGE_ROUTE_BY_STATE_CHANGED_RUNNING, + PROCESS_COMMAND_CHANGE_ROUTE_BY_STATE_CHANGED_CORKED, PROCESS_COMMAND_CHANGE_ROUTE_BY_STREAM_FOCUS_CHANGED, PROCESS_COMMAND_UPDATE_VOLUME, PROCESS_COMMAND_ADD_PARENT_ID, diff --git a/src/stream-manager.c b/src/stream-manager.c index 597c173..72e26bb 100644 --- a/src/stream-manager.c +++ b/src/stream-manager.c @@ -85,6 +85,8 @@ static const char* process_command_type_str[] = { "PREPARE", "CHANGE_ROUTE_BY_STREAM_STARTED", "CHANGE_ROUTE_BY_STREAM_ENDED", + "CHANGE_ROUTE_BY_STATE_CHANGED_RUNNING", + "CHANGE_ROUTE_BY_STATE_CHANGED_CORKED", "CHANGE_ROUTE_BY_STREAM_FOCUS_CHANGED", "UPDATE_VOLUME", "ADD_PARENT_ID", @@ -2132,7 +2134,7 @@ skip_notifying_route_start: } static process_stream_result_t handle_command_change_route_by_stream_ended(pa_stream_manager *m, void *stream, - stream_type_t type, bool is_new_data) { + stream_type_t type, bool is_new_data, bool by_corked) { const char *role = NULL; const char *route_type_str = NULL; const char *preferred_device_role; @@ -2185,7 +2187,8 @@ static process_stream_result_t handle_command_change_route_by_stream_ended(pa_st } skip_notifying_route_end: - do_notify(m, NOTIFY_COMMAND_INFORM_STREAM_DISCONNECTED, type, false, stream); + if (by_corked || CHECK_STREAM_RUNNING(stream, type)) + do_notify(m, NOTIFY_COMMAND_INFORM_STREAM_DISCONNECTED, type, false, stream); /* need to skip if this stream does not belong to internal device */ /* if needed, notify to update */ @@ -2309,7 +2312,7 @@ static process_stream_result_t handle_command_add_remove_parent_id(pa_stream_man } if (!IS_ROUTE_TYPE_FOR_EXTERNAL_DEV(route_type_str, route_type)) { - if (command == PROCESS_COMMAND_ADD_PARENT_ID) { + if (command == PROCESS_COMMAND_ADD_PARENT_ID && CHECK_STREAM_RUNNING(stream, type)) { if (type == STREAM_SINK_INPUT && m->cur_highest_priority.need_to_update_si) { m->cur_highest_priority.sink_input = stream; m->cur_highest_priority.role_si = role; @@ -2359,10 +2362,13 @@ process_stream_result_t process_stream(pa_stream_manager *m, void *stream, strea result = handle_command_prepare(m, stream, type, is_new_data); break; case PROCESS_COMMAND_CHANGE_ROUTE_BY_STREAM_STARTED: + case PROCESS_COMMAND_CHANGE_ROUTE_BY_STATE_CHANGED_RUNNING: result = handle_command_change_route_by_stream_started(m, stream, type, is_new_data); break; case PROCESS_COMMAND_CHANGE_ROUTE_BY_STREAM_ENDED: - result = handle_command_change_route_by_stream_ended(m, stream, type, is_new_data); + case PROCESS_COMMAND_CHANGE_ROUTE_BY_STATE_CHANGED_CORKED: + result = handle_command_change_route_by_stream_ended(m, stream, type, is_new_data, + (command == PROCESS_COMMAND_CHANGE_ROUTE_BY_STATE_CHANGED_CORKED)); break; case PROCESS_COMMAND_CHANGE_ROUTE_BY_STREAM_FOCUS_CHANGED: result = handle_command_change_route_by_stream_focus_changed(m, stream, type, is_new_data); @@ -2531,10 +2537,10 @@ static pa_hook_result_t sink_input_state_changed_cb(pa_core *core, pa_sink_input switch (i->state) { case PA_SINK_INPUT_CORKED: - process_stream(m, i, STREAM_SINK_INPUT, PROCESS_COMMAND_CHANGE_ROUTE_BY_STREAM_ENDED, false); + process_stream(m, i, STREAM_SINK_INPUT, PROCESS_COMMAND_CHANGE_ROUTE_BY_STATE_CHANGED_CORKED, false); break; case PA_SINK_INPUT_RUNNING: - process_stream(m, i, STREAM_SINK_INPUT, PROCESS_COMMAND_CHANGE_ROUTE_BY_STREAM_STARTED, false); + process_stream(m, i, STREAM_SINK_INPUT, PROCESS_COMMAND_CHANGE_ROUTE_BY_STATE_CHANGED_RUNNING, false); break; default: break;