23 #include "spdlog/spdlog.h"
27 , _channels( channels )
32 auto buf = (
char*)srsran_vec_malloc(
_size);
35 throw "Could not allocate memory";
39 spdlog::debug(
"Created {}-channel ringbuffer with size {}",
_channels,
_size );
45 if (buffer) free(buffer);
52 std::lock_guard<std::mutex> lock(_mutex);
53 std::vector<void*> buffers(_channels,
nullptr);
54 for (
auto ch = 0; ch < _channels; ch++) {
55 buffers[ch] = (
void*)(_buffers[ch]);
65 std::lock_guard<std::mutex> lock(_mutex);
66 std::vector<void*> buffers(_channels,
nullptr);
70 auto tail = (_head + _used) % _size;
72 *writeable = _head - tail;
74 *writeable = _size - tail;
76 for (
auto ch = 0; ch < _channels; ch++) {
77 buffers[ch] = (
void*)(_buffers[ch] + tail);
87 assert(written <= free_size());
88 std::lock_guard<std::mutex> lock(_mutex);
95 assert(dest.size() >= _channels);
96 assert(size <= used_size());
99 std::lock_guard<std::mutex> lock(_mutex);
100 auto end = (_head + size) % _size;
103 auto first_part = _size - _head;
104 auto second_part = size - first_part;
105 for (
auto ch = 0; ch < _channels; ch++) {
106 memcpy(dest[ch], _buffers[ch] + _head, first_part);
107 memcpy(dest[ch] + first_part, _buffers[ch], second_part);
110 for (
auto ch = 0; ch < _channels; ch++) {
111 memcpy(dest[ch], _buffers[ch] + _head, size);
114 _head = (_head + size) % _size;
void commit(size_t written)
void read(std::vector< char * > dest, size_t bytes)
std::vector< void * > read_head()
std::vector< char * > _buffers
std::vector< void * > write_head(size_t *writeable)
MultichannelRingbuffer(size_t size, size_t channels)
virtual ~MultichannelRingbuffer()