stream-manager: Add conditions not to notify stream connection/disconnection twice 47/230247/1
authorSangchul Lee <sc11.lee@samsung.com>
Wed, 1 Apr 2020 00:02:46 +0000 (09:02 +0900)
committerSangchul Lee <sc11.lee@samsung.com>
Thu, 9 Apr 2020 02:47:18 +0000 (11:47 +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] 11.1.95
[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 b5bf22f3446fe37617a9ab7cc789ca175076b97c..c7161cc2116211e07352d587d547683e724de0b3 100644 (file)
@@ -1,6 +1,6 @@
 Name:             pulseaudio-modules-tizen
 Summary:          Pulseaudio modules for Tizen
-Version:          11.1.94
+Version:          11.1.95
 Release:          0
 Group:            Multimedia/Audio
 License:          LGPL-2.1+
index 2173f2e19d2f44d70555a18b29d5bb8383ef3f15..ea74c2fa58dbd16335e5d302b574b25804b3c4ed 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 58a10a92b46aaaec78caac44c920c3e1fc0ab232..4ccde67bf52001fbebfc361c127fd465a4c3fc59 100644 (file)
@@ -83,6 +83,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",
@@ -2110,7 +2112,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;
@@ -2163,7 +2165,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 */
@@ -2287,7 +2290,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;
@@ -2333,10 +2336,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);
@@ -2508,11 +2514,11 @@ static pa_hook_result_t sink_input_state_changed_cb(pa_core *core, pa_sink_input
 
     switch (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_DRAINED:
     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;