69 lines
2.6 KiB
C++
69 lines
2.6 KiB
C++
#pragma once
|
|
|
|
#include "AudioFrequent.h"
|
|
#include "../RenderAble.h"
|
|
#include "../Axis/Axis_p.h"
|
|
#include "../Axis/TimeAxis.h"
|
|
#include "../Axis/TimeAxis_p.h"
|
|
#include "../base/PerformanceShower_p.h"
|
|
#include "../base/Plot_p.h"
|
|
|
|
|
|
namespace YSG {
|
|
struct AudioFrequentTempData : TempData {
|
|
std::list<double> mDataList;
|
|
};
|
|
struct AudioFrequentRenderState : RenderState, AudioFrequent_Prop {};
|
|
|
|
struct AudioFrequentPrivate : RenderData {
|
|
D_Ptr(AudioFrequent)
|
|
YSG::MutiRingBuffer mMutiBuffer;
|
|
void prepareData() override {
|
|
SpinLockGuard guard(&mBufferLock);
|
|
syncStatePipeline();
|
|
AudioFrequentRenderState *s = renderState();
|
|
AudioFrequentTempData *d = renderTempData();
|
|
if(mMutiBuffer.buffers.empty() || mMutiBuffer.n != s->timePointSize) {
|
|
mMutiBuffer.resize({sizeof(double)}, s->timePointSize, s->timePointSize * 10);
|
|
PerformanceShower *shower = q()->mPlot->d->mShower;
|
|
if(shower) {
|
|
shower->mInfoMap["TimePointSize"] = PerformanceLine(QString("timePointSize:%1")
|
|
.arg(s->timePointSize));
|
|
}
|
|
}
|
|
for(double& power : d->mDataList) {
|
|
mMutiBuffer.pushData({&power});
|
|
}
|
|
d->mDataList.clear();
|
|
}
|
|
|
|
|
|
void draw(QPainter* painter) override {
|
|
AudioFrequentRenderState *s = renderState();
|
|
PerformanceShower *shower = q()->mPlot->d->mShower;
|
|
if(shower) {
|
|
shower->mInfoMap["timePointSize"] = PerformanceLine(QString("timePointSize:%1")
|
|
.arg(s->timeAxis->timePointSize()));
|
|
}
|
|
painter->save();
|
|
AudioFrequentTempData *d = renderTempData();
|
|
QPolygonF polyline;
|
|
int start = (int)s->timeAxis->startCoord();
|
|
QPen newPen = QPen(s->color);
|
|
newPen.setWidth(0);
|
|
painter->setPen(newPen);
|
|
auto l1 = mMutiBuffer.buffers[0].list<double>();
|
|
for(int i = 0; i < mMutiBuffer.buffers[0].f; ++i) {
|
|
double* power = l1 + i;
|
|
int index = s->timeAxis->d()->mTimeTicker.mStartCoordToEndCoord ? start + i :
|
|
start + s->timeAxis->d()->mTimeTicker.mTimePointSize - i;
|
|
double x = s->timeAxis->coordToPixel(index, SRC::Render);
|
|
double y = s->valueAxis->coordToPixel(*power, SRC::Render);
|
|
polyline.append({x, y});
|
|
}
|
|
painter->drawPolyline(polyline);
|
|
painter->restore();
|
|
}
|
|
};
|
|
}
|