38 for (power_of_two = 1; 1U << power_of_two < sz; ++power_of_two);
39 return 1U << power_of_two;
138 size_t read (T *dest,
size_t cnt,
bool commit =
true,
size_t offset = 0);
141 size_t write (T
const * src,
size_t cnt);
159 cnt = std::min (cnt, res);
186 }
else if (cnt < 0) {
187 return reserved.load () >= (size_t) -cnt;
214 template<
class T>
size_t
217 size_t w = write_idx.load ();
218 const size_t free_cnt = write_space ();
224 const size_t to_write = cnt > free_cnt ? free_cnt : cnt;
225 const size_t cnt2 = w + to_write;
230 n2 = cnt2 & size_mask;
236 memcpy (&buf[w], src, n1 *
sizeof (T));
237 w = (w + n1) & size_mask;
240 memcpy (buf, src+n1, n2 *
sizeof (T));
248 template<
class T>
size_t
251 size_t w = write_idx.load ();
252 const size_t free_cnt = write_space ();
258 const size_t to_write = cnt > free_cnt ? free_cnt : cnt;
259 const size_t cnt2 = w + to_write;
264 n2 = cnt2 & size_mask;
270 memset (&buf[w], 0, n1 *
sizeof (T));
271 w = (w + n1) & size_mask;
274 memset (buf, 0, n2 *
sizeof (T));
282 template<
class T>
size_t
291 size_t r = read_idx.load ();
292 const size_t w = write_idx.load ();
294 size_t free_cnt = (w > r) ? (w - r) : ((w - r + size) & size_mask);
296 if (!commit && offset > 0) {
297 if (offset > free_cnt) {
301 r = (r + offset) & size_mask;
304 const size_t to_read = cnt > free_cnt ? free_cnt : cnt;
306 const size_t cnt2 = r + to_read;
311 n2 = cnt2 & size_mask;
317 memcpy (dest, &buf[r], n1 *
sizeof (T));
318 r = (r + n1) & size_mask;
321 memcpy (dest + n1, buf, n2 *
sizeof (T));
328 reserved.store (std::min (reservation, reserved.load () + to_read));
spinlock_t _reservation_lock
bool can_seek(int64_t cnt)
size_t reservation_size() const
virtual ~PlaybackBuffer()
static size_t power_of_two_size(size_t sz)
size_t decrement_read_ptr(size_t cnt)
std::atomic< size_t > read_idx
std::atomic< size_t > write_idx
size_t read(T *dest, size_t cnt, bool commit=true, size_t offset=0)
size_t read_space() const
size_t increment_read_ptr(size_t cnt)
std::atomic< size_t > reserved
PlaybackBuffer(size_t sz, size_t res=8191)
size_t write(T const *src, size_t cnt)
size_t write_zero(size_t cnt)
size_t reserved_size() const
size_t write_space() const
void align_to(PlaybackBuffer const &other)
size_t overwritable_at(size_t r) const
size_t increment_write_ptr(size_t cnt)
void memset(float *data, const float val, const uint32_t n_samples)