mirror of
https://github.com/Boof2015/astra-mobile.git
synced 2026-08-12 05:10:52 +02:00
67 lines
1.7 KiB
C++
67 lines
1.7 KiB
C++
#pragma once
|
|
|
|
#include "dsp_utils.h"
|
|
#include <vector>
|
|
#include <cstddef>
|
|
|
|
namespace Visualizer {
|
|
|
|
struct VectorscopePoint {
|
|
float x; // Right channel
|
|
float y; // Left channel
|
|
};
|
|
|
|
// Circular buffer size (~170ms at 48kHz)
|
|
constexpr size_t VECTORSCOPE_BUFFER_SIZE = 8192;
|
|
|
|
class Vectorscope {
|
|
public:
|
|
Vectorscope();
|
|
|
|
// Configuration
|
|
void setSampleRate(float sampleRate);
|
|
void setBufferSize(size_t size); // Legacy, kept for compat
|
|
size_t getBufferSize() const { return bufferSize_; }
|
|
|
|
// Push stereo samples into circular buffer (called per worklet chunk)
|
|
void pushSamples(const float* leftChannel, const float* rightChannel, size_t length);
|
|
|
|
// Get the most recent N points for rendering (from circular buffer)
|
|
// Returns count of valid points written to output arrays
|
|
size_t getPoints(float* xOut, float* yOut, size_t maxPoints) const;
|
|
|
|
// Get number of valid samples in buffer
|
|
size_t getValidSamples() const { return validSamples_; }
|
|
|
|
// Legacy process (kept for backwards compatibility)
|
|
const std::vector<VectorscopePoint>& process(
|
|
const float* leftChannel,
|
|
const float* rightChannel,
|
|
size_t length
|
|
);
|
|
|
|
// Reset state
|
|
void reset();
|
|
|
|
private:
|
|
float sampleRate_;
|
|
size_t bufferSize_; // Legacy
|
|
size_t writePos_;
|
|
size_t validSamples_;
|
|
|
|
// Circular buffers for filtered L/R
|
|
std::vector<float> leftBuffer_;
|
|
std::vector<float> rightBuffer_;
|
|
|
|
// Cascaded lowpass filters (4th order Butterworth at 8kHz per channel)
|
|
DSP::BiquadFilter leftLowpass1_;
|
|
DSP::BiquadFilter leftLowpass2_;
|
|
DSP::BiquadFilter rightLowpass1_;
|
|
DSP::BiquadFilter rightLowpass2_;
|
|
|
|
// Legacy
|
|
std::vector<VectorscopePoint> points_;
|
|
};
|
|
|
|
} // namespace Visualizer
|