]> code.delx.au - pulseaudio/blobdiff - src/pulsecore/sound-file-stream.c
rework memory block management to be thread-safe and mostly lock-free.
[pulseaudio] / src / pulsecore / sound-file-stream.c
index e6f24a795f2fc2a0f24f36b1b9138569194aac51..d2ffeeeda0f08dcc9f4f79490f2cfc90a36b3f44 100644 (file)
@@ -74,21 +74,26 @@ static int sink_input_peek(pa_sink_input *i, pa_memchunk *chunk) {
     if (!u->memchunk.memblock) {
         uint32_t fs = pa_frame_size(&i->sample_spec);
         sf_count_t n;
+        void *p;
 
         u->memchunk.memblock = pa_memblock_new(i->sink->core->mempool, BUF_SIZE);
         u->memchunk.index = 0;
 
+        p = pa_memblock_acquire(u->memchunk.memblock);
+        
         if (u->readf_function) {
-            if ((n = u->readf_function(u->sndfile, u->memchunk.memblock->data, BUF_SIZE/fs)) <= 0)
+            if ((n = u->readf_function(u->sndfile, p, BUF_SIZE/fs)) <= 0)
                 n = 0;
 
             u->memchunk.length = n * fs;
         } else {
-            if ((n = sf_read_raw(u->sndfile, u->memchunk.memblock->data, BUF_SIZE)) <= 0)
+            if ((n = sf_read_raw(u->sndfile, p, BUF_SIZE)) <= 0)
                 n = 0;
             
             u->memchunk.length = n;
         }
+
+        pa_memblock_release(u->memchunk.memblock);
         
         if (!u->memchunk.length) {
             free_userdata(u);