]> code.delx.au - pulseaudio/blobdiff - src/pulsecore/memchunk.c
remap: Change remapping function argument type from void to int16_t / float as approp...
[pulseaudio] / src / pulsecore / memchunk.c
index 1dbad2b909324cb12caf1fbbc3a91f3cedd6bce7..5f8545f8df013ff9d723b0750c820d9443477c42 100644 (file)
@@ -1,18 +1,18 @@
-/* $Id$ */
-
 /***
   This file is part of PulseAudio.
+
+  Copyright 2004-2006 Lennart Poettering
+
   PulseAudio is free software; you can redistribute it and/or modify
   it under the terms of the GNU Lesser General Public License as
   published by the Free Software Foundation; either version 2.1 of the
   License, or (at your option) any later version.
+
   PulseAudio is distributed in the hope that it will be useful, but
   WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
   Lesser General Public License for more details.
+
   You should have received a copy of the GNU Lesser General Public
   License along with PulseAudio; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
 
 #include <stdio.h>
 #include <stdlib.h>
-#include <assert.h>
 #include <string.h>
+#include <errno.h>
 
-#include <pulse/xmalloc.h>
+#include <pulsecore/macro.h>
+#include <pulsecore/core-util.h>
 
 #include "memchunk.h"
 
-void pa_memchunk_make_writable(pa_memchunk *c, size_t min) {
+pa_memchunk* pa_memchunk_make_writable(pa_memchunk *c, size_t min) {
     pa_memblock *n;
     size_t l;
-    
-    assert(c);
-    assert(c->memblock);
-    assert(PA_REFCNT_VALUE(c->memblock) > 0);
-
-    if (PA_REFCNT_VALUE(c->memblock) == 1 &&
-        !c->memblock->read_only &&
-        c->memblock->length >= c->index+min)
-        return;
-
-    l = c->length;
-    if (l < min)
-        l = min;
-    
-    n = pa_memblock_new(c->memblock->pool, l);
-    memcpy(n->data, (uint8_t*) c->memblock->data + c->index, c->length);
+    void *tdata, *sdata;
+
+    pa_assert(c);
+    pa_assert(c->memblock);
+
+    if (pa_memblock_ref_is_one(c->memblock) &&
+        !pa_memblock_is_read_only(c->memblock) &&
+        pa_memblock_get_length(c->memblock) >= c->index+min)
+        return c;
+
+    l = PA_MAX(c->length, min);
+
+    n = pa_memblock_new(pa_memblock_get_pool(c->memblock), l);
+
+    sdata = pa_memblock_acquire(c->memblock);
+    tdata = pa_memblock_acquire(n);
+
+    memcpy(tdata, (uint8_t*) sdata + c->index, c->length);
+
+    pa_memblock_release(c->memblock);
+    pa_memblock_release(n);
+
     pa_memblock_unref(c->memblock);
+
     c->memblock = n;
     c->index = 0;
+
+    return c;
+}
+
+pa_memchunk* pa_memchunk_reset(pa_memchunk *c) {
+    pa_assert(c);
+
+    memset(c, 0, sizeof(*c));
+
+    return c;
+}
+
+pa_memchunk *pa_memchunk_will_need(const pa_memchunk *c) {
+    void *p;
+
+    pa_assert(c);
+    pa_assert(c->memblock);
+
+    /* A version of pa_memblock_will_need() that works on memchunks
+     * instead of memblocks */
+
+    p = pa_memblock_acquire_chunk(c);
+    pa_will_need(p, c->length);
+    pa_memblock_release(c->memblock);
+
+    return (pa_memchunk*) c;
+}
+
+pa_memchunk* pa_memchunk_memcpy(pa_memchunk *dst, pa_memchunk *src) {
+    void *p, *q;
+
+    pa_assert(dst);
+    pa_assert(src);
+    pa_assert(dst->length == src->length);
+
+    p = pa_memblock_acquire(dst->memblock);
+    q = pa_memblock_acquire(src->memblock);
+
+    memmove((uint8_t*) p + dst->index,
+            (uint8_t*) q + src->index,
+            dst->length);
+
+    pa_memblock_release(dst->memblock);
+    pa_memblock_release(src->memblock);
+
+    return dst;
 }
 
-void pa_memchunk_reset(pa_memchunk *c) {
-    assert(c);
+bool pa_memchunk_isset(pa_memchunk *chunk) {
+    assert(chunk);
 
-    c->memblock = NULL;
-    c->length = c->index = 0;
+    return
+        chunk->memblock ||
+        chunk->index > 0 ||
+        chunk->length > 0;
 }