stream-state: mute streams instead corking them except at start 37/10537/1
authorJanos Kovacs <jankovac503@gmail.com>
Thu, 3 Oct 2013 14:06:20 +0000 (17:06 +0300)
committerJaska Uimonen <jaska.uimonen@helsinki.fi>
Thu, 3 Oct 2013 15:26:02 +0000 (18:26 +0300)
Change-Id: I4d62533b4cbcf3930a17cfa8522f5a70bf48c393

murphy/murphyif.c
murphy/stream-state.c

index 9c36cc3..7d0214f 100644 (file)
@@ -1867,7 +1867,7 @@ static void node_enforce_resource_policy(struct userdata *u,
     if (pa_streq(rset->policy, "relaxed"))
         req = PA_STREAM_RUN;
     else if (pa_streq(rset->policy, "strict")) {
-        if (rset->state == RSET_RELEASE)
+        if (rset->state == RSET_RELEASE && rset->autorel)
             req = PA_STREAM_KILL;
         else {
             if (rset->grant)
index 5453448..4990079 100644 (file)
@@ -144,6 +144,8 @@ static void sink_input_block(pa_sink_input *sinp, pa_bool_t block)
 {
     const char *event;
     pa_proplist *pl;
+    bool block_by_mute;
+    bool muted, corked;
 
     pa_assert(sinp);
 
@@ -154,22 +156,37 @@ static void sink_input_block(pa_sink_input *sinp, pa_bool_t block)
             sinp->flags |= flag_mask;
     }
 
-    if (( sinp->corked_internal && !block) ||
-        (!sinp->corked_internal &&  block)  )
-    {
-        pa_sink_input_cork_internal(sinp, block);
+    muted = pa_sink_input_get_mute(sinp);
+    corked = (sinp->flags & PA_SINK_INPUT_START_CORKED);
 
-        if (sinp->send_event) {
-            if (block)
-                event = PA_STREAM_EVENT_REQUEST_CORK;
-            else
-                event = PA_STREAM_EVENT_REQUEST_UNCORK;
+    if (corked && !block)
+        sinp->flags &= ~PA_SINK_INPUT_START_CORKED;
 
-            pl = pa_proplist_new();
+    block_by_mute = !corked;
 
-            sinp->send_event(sinp, event, pl);
+    pa_log_debug("%sblock by %s", block ? "":"un",
+                 block_by_mute ? "muting":"corking");
 
-            pa_proplist_free(pl);
+    if (block_by_mute) {
+        if ((muted && !block) || (!muted && block))
+            pa_sink_input_set_mute(sinp, block, FALSE);
+    }
+    else {
+        if ((corked && !block) || (!corked &&  block)) {
+            pa_sink_input_cork_internal(sinp, block);
+
+            if (sinp->send_event) {
+                if (block)
+                    event = PA_STREAM_EVENT_REQUEST_CORK;
+                else
+                    event = PA_STREAM_EVENT_REQUEST_UNCORK;
+                
+                pl = pa_proplist_new();
+                
+                sinp->send_event(sinp, event, pl);
+                
+                pa_proplist_free(pl);
+            }
         }
     }
 }