Files
pyxis/lib/lxst_audio/packet_ring_buffer.h
torlando-tech c1af11d75e LXST audio hardware config: ES7210 mic pins, tone helpers, platformio deps
- Add ES7210 I2C address and I2S mic capture pin definitions
- Add ring/hangup tone helpers to Tone library
- Add lxst_audio library scaffold
- Add Codec2 dependency to platformio.ini

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 16:41:47 -05:00

41 lines
1.1 KiB
C++

// Copyright (c) 2024 LXST contributors
// SPDX-License-Identifier: MPL-2.0
#pragma once
#include <atomic>
#include <cstdint>
#include <cstring>
/**
* Lock-free Single-Producer Single-Consumer (SPSC) ring buffer for int16 audio.
*
* Ported from LXST-kt native layer. Uses acquire/release memory ordering
* on read/write indices for correct cross-thread visibility without mutexes.
*
* On ESP32-S3, the buffer is allocated in PSRAM to conserve internal RAM.
*/
class PacketRingBuffer {
public:
PacketRingBuffer(int maxFrames, int frameSamples);
~PacketRingBuffer();
PacketRingBuffer(const PacketRingBuffer&) = delete;
PacketRingBuffer& operator=(const PacketRingBuffer&) = delete;
bool write(const int16_t* samples, int count);
bool read(int16_t* dest, int count);
int availableFrames() const;
int capacity() const { return maxFrames_; }
int frameSamples() const { return frameSamples_; }
void reset();
private:
const int maxFrames_;
const int frameSamples_;
int16_t* buffer_;
std::atomic<int> writeIndex_{0};
std::atomic<int> readIndex_{0};
};