Files
Renderive/YSGraphic_Core/plottable/Audio_Frequent_p.h
T
2026-07-23 18:14:44 +08:00

83 lines
3.0 KiB
C++

#pragma once
#include "Audio_Frequent.h"
#include "../Renderable.h"
#include "../Axis/Axis_p.h"
#include "../Axis/Time_Axis.h"
#include "../Axis/Time_Axis_p.h"
#include "../base/Performance_Shower_p.h"
#include "../base/Plot_p.h"
namespace YSG {
struct Audio_Frequent_Input_Data : Input_Data {
std::list<double> mDataList;
void clear() override {
mDataList.clear();
}
};
struct Audio_Frequent_Render_State : Render_State, AudioFrequent_Prop {};
struct Audio_Frequent_Private : Typed_Render_Data<Audio_Frequent, Audio_Frequent_Render_State, Audio_Frequent_Input_Data> {
friend class Audio_Frequent;
Psc::StreamRingBuffer_ST buffer;
std::vector<double> powerSnapshot;
int dataCount{};
int pointCount{};
void resizePowerBuffer(int count) {
pointCount = count;
dataCount = 0;
powerSnapshot.resize(count);
buffer.init(sizeof(double) * count);
}
void pushPower(double power) {
if (dataCount == pointCount) {
double ignored;
std::size_t len = sizeof(double);
buffer.read(&ignored, len);
--dataCount;
}
buffer.write(&power, sizeof(double));
++dataCount;
}
void snapshotPowerBuffer() {
buffer.peek_best_effort(powerSnapshot.data(), sizeof(double) * dataCount);
}
void prepare_data() override {
sync_state_pipeline();
Audio_Frequent_Render_State* s = render_state();
Audio_Frequent_Input_Data* d = render_input_data();
if (pointCount != s->time_point_size) {
resizePowerBuffer(s->time_point_size);
Performance_Shower* shower = q()->mPlot->d->mShower;
if (shower) {
shower->set_performance_line("TimePointSize", Performance_Line(QString("time_point_size:%1").arg(s->time_point_size)));
}
}
for (double& power : d->mDataList) {
pushPower(power);
}
snapshotPowerBuffer();
clear_render_input();
}
void draw(QPainter* painter) override {
Audio_Frequent_Render_State* s = render_state();
Performance_Shower* shower = q()->mPlot->d->mShower;
if (shower) {
shower->set_performance_line("time_point_size", Performance_Line(QString("time_point_size:%1").arg(s->time_axis->time_point_size())));
}
painter->save();
QPolygonF polyline;
int start = (int)s->time_axis->start_coord();
QPen newPen = QPen(s->color);
newPen.setWidth(0);
painter->setPen(newPen);
for (int i = 0; i < dataCount; ++i) {
double* power = powerSnapshot.data() + dataCount - 1 - i;
int index = s->time_axis->d()->mTimeTicker.mStartCoordToEndCoord ? start + i : start + s->time_axis->d()->mTimeTicker.mTimePointSize - i;
double x = s->time_axis->coord_to_pixel(index, SRC::Render);
double y = s->value_axis->coord_to_pixel(*power, SRC::Render);
polyline.append({x, y});
}
painter->drawPolyline(polyline);
painter->restore();
}
};
}