34 lines
893 B
C++
34 lines
893 B
C++
#include "ringbuffer.h"
|
|
#include <cstring>
|
|
#include <cmath>
|
|
|
|
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;
|
|
}
|