stream-manager: Add conditions not to notify stream connection/disconnection twice 27/229427/1
authorSangchul Lee <sc11.lee@samsung.com>
Wed, 1 Apr 2020 00:02:46 +0000 (09:02 +0900)
committerSangchul Lee <sc11.lee@samsung.com>
Wed, 1 Apr 2020 04:49:39 +0000 (13:49 +0900)
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 <sc11.lee@samsung.com>
packaging/pulseaudio-modules-tizen.spec
src/stream-manager-priv.h
src/stream-manager.c

index df7fb6b..8220f51 100644 (file)
@@ -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+
index 339b4b8..6425e99 100644 (file)
@@ -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,
index 597c173..72e26bb 100644 (file)
@@ -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;