Files
sonobulus/src/synth/Scope.hpp
2026-07-04 13:22:25 -05:00

66 lines
1.5 KiB
C++

#pragma once
#include <QObject>
#include <QtQuick/QQuickPaintedItem>
#include <QtGui/QPainter>
#include <vector>
#include <atomic>
#include "config/ConfigService.hpp"
#include "LoggerService.hpp"
class ScopeBuffer : public QObject {
Q_OBJECT // needed to attach to a qml component
public:
explicit ScopeBuffer(QObject* parent = nullptr);
ScopeBuffer(ConfigService* config, LoggerService* logger, size_t size);
~ScopeBuffer() = default;
void push(float sample);
void read(std::vector<float>& out);
void setTrigger(size_t trigger) { trigger_ = trigger; }
void setWavelength(size_t wavelength) { wavelength_ = wavelength; }
size_t trigger() { return trigger_; }
size_t wavelength() { return wavelength_; }
void spinlock(bool lock) { spinlock_.store(lock, std::memory_order_relaxed); }
bool spinlock() { return spinlock_.load(std::memory_order_relaxed); }
size_t size() { return buffer_.size(); }
private:
ConfigService* config_;
LoggerService* logger_;
std::vector<float> buffer_;
std::atomic<size_t> writeIndex_{0};
size_t trigger_ = 0;
size_t wavelength_ = 400;
std::atomic<bool> spinlock_ = false;
};
class Scope : public QQuickPaintedItem {
Q_OBJECT
Q_PROPERTY(ScopeBuffer* buffer WRITE setBuffer)
public:
explicit Scope(QQuickItem* parent = nullptr);
void paint(QPainter* painter) override;
void setBuffer(ScopeBuffer* scopeBuffer);
std::vector<float> buffer_;
ScopeBuffer* scopeBuffer_;
};