mirror of
https://github.com/torlando-tech/pyxis.git
synced 2026-05-20 06:15:07 +00:00
c1af11d75e
- 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>
41 lines
1.1 KiB
C++
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};
|
|
};
|