自定义内存分配池
This commit is contained in:
@@ -6,6 +6,93 @@
|
||||
#include "IntermediateFrequencyWidget.h"
|
||||
#include "RadioWidget.h"
|
||||
#include "SweepFrequencyWidget.h"
|
||||
#include <algorithm>
|
||||
#include <memory_resource>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
#include "../../../third_party/Renderive/Renderive/Generate_Mock_Data.h"
|
||||
#include "../../../third_party/Renderive/Renderive/base/Memory.h"
|
||||
namespace {
|
||||
struct Mock_Config {
|
||||
bool performance{};
|
||||
int interval_ms = 10;
|
||||
int batch_count = 1;
|
||||
};
|
||||
int read_env_int(const char* name, int fallback) {
|
||||
bool ok = false;
|
||||
int value = qEnvironmentVariableIntValue(name, &ok);
|
||||
return ok ? value : fallback;
|
||||
}
|
||||
Mock_Config read_mock_config() {
|
||||
Mock_Config config;
|
||||
config.performance = read_env_int("RADIO_MOCK_PERF_MODE", 1) != 0;
|
||||
config.interval_ms = std::max(1, read_env_int("RADIO_MOCK_INTERVAL_MS", config.performance ? 1 : 10));
|
||||
config.batch_count = std::max(1, read_env_int("RADIO_MOCK_BATCH_COUNT", config.performance ? 4 : 1));
|
||||
return config;
|
||||
}
|
||||
std::pmr::vector<double> make_random_data(renderive::Range range, int size, renderive::Memory_Domain domain) {
|
||||
if (range.origin > range.target)
|
||||
std::swap(range.origin, range.target);
|
||||
std::pmr::vector<double> data(renderive::memory_resource(domain));
|
||||
data.resize(size);
|
||||
renderive::fill_data(range, data);
|
||||
return data;
|
||||
}
|
||||
double make_random_value(renderive::Range range) {
|
||||
if (range.origin > range.target)
|
||||
std::swap(range.origin, range.target);
|
||||
return renderive::get_data(range);
|
||||
}
|
||||
void push_radio_data(Radio_Widget* rw) {
|
||||
if (!rw || !rw->spectrogram_line || !rw->water_fall || !rw->time_power || !rw->audio_spectrogram_plot || !rw->progress_bar1 || !rw->progress_bar2)
|
||||
return;
|
||||
{
|
||||
auto r = rw->spectrogram_line->power_axis()->coord_range();
|
||||
renderive::Range nr = {r.center() - r.length() / 4, r.center() + r.length() / 4};
|
||||
auto data = make_random_data(nr, rw->spectrogram_line->frequency_point_size(), renderive::Memory_Domain::Spectrum);
|
||||
double middle_power = data.empty() ? nr.center() : data[data.size() / 2];
|
||||
rw->spectrogram_line->give_data(std::move(data));
|
||||
rw->progress_bar1->setValue(middle_power);
|
||||
}
|
||||
{
|
||||
rw->water_fall->give_data(QTime::currentTime(), make_random_data(rw->water_fall->power_range(), rw->water_fall->frequency_point_size(), renderive::Memory_Domain::Waterfall));
|
||||
}
|
||||
{
|
||||
int tick = rw->time_power->time_axis()->give_data(QTime::currentTime());
|
||||
renderive::Range r = rw->time_power->value_axis()->coord_range();
|
||||
renderive::Range nr = {r.center() - r.length() / 4, r.center() + r.length() / 4};
|
||||
rw->time_power->give_data(tick, make_random_value(nr));
|
||||
}
|
||||
{
|
||||
auto r = rw->audio_spectrogram_plot->power_axis()->coord_range();
|
||||
renderive::Range nr = {r.center() - r.length() / 4, r.center() + r.length() / 4};
|
||||
rw->audio_spectrogram_plot->give_data(make_random_data(nr, rw->audio_spectrogram_plot->frequency_point_size(), renderive::Memory_Domain::Spectrum));
|
||||
}
|
||||
rw->progress_bar2->setValue(make_random_value({1, 5}));
|
||||
}
|
||||
void push_radio_data_perf(Radio_Widget* rw) {
|
||||
if (!rw || !rw->spectrogram_line || !rw->water_fall || !rw->time_power || !rw->audio_spectrogram_plot || !rw->progress_bar1 || !rw->progress_bar2)
|
||||
return;
|
||||
{
|
||||
renderive::Range nr = {40, 120};
|
||||
auto data = make_random_data(nr, 1024, renderive::Memory_Domain::Spectrum);
|
||||
double middle_power = data.empty() ? nr.center() : data[data.size() / 2];
|
||||
rw->spectrogram_line->give_data(std::move(data));
|
||||
rw->progress_bar1->setValue(middle_power);
|
||||
}
|
||||
{
|
||||
rw->water_fall->give_data(QTime::currentTime(), make_random_data({0, 160}, 1024, renderive::Memory_Domain::Waterfall));
|
||||
}
|
||||
{
|
||||
int tick = rw->time_power->time_axis()->give_data(QTime::currentTime());
|
||||
rw->time_power->give_data(tick, make_random_value({-6000, 6000}));
|
||||
}
|
||||
{
|
||||
rw->audio_spectrogram_plot->give_data(make_random_data({-6000, 6000}, 512, renderive::Memory_Domain::Spectrum));
|
||||
}
|
||||
rw->progress_bar2->setValue(make_random_value({1, 5}));
|
||||
}
|
||||
}
|
||||
void Back_End::play(const QString& fileName) {
|
||||
qDebug() << "播放音频文件:" << fileName;
|
||||
}
|
||||
@@ -67,55 +154,33 @@ Back_End::Back_End() {
|
||||
function_map["切换音量/RF Gain"] = Qt::Key_Return;
|
||||
function_map["特别增加"] = Qt::Key_PageUp;
|
||||
function_map["特别减小"] = Qt::Key_PageDown;
|
||||
auto timer = new QTimer(this);
|
||||
QObject::connect(timer, &QTimer::timeout, [&]() {
|
||||
int size = 1024;
|
||||
Mock_Config config = read_mock_config();
|
||||
QTimer::singleShot(0, this, [this, config]() {
|
||||
Radio_Widget* rw = Main_Widget::instance()->radio_widget;
|
||||
{
|
||||
auto r = rw->spectrogram_line->power_axis()->coord_range();
|
||||
renderive::Range nr = {r.center() - r.length() / 4, r.center() + r.length() / 4};
|
||||
//QVector<double>&& d= renderive::get_data(nr, rw->spectrogram_line->frequent_point_size());
|
||||
QVector<double>&& d = renderive::get_data(nr, size);
|
||||
rw->spectrogram_line->give_data(d);
|
||||
}
|
||||
{
|
||||
QVector<double>&& d = renderive::get_data(rw->water_fall->power_range(), rw->water_fall->frequency_point_size());
|
||||
//qDebug() << "D == " << d.size();
|
||||
int tick = rw->water_fall->time_axis()->give_data(QTime::currentTime());
|
||||
rw->water_fall->give_data(tick, d);
|
||||
}
|
||||
{
|
||||
int tick = rw->time_power->time_axis()->give_data(QTime::currentTime());
|
||||
renderive::Range r = rw->time_power->value_axis()->coord_range();
|
||||
renderive::Range nr = {r.center() - r.length() / 4, r.center() + r.length() / 4};
|
||||
rw->time_power->give_data(tick, renderive::get_data(nr));
|
||||
}
|
||||
{
|
||||
auto r = rw->audio_spectrogram_plot->power_axis()->coord_range();
|
||||
renderive::Range nr = {r.center() - r.length() / 4, r.center() + r.length() / 4};
|
||||
//QVector<double>&& d= renderive::get_data(nr, rw->audio_spectrogram_plot->frequent_point_size());
|
||||
QVector<double>&& d = renderive::get_data(nr, 512);
|
||||
rw->audio_spectrogram_plot->give_data(d);
|
||||
}
|
||||
auto iw = Main_Widget::instance()->intermediate_frequency_widget;
|
||||
{
|
||||
auto r = iw->spectrogram_line->power_axis()->coord_range();
|
||||
renderive::Range nr = {r.center() - r.length() / 4, r.center() + r.length() / 4};
|
||||
//QVector<double> d = renderive::get_data(nr, iw->spectrogram_line->frequent_point_size());
|
||||
QVector<double> d = renderive::get_data(nr, size);
|
||||
iw->spectrogram_line->give_data(d);
|
||||
}
|
||||
{
|
||||
//QVector<double> d= renderive::get_data(iw->afterglow->power_range(), iw->afterglow->frequent_point_size());
|
||||
QVector<double> d = renderive::get_data(iw->afterglow->power_range(), size);
|
||||
iw->afterglow->give_data(d);
|
||||
}
|
||||
auto sw = Main_Widget::instance()->sweep_frequency_widget;
|
||||
{
|
||||
QVector<double>&& sweepData = renderive::get_data(sw->sweep_frequency_line->power_axis()->coord_range(), sw->sweep_frequency_line->block_frequency_point_size());
|
||||
sw->sweep_frequency_line->give_data(sweepData);
|
||||
if (config.performance) {
|
||||
mock_thread = new QThread(this);
|
||||
auto worker = new QObject;
|
||||
worker->moveToThread(mock_thread);
|
||||
QObject::connect(mock_thread, &QThread::finished, worker, &QObject::deleteLater);
|
||||
QObject::connect(mock_thread, &QThread::started, worker, [worker, config, rw]() {
|
||||
auto timer = new QTimer(worker);
|
||||
timer->setTimerType(Qt::PreciseTimer);
|
||||
QObject::connect(timer, &QTimer::timeout, worker, [config, rw]() {
|
||||
for (int i = 0; i < config.batch_count; ++i)
|
||||
push_radio_data_perf(rw);
|
||||
});
|
||||
timer->start(config.interval_ms);
|
||||
});
|
||||
mock_thread->start();
|
||||
return;
|
||||
}
|
||||
auto timer = new QTimer(this);
|
||||
timer->setTimerType(Qt::PreciseTimer);
|
||||
QObject::connect(timer, &QTimer::timeout, this, [config, rw]() {
|
||||
for (int i = 0; i < config.batch_count; ++i)
|
||||
push_radio_data(rw);
|
||||
});
|
||||
timer->start(config.interval_ms);
|
||||
});
|
||||
timer->start(10);
|
||||
}
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user