83 lines
3.0 KiB
C++
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();
|
|
}
|
|
};
|
|
}
|