Sound Byte Libs 29c5ff3
C++ firmware library for audio applications on 32-bit ARM Cortex-M processors
Loading...
Searching...
No Matches
Public Member Functions | List of all members
sbl::primitives::buffers::RingBuffer< T, Size, MemoryBarrierImpl > Class Template Reference

Lock-free single-producer-single-consumer ring buffer. More...

#include <ring_buffer.hpp>

Collaboration diagram for sbl::primitives::buffers::RingBuffer< T, Size, MemoryBarrierImpl >:

Public Member Functions

 RingBuffer ()
 Construct empty ring buffer.
 
bool push (const T &item)
 Push element to buffer (producer side)
 
bool pop (T &item)
 Pop element from buffer (consumer side)
 
bool empty () const
 Check if buffer is empty.
 
bool full () const
 Check if buffer is full.
 
uint32_t size () const
 Get number of elements in buffer.
 
constexpr uint32_t capacity () const
 Get maximum buffer capacity.
 
void clear ()
 Clear all elements from buffer.
 

Detailed Description

template<typename T, uint32_t Size, typename MemoryBarrierImpl>
class sbl::primitives::buffers::RingBuffer< T, Size, MemoryBarrierImpl >

Lock-free single-producer-single-consumer ring buffer.

Thread-safe ring buffer designed for communication between ISR and main contexts. Uses volatile indices and memory barriers to ensure data coherency without locks or blocking operations.

On single-core Cortex-M, volatile guarantees that reads/writes are not optimized away or reordered by the compiler. The memory barrier (provided via template parameter) ensures data is committed before the index update becomes visible.

Key features:

Usage:

// Create ring buffer for audio samples
// In ISR (producer)
ISR(ADC_COMPLETE) {
int16_t sample = ADC_read();
if (!audio_buffer.push(sample)) {
// Buffer full - handle overflow
}
}
// In main loop (consumer)
void process_audio() {
int16_t sample;
while (audio_buffer.pop(sample)) {
// Process sample
apply_filter(sample);
}
}
Lock-free single-producer-single-consumer ring buffer.
bool pop(T &item)
Pop element from buffer (consumer side)
bool push(const T &item)
Push element to buffer (producer side)
Template Parameters
TElement type to store in buffer
SizeBuffer size (must be power of 2)
MemoryBarrierImplPlatform-specific memory barrier implementation
Note
All public methods are ISR-safe — lock-free SPSC, bounded computation, no blocking.

Definition at line 72 of file ring_buffer.hpp.

Constructor & Destructor Documentation

◆ RingBuffer()

template<typename T , uint32_t Size, typename MemoryBarrierImpl >
sbl::primitives::buffers::RingBuffer< T, Size, MemoryBarrierImpl >::RingBuffer ( )
inline

Construct empty ring buffer.

Definition at line 81 of file ring_buffer.hpp.

Member Function Documentation

◆ capacity()

template<typename T , uint32_t Size, typename MemoryBarrierImpl >
constexpr uint32_t sbl::primitives::buffers::RingBuffer< T, Size, MemoryBarrierImpl >::capacity ( ) const
inlineconstexpr

Get maximum buffer capacity.

Returns
Maximum number of elements buffer can hold

Definition at line 180 of file ring_buffer.hpp.

◆ clear()

template<typename T , uint32_t Size, typename MemoryBarrierImpl >
void sbl::primitives::buffers::RingBuffer< T, Size, MemoryBarrierImpl >::clear ( )
inline

Clear all elements from buffer.

Resets buffer to empty state. Should only be called when both producer and consumer are stopped to avoid data races.

Definition at line 190 of file ring_buffer.hpp.

◆ empty()

template<typename T , uint32_t Size, typename MemoryBarrierImpl >
bool sbl::primitives::buffers::RingBuffer< T, Size, MemoryBarrierImpl >::empty ( ) const
inline

Check if buffer is empty.

Returns
true if buffer contains no elements

Definition at line 151 of file ring_buffer.hpp.

◆ full()

template<typename T , uint32_t Size, typename MemoryBarrierImpl >
bool sbl::primitives::buffers::RingBuffer< T, Size, MemoryBarrierImpl >::full ( ) const
inline

Check if buffer is full.

Returns
true if buffer cannot accept more elements

Definition at line 160 of file ring_buffer.hpp.

◆ pop()

template<typename T , uint32_t Size, typename MemoryBarrierImpl >
bool sbl::primitives::buffers::RingBuffer< T, Size, MemoryBarrierImpl >::pop ( T &  item)
inline

Pop element from buffer (consumer side)

Removes and returns the oldest element from the buffer if available. This method is designed to be called from the consumer context (typically the main thread).

Parameters
itemReference to store popped element
Returns
true if element was popped, false if buffer is empty

Definition at line 126 of file ring_buffer.hpp.

◆ push()

template<typename T , uint32_t Size, typename MemoryBarrierImpl >
bool sbl::primitives::buffers::RingBuffer< T, Size, MemoryBarrierImpl >::push ( const T &  item)
inline

Push element to buffer (producer side)

Adds element to the buffer if space is available. This method is ISR-safe and designed to be called from the producer context (typically an interrupt handler).

Parameters
itemElement to add to buffer
Returns
true if element was added, false if buffer is full
Note
This method has bounded execution time suitable for ISR use

Definition at line 95 of file ring_buffer.hpp.

◆ size()

template<typename T , uint32_t Size, typename MemoryBarrierImpl >
uint32_t sbl::primitives::buffers::RingBuffer< T, Size, MemoryBarrierImpl >::size ( ) const
inline

Get number of elements in buffer.

Returns
Current number of elements
Note
This is a snapshot - value may change immediately after call

Definition at line 171 of file ring_buffer.hpp.


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