5G-MAG Reference Tools - MBMS Modem
Public Member Functions | Private Attributes | List of all members
MultichannelRingbuffer Class Reference

#include <MultichannelRingbuffer.h>

Collaboration diagram for MultichannelRingbuffer:
Collaboration graph

Public Member Functions

 MultichannelRingbuffer (size_t size, size_t channels)
 
virtual ~MultichannelRingbuffer ()
 
size_t free_size ()
 
size_t used_size ()
 
size_t capacity ()
 
void clear ()
 
std::vector< void * > write_head (size_t *writeable)
 
void commit (size_t written)
 
void read (std::vector< char * > dest, size_t bytes)
 

Private Attributes

std::vector< char * > _buffers
 
size_t _size
 
size_t _channels
 
size_t _head
 
size_t _used
 
std::mutex _mutex
 

Detailed Description

Definition at line 25 of file MultichannelRingbuffer.h.

Constructor & Destructor Documentation

◆ MultichannelRingbuffer()

MultichannelRingbuffer::MultichannelRingbuffer ( size_t  size,
size_t  channels 
)
explicit

Definition at line 25 of file MultichannelRingbuffer.cpp.

26  : _size( size )
27  , _channels( channels )
28  , _used( 0 )
29  , _head( 0 )
30 {
31  for (auto ch = 0; ch < _channels; ch++) {
32  auto buf = (char*)malloc(_size);
33  if (buf == nullptr) {
34  throw "Could not allocate memory";
35  }
36  _buffers.push_back(buf);
37  }
38  spdlog::debug("Created {}-channel ringbuffer with size {}", _channels, _size );
39 }
std::vector< char * > _buffers

◆ ~MultichannelRingbuffer()

MultichannelRingbuffer::~MultichannelRingbuffer ( )
virtual

Definition at line 41 of file MultichannelRingbuffer.cpp.

42 {
43  for (auto buffer : _buffers) {
44  if (buffer) free(buffer);
45  }
46 }

Member Function Documentation

◆ capacity()

size_t MultichannelRingbuffer::capacity ( )
inline

Definition at line 32 of file MultichannelRingbuffer.h.

32 { std::lock_guard<std::mutex> lock(_mutex);return _size; }

◆ clear()

void MultichannelRingbuffer::clear ( )
inline

Definition at line 34 of file MultichannelRingbuffer.h.

34 {std::lock_guard<std::mutex> lock(_mutex); _head = _used = 0; };

◆ commit()

auto MultichannelRingbuffer::commit ( size_t  written)

Definition at line 70 of file MultichannelRingbuffer.cpp.

71 {
72  assert(written >= 0);
73  assert(written <= free_size());
74  std::lock_guard<std::mutex> lock(_mutex);
75  _used += written;
76 // _mutex.unlock();
77 }

◆ free_size()

size_t MultichannelRingbuffer::free_size ( )
inline

Definition at line 30 of file MultichannelRingbuffer.h.

30 { std::lock_guard<std::mutex> lock(_mutex); return _size - _used; }

◆ read()

auto MultichannelRingbuffer::read ( std::vector< char * >  dest,
size_t  bytes 
)

Definition at line 79 of file MultichannelRingbuffer.cpp.

80 {
81  assert(dest.size() >= _channels);
82  assert(size <= used_size());
83  assert(size >= 0);
84 
85  std::lock_guard<std::mutex> lock(_mutex);
86  auto end = (_head + size) % _size;
87 
88  if (end <= _head) {
89  auto first_part = _size - _head;
90  auto second_part = size - first_part;
91  for (auto ch = 0; ch < _channels; ch++) {
92  memcpy(dest[ch], _buffers[ch] + _head, first_part);
93  memcpy(dest[ch] + first_part, _buffers[ch], second_part);
94  }
95  } else {
96  for (auto ch = 0; ch < _channels; ch++) {
97  memcpy(dest[ch], _buffers[ch] + _head, size);
98  }
99  }
100  _head = (_head + size) % _size;
101  _used -= size;
102 }

◆ used_size()

size_t MultichannelRingbuffer::used_size ( )
inline

Definition at line 31 of file MultichannelRingbuffer.h.

31 { std::lock_guard<std::mutex> lock(_mutex); return _used; }

◆ write_head()

auto MultichannelRingbuffer::write_head ( size_t *  writeable)

Definition at line 48 of file MultichannelRingbuffer.cpp.

49 {
50 // _mutex.lock();
51  std::lock_guard<std::mutex> lock(_mutex);
52  std::vector<void*> buffers(_channels, nullptr);
53  if (_size == _used) {
54  *writeable = 0;
55  } else {
56  auto tail = (_head + _used) % _size;
57  if (tail < _head) {
58  *writeable = _head - tail;
59  } else {
60  *writeable = _size - tail;
61  }
62  for (auto ch = 0; ch < _channels; ch++) {
63  buffers[ch] = (void*)(_buffers[ch] + tail);
64  }
65  }
66 
67  return buffers;
68 }

Member Data Documentation

◆ _buffers

std::vector<char*> MultichannelRingbuffer::_buffers
private

Definition at line 42 of file MultichannelRingbuffer.h.

◆ _channels

size_t MultichannelRingbuffer::_channels
private

Definition at line 44 of file MultichannelRingbuffer.h.

◆ _head

size_t MultichannelRingbuffer::_head
private

Definition at line 45 of file MultichannelRingbuffer.h.

◆ _mutex

std::mutex MultichannelRingbuffer::_mutex
private

Definition at line 47 of file MultichannelRingbuffer.h.

◆ _size

size_t MultichannelRingbuffer::_size
private

Definition at line 43 of file MultichannelRingbuffer.h.

◆ _used

size_t MultichannelRingbuffer::_used
private

Definition at line 46 of file MultichannelRingbuffer.h.


The documentation for this class was generated from the following files: