diff options
Diffstat (limited to 'libs/pbd/pbd/ringbuffer.h')
-rw-r--r-- | libs/pbd/pbd/ringbuffer.h | 130 |
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 |