39 lines
819 B
C++
39 lines
819 B
C++
#ifndef DMX_TRIPLE_BUFFER_H
|
|
#define DMX_TRIPLE_BUFFER_H
|
|
|
|
struct InternalBuffer {
|
|
char data[512] = {0};
|
|
bool is_fresh = false;
|
|
};
|
|
|
|
class DMXTripleBuffer
|
|
{
|
|
public:
|
|
|
|
DMXTripleBuffer() {
|
|
fill_buffer = &_buffers[0];
|
|
drain_buffer = &_buffers[1];
|
|
off_buffer = &_buffers[2];
|
|
}
|
|
|
|
void on_fill_complete() {
|
|
fill_pos = 0;
|
|
fill_buffer->is_fresh = true;
|
|
std::swap(fill_buffer, off_buffer);
|
|
}
|
|
|
|
void on_drain_complete() {
|
|
drain_pos = 0;
|
|
drain_buffer->is_fresh = false;
|
|
if (off_buffer->is_fresh) {
|
|
std::swap(drain_buffer, off_buffer);
|
|
}
|
|
}
|
|
InternalBuffer *fill_buffer, *drain_buffer, *off_buffer;
|
|
size_t fill_pos = 0, drain_pos = 0;
|
|
|
|
private:
|
|
InternalBuffer _buffers[3];
|
|
};
|
|
|
|
#endif |