Collect plugin runtime profile statistics.
[ardour.git] / libs / ardour / lv2_evbuf.c
index f3aea8d7993be516a7a4c49eaeb33e5c51b397fd..b487e1fea9ee9880d71c80c7340190f002cc58a2 100644 (file)
@@ -14,6 +14,7 @@
   OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */
 
+#include <assert.h>
 #include <string.h>
 #include <stdlib.h>
 
@@ -89,7 +90,7 @@ lv2_evbuf_reset(LV2_Evbuf* evbuf, bool input)
                break;
        case LV2_EVBUF_ATOM:
                if (input) {
-                       evbuf->buf.atom.atom.size = 0;
+                       evbuf->buf.atom.atom.size = sizeof(LV2_Atom_Sequence_Body);
                        evbuf->buf.atom.atom.type = evbuf->atom_Sequence;
                } else {
                        evbuf->buf.atom.atom.size = evbuf->capacity;
@@ -105,13 +106,21 @@ lv2_evbuf_get_size(LV2_Evbuf* evbuf)
        case LV2_EVBUF_EVENT:
                return evbuf->buf.event.size;
        case LV2_EVBUF_ATOM:
+               assert(evbuf->buf.atom.atom.type != evbuf->atom_Sequence
+                      || evbuf->buf.atom.atom.size >= sizeof(LV2_Atom_Sequence_Body));
                return evbuf->buf.atom.atom.type == evbuf->atom_Sequence
-                       ? evbuf->buf.atom.atom.size
+                       ? evbuf->buf.atom.atom.size - sizeof(LV2_Atom_Sequence_Body)
                        : 0;
        }
        return 0;
 }
 
+uint32_t
+lv2_evbuf_get_capacity(LV2_Evbuf* evbuf)
+{
+       return evbuf->capacity;
+}
+
 void*
 lv2_evbuf_get_buffer(LV2_Evbuf* evbuf)
 {
@@ -134,7 +143,7 @@ lv2_evbuf_begin(LV2_Evbuf* evbuf)
 LV2_Evbuf_Iterator
 lv2_evbuf_end(LV2_Evbuf* evbuf)
 {
-       const size_t             size = lv2_evbuf_get_size(evbuf);
+       const uint32_t           size = lv2_evbuf_get_size(evbuf);
        const LV2_Evbuf_Iterator iter = { evbuf, lv2_evbuf_pad_size(size) };
        return iter;
 }
@@ -157,13 +166,13 @@ lv2_evbuf_next(LV2_Evbuf_Iterator iter)
        uint32_t   size;
        switch (evbuf->type) {
        case LV2_EVBUF_EVENT:
-               size    = ((LV2_Event*)(evbuf->buf.event.data + offset))->size;
+               size    = ((LV2_Event*)((uintptr_t)(evbuf->buf.event.data + offset)))->size;
                offset += lv2_evbuf_pad_size(sizeof(LV2_Event) + size);
                break;
        case LV2_EVBUF_ATOM:
-               size = ((LV2_Atom_Event*)
+               size = ((LV2_Atom_Event*)((uintptr_t)
                        ((char*)LV2_ATOM_CONTENTS(LV2_Atom_Sequence, &evbuf->buf.atom)
-                        + offset))->body.size;
+                        + offset)))->body.size;
                offset += lv2_evbuf_pad_size(sizeof(LV2_Atom_Event) + size);
                break;
        }
@@ -174,13 +183,13 @@ lv2_evbuf_next(LV2_Evbuf_Iterator iter)
 
 bool
 lv2_evbuf_get(LV2_Evbuf_Iterator iter,
-              uint32_t*          frames,
+              uint32_t*          samples,
               uint32_t*          subframes,
               uint32_t*          type,
               uint32_t*          size,
               uint8_t**          data)
 {
-       *frames = *subframes = *type = *size = 0;
+       *samples = *subframes = *type = *size = 0;
        *data = NULL;
 
        if (!lv2_evbuf_is_valid(iter)) {
@@ -194,8 +203,8 @@ lv2_evbuf_get(LV2_Evbuf_Iterator iter,
        switch (iter.evbuf->type) {
        case LV2_EVBUF_EVENT:
                ebuf = &iter.evbuf->buf.event;
-               ev = (LV2_Event*)ebuf->data + iter.offset;
-               *frames    = ev->frames;
+               ev = (LV2_Event*)((uintptr_t)((char*)ebuf->data + iter.offset));
+               *samples    = ev->frames;
                *subframes = ev->subframes;
                *type      = ev->type;
                *size      = ev->size;
@@ -203,14 +212,14 @@ lv2_evbuf_get(LV2_Evbuf_Iterator iter,
                break;
        case LV2_EVBUF_ATOM:
                aseq = (LV2_Atom_Sequence*)&iter.evbuf->buf.atom;
-               aev = (LV2_Atom_Event*)(
+               aev = (LV2_Atom_Event*)((uintptr_t)(
                        (char*)LV2_ATOM_CONTENTS(LV2_Atom_Sequence, aseq)
-                       + iter.offset);
-               *frames    = aev->time.frames;
+                       + iter.offset));
+               *samples    = aev->time.frames;
                *subframes = 0;
                *type      = aev->body.type;
                *size      = aev->body.size;
-               *data      = LV2_ATOM_BODY(&aev->body);
+               *data      = (uint8_t*)LV2_ATOM_BODY(&aev->body);
                break;
        }
 
@@ -219,7 +228,7 @@ lv2_evbuf_get(LV2_Evbuf_Iterator iter,
 
 bool
 lv2_evbuf_write(LV2_Evbuf_Iterator* iter,
-                uint32_t            frames,
+                uint32_t            samples,
                 uint32_t            subframes,
                 uint32_t            type,
                 uint32_t            size,
@@ -236,8 +245,8 @@ lv2_evbuf_write(LV2_Evbuf_Iterator* iter,
                        return false;
                }
 
-               ev = (LV2_Event*)(ebuf->data + iter->offset);
-               ev->frames    = frames;
+               ev = (LV2_Event*)((uintptr_t)(ebuf->data + iter->offset));
+               ev->frames    = samples;
                ev->subframes = subframes;
                ev->type      = type;
                ev->size      = size;
@@ -255,10 +264,10 @@ lv2_evbuf_write(LV2_Evbuf_Iterator* iter,
                        return false;
                }
 
-               aev = (LV2_Atom_Event*)(
+               aev = (LV2_Atom_Event*)((uintptr_t)(
                        (char*)LV2_ATOM_CONTENTS(LV2_Atom_Sequence, aseq)
-                       + iter->offset);
-               aev->time.frames = frames;
+                       + iter->offset));
+               aev->time.frames = samples;
                aev->body.type   = type;
                aev->body.size   = size;
                memcpy(LV2_ATOM_BODY(&aev->body), data, size);
@@ -267,6 +276,8 @@ lv2_evbuf_write(LV2_Evbuf_Iterator* iter,
                aseq->atom.size += size;
                iter->offset    += size;
                break;
+       default:
+               return false;
        }
 
        return true;