#include "ringbuffer.h" #include #include void ringbuffer::enqueue(float* data, size_t nframes) { size_t n = 2*nframes; // Convert to float values enqueue_time += n; size_t fst_transac = std::min(bsize - w_head_pos, n); std::memcpy(&buffer[w_head_pos], data, sizeof(float)*fst_transac); if(fst_transac < n) { size_t snd_transac = n - fst_transac; std::memcpy(&buffer[0], &data[fst_transac], sizeof(float)*snd_transac); w_head_pos = snd_transac; } else { w_head_pos += n; } } size_t ringbuffer::dequeue(float* data, size_t nframes, bool left_mask, bool right_mask) { size_t i = 0; for(; i < nframes; ++i) { if(enqueue_time <= dequeue_time) break; dequeue_time += 2; if(left_mask) {*data++ = buffer[r_head_pos];} if(right_mask) {*data++ = buffer[r_head_pos+1];} r_head_pos += 2; if(r_head_pos >= bsize) {r_head_pos -= bsize;} } return i; }