#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