11#include " config/DspConfig.h"
22#include " Utils.h"
3+ #include " BenchmarkWorker.h"
34
5+ #include < QTimer>
46#include < sstream>
57#include < string>
68
@@ -18,6 +20,7 @@ extern "C" {
1820
1921#include < QElapsedTimer>
2022#include < QTextStream>
23+ #include < QThread>
2124#include < QDebug>
2225#include < cstring>
2326#include < assert.h>
@@ -45,11 +48,81 @@ DspHost::DspHost(void* dspPtr, MessageHandlerFunc&& extraHandler) : _extraFunc(s
4548
4649 _dsp = dsp;
4750 _cache = new DspConfig ();
51+
52+ benchmarkThread = new QThread ();
53+ benchmarkWorker = new BenchmarkWorker ();
54+
55+ QObject::connect (benchmarkThread, &QThread::started, benchmarkWorker, &BenchmarkWorker::process);
56+ QObject::connect (benchmarkWorker, &BenchmarkWorker::finished, benchmarkThread, &QThread::quit);
57+ QObject::connect (benchmarkWorker, &BenchmarkWorker::finished, benchmarkThread, [this ] {
58+ dispatch (Message::BenchmarkDone, nullptr );
59+ });
60+
61+
62+ if (AppConfig::instance ().get <bool >(AppConfig::BenchmarkOnBoot))
63+ QTimer::singleShot (30000 , [this ]{ runBenchmarks (); });
4864}
4965
5066DspHost::~DspHost ()
5167{
5268 setStdOutHandler (NULL , NULL );
69+
70+ _cache->deleteLater ();
71+ benchmarkThread->deleteLater ();
72+ benchmarkWorker->deleteLater ();
73+
74+ _cache = nullptr ;
75+ benchmarkWorker = nullptr ;
76+ benchmarkThread = nullptr ;
77+ }
78+
79+ void DspHost::runBenchmarks ()
80+ {
81+ if (benchmarkThread->isRunning ()) {
82+ Log::warning (" Another benchmark is already active" );
83+ return ;
84+ }
85+
86+ benchmarkWorker->moveToThread (benchmarkThread);
87+ benchmarkThread->start ();
88+ }
89+
90+ void DspHost::loadBenchmarkData ()
91+ {
92+ // Empty cache = no benchmark data stored
93+ if (AppConfig::instance ().get <QString>(AppConfig::BenchmarkCacheC0).isEmpty () &&
94+ AppConfig::instance ().get <QString>(AppConfig::BenchmarkCacheC1).isEmpty ())
95+ return ;
96+
97+ auto loadFromCache = [](int num, double * output){
98+ auto values = AppConfig::instance ().get <QString>(num == 0 ? AppConfig::BenchmarkCacheC0 : AppConfig::BenchmarkCacheC1).split (' ;' , Qt::SkipEmptyParts);
99+ if (values.size () != MAX_BENCHMARK)
100+ return false ;
101+
102+ for (int i = 0 ; i < values.size (); i++) {
103+ bool ok = false ;
104+ output[i] = values[i].toInt (&ok);
105+ if (!ok)
106+ return false ;
107+ }
108+ return true ;
109+ };
110+
111+ double * c0 = new double [MAX_BENCHMARK];
112+ double * c1 = new double [MAX_BENCHMARK];
113+
114+ bool ok0 = loadFromCache (0 , c0);
115+ bool ok1 = loadFromCache (1 , c1);
116+
117+ if (!ok0 || !ok1) {
118+ Log::error (" Failed to parse cached benchmark data" );
119+ return ;
120+ }
121+
122+ JamesDSP_Load_benchmark (c0, c1);
123+
124+ delete[] c0;
125+ delete[] c1;
53126}
54127
55128void DspHost::updateLimiter (DspConfig* config)
0 commit comments