]> code.delx.au - pulseaudio/commitdiff
Solaris: debug my latest enbugging, take 2
authorFinn Thain <fthain@telegraphics.com.au>
Mon, 24 Aug 2009 17:47:59 +0000 (03:47 +1000)
committerLennart Poettering <lennart@poettering.net>
Tue, 25 Aug 2009 01:18:50 +0000 (03:18 +0200)
Prevent partially played memchunks from getting lost.
If the sink has a memblock, don't leak it when rewinding.

src/modules/module-solaris.c

index 71f14071e813547661d50126e7961d0749e13502..b0d4db43e89992b82ecc8453cdb1a891615f26c0 100644 (file)
@@ -600,6 +600,10 @@ static void process_rewind(struct userdata *u) {
         pa_log_debug("Requested to rewind %lu bytes.", (unsigned long) rewind_nbytes);
         rewind_nbytes = PA_MIN(u->memchunk.length, rewind_nbytes);
         u->memchunk.length -= rewind_nbytes;
+        if (u->memchunk.length <= 0 && u->memchunk.memblock) {
+            pa_memblock_unref(u->memchunk.memblock);
+            pa_memchunk_reset(&u->memchunk);
+        }
         pa_log_debug("Rewound %lu bytes.", (unsigned long) rewind_nbytes);
     }
 
@@ -671,8 +675,8 @@ static void thread_func(void *userdata) {
                 if (len < (size_t) u->minimum_request)
                     break;
 
-                if (u->memchunk.length < len)
-                    pa_sink_render(u->sink, len - u->memchunk.length, &u->memchunk);
+                if (!u->memchunk.length)
+                    pa_sink_render(u->sink, u->sink->thread_info.max_request, &u->memchunk);
 
                 len = PA_MIN(u->memchunk.length, len);