stream-manager: Enhance codes regarding add/remove volume factor to streams in case... 17/109917/3
authorSangchul Lee <sc11.lee@samsung.com>
Thu, 12 Jan 2017 07:30:18 +0000 (16:30 +0900)
committerSangchul Lee <sc11.lee@samsung.com>
Thu, 12 Jan 2017 07:54:18 +0000 (16:54 +0900)
[Version] 5.0.124
[Profile] Common
[Issue Type] Error tolerance

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

index 59da184..c4a20f9 100644 (file)
@@ -1,6 +1,6 @@
 Name:             pulseaudio-modules-tizen
 Summary:          Pulseaudio modules for Tizen
-Version:          5.0.123
+Version:          5.0.124
 Release:          0
 Group:            Multimedia/Audio
 License:          LGPL-2.1+
index aa1fdf9..24bb041 100644 (file)
@@ -364,6 +364,8 @@ const char* stream_manager_media_names_for_skip[NAME_FOR_SKIP_MAX] = {"pulsesink
 #define STREAM_FOCUS_STATE_RELEASED    "0"
 #define STREAM_FOCUS_STATE_ACQUIRED    "1"
 
+#define MUTE_KEY    "mute_by_device_disconnection"
+
 typedef enum _process_stream_result {
     PROCESS_STREAM_RESULT_OK,
     PROCESS_STREAM_RESULT_STOP,
@@ -2959,6 +2961,13 @@ static process_stream_result_t process_stream(pa_stream_manager *m, void *stream
         } else {
             role = pa_proplist_gets(GET_STREAM_PROPLIST(stream, type), PA_PROP_MEDIA_ROLE);
             route_type_str = pa_proplist_gets(GET_STREAM_PROPLIST(stream, type), PA_PROP_MEDIA_ROLE_ROUTE_TYPE);
+            /* FIXME: if PA_COMMUNICATOR_HOOK_EVENT_FULLY_HANDLED is not called for some reason,
+             * volume factor should be removed forcedly. */
+            if (type == STREAM_SINK_INPUT) {
+                pa_sink_input *i = (pa_sink_input *)stream;
+                if ((pa_hashmap_get(i->volume_factor_items, MUTE_KEY)))
+                    pa_sink_input_remove_volume_factor(i, MUTE_KEY);
+            }
         }
 
         /* skip roles */
@@ -3706,7 +3715,6 @@ static void mute_sink_inputs_as_device_disconnection(pa_stream_manager *m, uint3
     uint32_t s_idx = 0;
     pa_cvolume vol;
     pa_sink_input *i;
-    const char *mute_key = "mute_by_device_disconnection";
 
     pa_assert(m);
 
@@ -3720,7 +3728,9 @@ static void mute_sink_inputs_as_device_disconnection(pa_stream_manager *m, uint3
         muted_streams = pa_idxset_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func);
         PA_IDXSET_FOREACH(i, (pa_idxset *)user_data, s_idx) {
             pa_log_debug("found a stream(%p, %u) that should be muted.", i, i->index);
-            pa_sink_input_add_volume_factor(i, mute_key, &vol);
+            /* remove MUTE_KEY before adding to avoid abort-case in pa_sink_input_add_volume_factor */
+            pa_hashmap_remove(i->volume_factor_items, MUTE_KEY);
+            pa_sink_input_add_volume_factor(i, MUTE_KEY, &vol);
             pa_idxset_put(muted_streams, i, NULL);
         }
         pa_hashmap_put(m->muted_streams, (void*)event_id, muted_streams);
@@ -3731,7 +3741,7 @@ static void mute_sink_inputs_as_device_disconnection(pa_stream_manager *m, uint3
         }
         PA_IDXSET_FOREACH(i, muted_streams, s_idx) {
             pa_idxset_remove_by_data(muted_streams, i, NULL);
-            pa_sink_input_remove_volume_factor(i, mute_key);
+            pa_sink_input_remove_volume_factor(i, MUTE_KEY);
             pa_log_debug("found a stream(%p, %u) that should be un-muted.", i, i->index);
         }
         pa_hashmap_remove(m->muted_streams, (void*)event_id);