VIANC/pw_plugin/ringbuffer.cc

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;
}