summaryrefslogtreecommitdiff
path: root/libs/pbd/pbd/ringbuffer.h
diff options
context:
space:
mode:
Diffstat (limited to 'libs/pbd/pbd/ringbuffer.h')
-rw-r--r--libs/pbd/pbd/ringbuffer.h130
1 files changed, 66 insertions, 64 deletions
diff --git a/libs/pbd/pbd/ringbuffer.h b/libs/pbd/pbd/ringbuffer.h
index 9b5b09651e..bed9e829fb 100644
--- a/libs/pbd/pbd/ringbuffer.h
+++ b/libs/pbd/pbd/ringbuffer.h
@@ -30,16 +30,18 @@ namespace PBD {
template<class T>
class /*LIBPBD_API*/ RingBuffer
{
- public:
+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<<power_of_two < sz; power_of_two++) {}
- size = 1<<power_of_two;
- size_mask = size;
- size_mask -= 1;
- buf = new T[size];
- reset ();
+#if 0
+ size = ffs(sz); /* find first [bit] set is a single inlined assembly instruction. But it looks like the API rounds up so... */
+#endif
+ guint power_of_two;
+ for (power_of_two = 1; 1U<<power_of_two < sz; power_of_two++) {}
+ size = 1<<power_of_two;
+ size_mask = size;
+ size_mask -= 1;
+ buf = new T[size];
+ reset ();
}
virtual ~RingBuffer() {
@@ -62,8 +64,8 @@ class /*LIBPBD_API*/ RingBuffer
guint write (T const * src, guint cnt);
struct rw_vector {
- T *buf[2];
- guint len[2];
+ T *buf[2];
+ guint len[2];
};
void get_read_vector (rw_vector *);
@@ -114,7 +116,7 @@ class /*LIBPBD_API*/ RingBuffer
guint get_read_idx () const { return g_atomic_int_get (&read_idx); }
guint bufsize () const { return size; }
- protected:
+protected:
T *buf;
guint size;
mutable gint write_idx;
@@ -125,80 +127,80 @@ class /*LIBPBD_API*/ RingBuffer
template<class T> /*LIBPBD_API*/ guint
RingBuffer<T>::read (T *dest, guint cnt)
{
- guint free_cnt;
- guint cnt2;
- guint to_read;
- guint n1, n2;
- guint priv_read_idx;
+ guint free_cnt;
+ guint cnt2;
+ guint to_read;
+ guint n1, n2;
+ guint priv_read_idx;
- priv_read_idx=g_atomic_int_get(&read_idx);
+ priv_read_idx=g_atomic_int_get(&read_idx);
- if ((free_cnt = read_space ()) == 0) {
- return 0;
- }
+ if ((free_cnt = read_space ()) == 0) {
+ return 0;
+ }
- to_read = cnt > free_cnt ? free_cnt : cnt;
+ to_read = cnt > free_cnt ? free_cnt : cnt;
- cnt2 = priv_read_idx + to_read;
+ cnt2 = priv_read_idx + to_read;
- if (cnt2 > size) {
- n1 = size - priv_read_idx;
- n2 = cnt2 & size_mask;
- } else {
- n1 = to_read;
- n2 = 0;
- }
+ if (cnt2 > size) {
+ n1 = size - priv_read_idx;
+ n2 = cnt2 & size_mask;
+ } else {
+ n1 = to_read;
+ n2 = 0;
+ }
- memcpy (dest, &buf[priv_read_idx], n1 * sizeof (T));
- priv_read_idx = (priv_read_idx + n1) & size_mask;
+ memcpy (dest, &buf[priv_read_idx], n1 * sizeof (T));
+ priv_read_idx = (priv_read_idx + n1) & size_mask;
- if (n2) {
- memcpy (dest+n1, buf, n2 * sizeof (T));
- priv_read_idx = n2;
- }
+ if (n2) {
+ memcpy (dest+n1, buf, n2 * sizeof (T));
+ priv_read_idx = n2;
+ }
- g_atomic_int_set(&read_idx, priv_read_idx);
- return to_read;
+ g_atomic_int_set(&read_idx, priv_read_idx);
+ return to_read;
}
template<class T> /*LIBPBD_API*/ guint
RingBuffer<T>::write (T const *src, guint cnt)
{
- guint free_cnt;
- guint cnt2;
- guint to_write;
- guint n1, n2;
- guint priv_write_idx;
+ guint free_cnt;
+ guint cnt2;
+ guint to_write;
+ guint n1, n2;
+ guint priv_write_idx;
- priv_write_idx=g_atomic_int_get(&write_idx);
+ priv_write_idx=g_atomic_int_get(&write_idx);
- if ((free_cnt = write_space ()) == 0) {
- return 0;
- }
+ if ((free_cnt = write_space ()) == 0) {
+ return 0;
+ }
- to_write = cnt > free_cnt ? free_cnt : cnt;
+ to_write = cnt > free_cnt ? free_cnt : cnt;
- cnt2 = priv_write_idx + to_write;
+ cnt2 = priv_write_idx + to_write;
- if (cnt2 > size) {
- n1 = size - priv_write_idx;
- n2 = cnt2 & size_mask;
- } else {
- n1 = to_write;
- n2 = 0;
- }
+ if (cnt2 > size) {
+ n1 = size - priv_write_idx;
+ n2 = cnt2 & size_mask;
+ } else {
+ n1 = to_write;
+ n2 = 0;
+ }
- memcpy (&buf[priv_write_idx], src, n1 * sizeof (T));
- priv_write_idx = (priv_write_idx + n1) & size_mask;
+ memcpy (&buf[priv_write_idx], src, n1 * sizeof (T));
+ priv_write_idx = (priv_write_idx + n1) & size_mask;
- if (n2) {
- memcpy (buf, src+n1, n2 * sizeof (T));
- priv_write_idx = n2;
- }
+ if (n2) {
+ memcpy (buf, src+n1, n2 * sizeof (T));
+ priv_write_idx = n2;
+ }
- g_atomic_int_set(&write_idx, priv_write_idx);
- return to_write;
+ g_atomic_int_set(&write_idx, priv_write_idx);
+ return to_write;
}
template<class T> /*LIBPBD_API*/ void