20 #ifndef playback_buffer_h
21 #define playback_buffer_h
40 for (power_of_two = 1; 1U << power_of_two < sz; ++power_of_two);
41 return 1U << power_of_two;
140 size_t read (T *dest,
size_t cnt,
bool commit =
true,
size_t offset = 0);
143 size_t write (T
const * src,
size_t cnt);
161 cnt = std::min (cnt, res);
188 }
else if (cnt < 0) {
189 return reserved.load () >= (size_t) -cnt;
216 template<
class T>
size_t
219 size_t w = write_idx.load ();
220 const size_t free_cnt = write_space ();
226 const size_t to_write = cnt > free_cnt ? free_cnt : cnt;
227 const size_t cnt2 = w + to_write;
232 n2 = cnt2 & size_mask;
238 memcpy (&buf[w], src, n1 *
sizeof (T));
239 w = (w + n1) & size_mask;
242 memcpy (buf, src+n1, n2 *
sizeof (T));
250 template<
class T>
size_t
253 size_t w = write_idx.load ();
254 const size_t free_cnt = write_space ();
260 const size_t to_write = cnt > free_cnt ? free_cnt : cnt;
261 const size_t cnt2 = w + to_write;
266 n2 = cnt2 & size_mask;
272 memset (&buf[w], 0, n1 *
sizeof (T));
273 w = (w + n1) & size_mask;
276 memset (buf, 0, n2 *
sizeof (T));
284 template<
class T>
size_t
293 size_t r = read_idx.load ();
294 const size_t w = write_idx.load ();
296 size_t free_cnt = (w > r) ? (w - r) : ((w - r + size) & size_mask);
298 if (!commit && offset > 0) {
299 if (offset > free_cnt) {
303 r = (r + offset) & size_mask;
306 const size_t to_read = cnt > free_cnt ? free_cnt : cnt;
308 const size_t cnt2 = r + to_read;
313 n2 = cnt2 & size_mask;
319 memcpy (dest, &buf[r], n1 *
sizeof (T));
320 r = (r + n1) & size_mask;
323 memcpy (dest + n1, buf, n2 *
sizeof (T));
330 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)
Glib::Threads::Mutex _reset_lock
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)