[pulseaudio-commits] 3 commits - src/pulsecore

David Henningsson diwic at kemper.freedesktop.org
Wed Mar 11 05:00:57 PDT 2015


 src/pulsecore/protocol-native.c |    2 
 src/pulsecore/pstream.c         |  154 ++++++++++++++++++----------------------
 2 files changed, 71 insertions(+), 85 deletions(-)

New commits:
commit a13b6f001d0ef00f540ddf02f54915cda76109bd
Author: David Henningsson <david.henningsson at canonical.com>
Date:   Thu Mar 5 14:55:53 2015 +0100

    pstream: Remove unnecessary if condition
    
    Without split packets, the if condition can now be removed.
    
    Signed-off-by: David Henningsson <david.henningsson at canonical.com>

diff --git a/src/pulsecore/pstream.c b/src/pulsecore/pstream.c
index 877ff66..8c14fbb 100644
--- a/src/pulsecore/pstream.c
+++ b/src/pulsecore/pstream.c
@@ -854,72 +854,69 @@ static int do_read(pa_pstream *p, struct pstream_read *re) {
             }
         }
 
-    } else if (re->index > PA_PSTREAM_DESCRIPTOR_SIZE) {
-
+    } else if (re->index >= ntohl(re->descriptor[PA_PSTREAM_DESCRIPTOR_LENGTH]) + PA_PSTREAM_DESCRIPTOR_SIZE) {
         /* Frame complete */
-        if (re->index >= ntohl(re->descriptor[PA_PSTREAM_DESCRIPTOR_LENGTH]) + PA_PSTREAM_DESCRIPTOR_SIZE) {
 
-            if (re->memblock) {
-                memblock_complete(p, re);
+        if (re->memblock) {
+            memblock_complete(p, re);
 
-                /* This was a memblock frame. We can unref the memblock now */
-                pa_memblock_unref(re->memblock);
+            /* This was a memblock frame. We can unref the memblock now */
+            pa_memblock_unref(re->memblock);
 
-            } else if (re->packet) {
+        } else if (re->packet) {
 
-                if (p->receive_packet_callback)
+            if (p->receive_packet_callback)
 #ifdef HAVE_CREDS
-                    p->receive_packet_callback(p, re->packet, &p->read_ancil_data, p->receive_packet_callback_userdata);
+                p->receive_packet_callback(p, re->packet, &p->read_ancil_data, p->receive_packet_callback_userdata);
 #else
-                    p->receive_packet_callback(p, re->packet, NULL, p->receive_packet_callback_userdata);
+                p->receive_packet_callback(p, re->packet, NULL, p->receive_packet_callback_userdata);
 #endif
 
-                pa_packet_unref(re->packet);
-            } else {
-                pa_memblock *b;
-                uint32_t flags = ntohl(re->descriptor[PA_PSTREAM_DESCRIPTOR_FLAGS]);
-                pa_assert((flags & PA_FLAG_SHMMASK) == PA_FLAG_SHMDATA);
-
-                pa_assert(p->import);
+            pa_packet_unref(re->packet);
+        } else {
+            pa_memblock *b;
+            uint32_t flags = ntohl(re->descriptor[PA_PSTREAM_DESCRIPTOR_FLAGS]);
+            pa_assert((flags & PA_FLAG_SHMMASK) == PA_FLAG_SHMDATA);
 
-                if (!(b = pa_memimport_get(p->import,
-                                          ntohl(re->shm_info[PA_PSTREAM_SHM_BLOCKID]),
-                                          ntohl(re->shm_info[PA_PSTREAM_SHM_SHMID]),
-                                          ntohl(re->shm_info[PA_PSTREAM_SHM_INDEX]),
-                                          ntohl(re->shm_info[PA_PSTREAM_SHM_LENGTH]),
-                                          !!(flags & PA_FLAG_SHMWRITABLE)))) {
+            pa_assert(p->import);
 
-                    if (pa_log_ratelimit(PA_LOG_DEBUG))
-                        pa_log_debug("Failed to import memory block.");
-                }
+            if (!(b = pa_memimport_get(p->import,
+                                       ntohl(re->shm_info[PA_PSTREAM_SHM_BLOCKID]),
+                                       ntohl(re->shm_info[PA_PSTREAM_SHM_SHMID]),
+                                       ntohl(re->shm_info[PA_PSTREAM_SHM_INDEX]),
+                                       ntohl(re->shm_info[PA_PSTREAM_SHM_LENGTH]),
+                                       !!(flags & PA_FLAG_SHMWRITABLE)))) {
 
-                if (p->receive_memblock_callback) {
-                    int64_t offset;
-                    pa_memchunk chunk;
-
-                    chunk.memblock = b;
-                    chunk.index = 0;
-                    chunk.length = b ? pa_memblock_get_length(b) : ntohl(re->shm_info[PA_PSTREAM_SHM_LENGTH]);
-
-                    offset = (int64_t) (
-                            (((uint64_t) ntohl(re->descriptor[PA_PSTREAM_DESCRIPTOR_OFFSET_HI])) << 32) |
-                            (((uint64_t) ntohl(re->descriptor[PA_PSTREAM_DESCRIPTOR_OFFSET_LO]))));
-
-                    p->receive_memblock_callback(
-                            p,
-                            ntohl(re->descriptor[PA_PSTREAM_DESCRIPTOR_CHANNEL]),
-                            offset,
-                            ntohl(re->descriptor[PA_PSTREAM_DESCRIPTOR_FLAGS]) & PA_FLAG_SEEKMASK,
-                            &chunk,
-                            p->receive_memblock_callback_userdata);
-                }
+                if (pa_log_ratelimit(PA_LOG_DEBUG))
+                    pa_log_debug("Failed to import memory block.");
+            }
 
-                if (b)
-                    pa_memblock_unref(b);
+            if (p->receive_memblock_callback) {
+                int64_t offset;
+                pa_memchunk chunk;
+
+                chunk.memblock = b;
+                chunk.index = 0;
+                chunk.length = b ? pa_memblock_get_length(b) : ntohl(re->shm_info[PA_PSTREAM_SHM_LENGTH]);
+
+                offset = (int64_t) (
+                        (((uint64_t) ntohl(re->descriptor[PA_PSTREAM_DESCRIPTOR_OFFSET_HI])) << 32) |
+                        (((uint64_t) ntohl(re->descriptor[PA_PSTREAM_DESCRIPTOR_OFFSET_LO]))));
+
+                p->receive_memblock_callback(
+                        p,
+                        ntohl(re->descriptor[PA_PSTREAM_DESCRIPTOR_CHANNEL]),
+                        offset,
+                        ntohl(re->descriptor[PA_PSTREAM_DESCRIPTOR_FLAGS]) & PA_FLAG_SEEKMASK,
+                        &chunk,
+                        p->receive_memblock_callback_userdata);
             }
 
-            goto frame_done;
+            if (b)
+                pa_memblock_unref(b);
         }
+
+        goto frame_done;
     }
 
     return 0;

commit 6a71b5f96709bcd52c04a5a90047e1c199fadd7c
Author: David Henningsson <david.henningsson at canonical.com>
Date:   Thu Mar 5 14:55:52 2015 +0100

    protocol-native: Re-enable srbchannel
    
    Signed-off-by: David Henningsson <david.henningsson at canonical.com>

diff --git a/src/pulsecore/protocol-native.c b/src/pulsecore/protocol-native.c
index ba9b406..b06f553 100644
--- a/src/pulsecore/protocol-native.c
+++ b/src/pulsecore/protocol-native.c
@@ -5325,7 +5325,7 @@ int pa_native_options_parse(pa_native_options *o, pa_core *c, pa_modargs *ma) {
     pa_assert(PA_REFCNT_VALUE(o) >= 1);
     pa_assert(ma);
 
-    o->srbchannel = false;
+    o->srbchannel = true;
     if (pa_modargs_get_value_boolean(ma, "srbchannel", &o->srbchannel) < 0) {
         pa_log("srbchannel= expects a boolean argument.");
         return -1;

commit 7b8e8cd3883e081a6e3f2d8ed307524801438e04
Author: David Henningsson <david.henningsson at canonical.com>
Date:   Thu Mar 5 14:55:51 2015 +0100

    pstream: Don't split (non-SHM) memblocks
    
    In case SHM is full or disabled, audio data is sent through the
    io/srbchannel. When this channel in turn gets full, memblocks
    could previously be split up. This could lead to crashes in case
    the split was on non-frame boundaries (in combination with full
    memblock queues).
    
    BugLink: https://bugs.freedesktop.org/show_bug.cgi?id=88452
    Signed-off-by: David Henningsson <david.henningsson at canonical.com>

diff --git a/src/pulsecore/pstream.c b/src/pulsecore/pstream.c
index b0ed5a7..877ff66 100644
--- a/src/pulsecore/pstream.c
+++ b/src/pulsecore/pstream.c
@@ -682,6 +682,30 @@ fail:
     return -1;
 }
 
+static void memblock_complete(pa_pstream *p, struct pstream_read *re) {
+    pa_memchunk chunk;
+    int64_t offset;
+
+    if (!p->receive_memblock_callback)
+        return;
+
+    chunk.memblock = re->memblock;
+    chunk.index = 0;
+    chunk.length = re->index - PA_PSTREAM_DESCRIPTOR_SIZE;
+
+    offset = (int64_t) (
+             (((uint64_t) ntohl(re->descriptor[PA_PSTREAM_DESCRIPTOR_OFFSET_HI])) << 32) |
+             (((uint64_t) ntohl(re->descriptor[PA_PSTREAM_DESCRIPTOR_OFFSET_LO]))));
+
+    p->receive_memblock_callback(
+        p,
+        ntohl(re->descriptor[PA_PSTREAM_DESCRIPTOR_CHANNEL]),
+        offset,
+        ntohl(re->descriptor[PA_PSTREAM_DESCRIPTOR_FLAGS]) & PA_FLAG_SEEKMASK,
+        &chunk,
+        p->receive_memblock_callback_userdata);
+}
+
 static int do_read(pa_pstream *p, struct pstream_read *re) {
     void *d;
     size_t l;
@@ -831,47 +855,12 @@ static int do_read(pa_pstream *p, struct pstream_read *re) {
         }
 
     } else if (re->index > PA_PSTREAM_DESCRIPTOR_SIZE) {
-        /* Frame payload available */
-
-        if (re->memblock && p->receive_memblock_callback) {
-
-            /* Is this memblock data? Than pass it to the user */
-            l = (re->index - (size_t) r) < PA_PSTREAM_DESCRIPTOR_SIZE ? (size_t) (re->index - PA_PSTREAM_DESCRIPTOR_SIZE) : (size_t) r;
-
-            if (l > 0) {
-                pa_memchunk chunk;
-
-                chunk.memblock = re->memblock;
-                chunk.index = re->index - PA_PSTREAM_DESCRIPTOR_SIZE - l;
-                chunk.length = l;
-
-                if (p->receive_memblock_callback) {
-                    int64_t offset;
-
-                    offset = (int64_t) (
-                            (((uint64_t) ntohl(re->descriptor[PA_PSTREAM_DESCRIPTOR_OFFSET_HI])) << 32) |
-                            (((uint64_t) ntohl(re->descriptor[PA_PSTREAM_DESCRIPTOR_OFFSET_LO]))));
-
-                    p->receive_memblock_callback(
-                        p,
-                        ntohl(re->descriptor[PA_PSTREAM_DESCRIPTOR_CHANNEL]),
-                        offset,
-                        ntohl(re->descriptor[PA_PSTREAM_DESCRIPTOR_FLAGS]) & PA_FLAG_SEEKMASK,
-                        &chunk,
-                        p->receive_memblock_callback_userdata);
-                }
-
-                /* Drop seek info for following callbacks */
-                re->descriptor[PA_PSTREAM_DESCRIPTOR_FLAGS] =
-                    re->descriptor[PA_PSTREAM_DESCRIPTOR_OFFSET_HI] =
-                    re->descriptor[PA_PSTREAM_DESCRIPTOR_OFFSET_LO] = 0;
-            }
-        }
 
         /* Frame complete */
         if (re->index >= ntohl(re->descriptor[PA_PSTREAM_DESCRIPTOR_LENGTH]) + PA_PSTREAM_DESCRIPTOR_SIZE) {
 
             if (re->memblock) {
+                memblock_complete(p, re);
 
                 /* This was a memblock frame. We can unref the memblock now */
                 pa_memblock_unref(re->memblock);



More information about the pulseaudio-commits mailing list