stream-manager: Modify handle_update_focus_status() to update only if needed 79/90779/3 accepted/tizen/3.0/mobile/20161015.034055 accepted/tizen/3.0/tv/20161016.005816 accepted/tizen/3.0/wearable/20161015.083936 accepted/tizen/common/20161005.165445 accepted/tizen/ivi/20161007.003929 accepted/tizen/mobile/20161007.003708 accepted/tizen/tv/20161007.003819 accepted/tizen/wearable/20161007.003856 submit/tizen/20161005.055916 submit/tizen_3.0_mobile/20161015.000006 submit/tizen_3.0_tv/20161015.000005 submit/tizen_3.0_wearable/20161015.000005
authorSangchul Lee <sc11.lee@samsung.com>
Tue, 4 Oct 2016 07:53:33 +0000 (16:53 +0900)
committerSangchul Lee <sc11.lee@samsung.com>
Tue, 4 Oct 2016 08:12:57 +0000 (17:12 +0900)
Previously, all the playback/recording streams are updated even if only one focus type(playback/capture) is changed.
It is fixed to update only if needed by checking change of each focus type.

[Version] 5.0.83
[Profile] Common
[Issue Type] Feature enhancement

Change-Id: Icfc6434d706a76ca51a7727f5585f7bd6127ce77
Signed-off-by: Sangchul Lee <sc11.lee@samsung.com>
packaging/pulseaudio-modules-tizen.spec
src/stream-manager-priv.h
src/stream-manager.c

index 11052063b278252e6acfc952483284f785fc37aa..d662d86b0eccbf0184a994d5b4c8d8738d4c5027 100644 (file)
@@ -1,6 +1,6 @@
 Name:             pulseaudio-modules-tizen
 Summary:          Pulseaudio modules for Tizen
-Version:          5.0.82
+Version:          5.0.83
 Release:          0
 Group:            Multimedia/Audio
 License:          LGPL-2.1+
index 343d9e5624fd82943d004e264988a1d986053db7..ec71b6e03c8a7ca8f3019db14d1a7c7c1697a7c6 100644 (file)
@@ -57,7 +57,7 @@ typedef enum _stream_direction {
 #define GET_STREAM_SAMPLE_SPEC(stream, type) \
       (type == STREAM_SINK_INPUT ? ((pa_sink_input*)stream)->sample_spec : ((pa_source_output*)stream)->sample_spec)
 
-#define IS_FOCUS_ACQUIRED(focus, type) \
+#define GET_FOCUS_STATUS(focus, type) \
       (type == STREAM_SINK_INPUT ? (focus & STREAM_FOCUS_ACQUIRED_PLAYBACK) : (focus & STREAM_FOCUS_ACQUIRED_CAPTURE))
 
 typedef struct _volume_info {
index d2f7918470490998a96bc7ca5bb508df6aef26f3..8652fbfe2931addb38a46f975177dbee1b966780 100644 (file)
@@ -1112,6 +1112,7 @@ static void handle_update_focus_status(DBusConnection *conn, DBusMessage *msg, v
     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);
@@ -1125,25 +1126,25 @@ static void handle_update_focus_status(DBusConnection *conn, DBusMessage *msg, v
 
     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);
                 }
@@ -1942,8 +1943,8 @@ static bool update_the_highest_priority_stream(pa_stream_manager *m, process_com
                 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 {
@@ -2009,8 +2010,8 @@ static bool update_the_highest_priority_stream(pa_stream_manager *m, process_com
                     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;