X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fpbd%2Fpbd%2Fringbuffer.h;h=58c463ecbe5373ea344f0a536a1c17930ffea39a;hb=00b8cff66fb971ead1a54e4b11e6dd869256461b;hp=a84ed73e7f951db51b84d53fbaac244873ceb72e;hpb=fd824717a73676e2da3ff05eaba3dd4214239863;p=ardour.git diff --git a/libs/pbd/pbd/ringbuffer.h b/libs/pbd/pbd/ringbuffer.h index a84ed73e7f..58c463ecbe 100644 --- a/libs/pbd/pbd/ringbuffer.h +++ b/libs/pbd/pbd/ringbuffer.h @@ -23,22 +23,23 @@ #include #include +#include "pbd/libpbd_visibility.h" + template -class RingBuffer +class /*LIBPBD_API*/ RingBuffer { public: RingBuffer (guint sz) { // size = ffs(sz); /* find first [bit] set is a single inlined assembly instruction. But it looks like the API rounds up so... */ guint power_of_two; - for (power_of_two = 1; 1U< r) { return ((r - w + size) & size_mask) - 1; } else if (w < r) { @@ -92,13 +93,13 @@ class RingBuffer return size - 1; } } - - guint read_space () { + + guint read_space () const { guint w, r; - + w = g_atomic_int_get (&write_idx); r = g_atomic_int_get (&read_idx); - + if (w > r) { return w - r; } else { @@ -119,7 +120,7 @@ class RingBuffer guint size_mask; }; -template guint +template /*LIBPBD_API*/ guint RingBuffer::read (T *dest, guint cnt) { guint free_cnt; @@ -135,7 +136,7 @@ RingBuffer::read (T *dest, guint cnt) } to_read = cnt > free_cnt ? free_cnt : cnt; - + cnt2 = priv_read_idx + to_read; if (cnt2 > size) { @@ -145,7 +146,7 @@ RingBuffer::read (T *dest, guint cnt) n1 = to_read; n2 = 0; } - + memcpy (dest, &buf[priv_read_idx], n1 * sizeof (T)); priv_read_idx = (priv_read_idx + n1) & size_mask; @@ -158,8 +159,8 @@ RingBuffer::read (T *dest, guint cnt) return to_read; } -template guint -RingBuffer::write (T *src, guint cnt) +template /*LIBPBD_API*/ guint +RingBuffer::write (T const *src, guint cnt) { guint free_cnt; @@ -175,7 +176,7 @@ RingBuffer::write (T *src, guint cnt) } to_write = cnt > free_cnt ? free_cnt : cnt; - + cnt2 = priv_write_idx + to_write; if (cnt2 > size) { @@ -198,17 +199,17 @@ RingBuffer::write (T *src, guint cnt) return to_write; } -template void -RingBuffer::get_read_vector (RingBuffer::rw_vector *vec) +template /*LIBPBD_API*/ void +RingBuffer::get_read_vector (typename RingBuffer::rw_vector *vec) { guint free_cnt; guint cnt2; guint w, r; - + w = g_atomic_int_get (&write_idx); r = g_atomic_int_get (&read_idx); - + if (w > r) { free_cnt = w - r; } else { @@ -219,7 +220,7 @@ RingBuffer::get_read_vector (RingBuffer::rw_vector *vec) if (cnt2 > size) { /* Two part vector: the rest of the buffer after the - current write ptr, plus some from the start of + current write ptr, plus some from the start of the buffer. */ @@ -229,26 +230,27 @@ RingBuffer::get_read_vector (RingBuffer::rw_vector *vec) vec->len[1] = cnt2 & size_mask; } else { - + /* Single part vector: just the rest of the buffer */ - + vec->buf[0] = &buf[r]; vec->len[0] = free_cnt; + vec->buf[1] = 0; vec->len[1] = 0; } } -template void -RingBuffer::get_write_vector (RingBuffer::rw_vector *vec) +template /*LIBPBD_API*/ void +RingBuffer::get_write_vector (typename RingBuffer::rw_vector *vec) { guint free_cnt; guint cnt2; guint w, r; - + w = g_atomic_int_get (&write_idx); r = g_atomic_int_get (&read_idx); - + if (w > r) { free_cnt = ((r - w + size) & size_mask) - 1; } else if (w < r) { @@ -256,13 +258,13 @@ RingBuffer::get_write_vector (RingBuffer::rw_vector *vec) } else { free_cnt = size - 1; } - + cnt2 = w + free_cnt; if (cnt2 > size) { - + /* Two part vector: the rest of the buffer after the - current write ptr, plus some from the start of + current write ptr, plus some from the start of the buffer. */