From b8a2c90b619e7d64cecb9fd05dd70de0c661b41c Mon Sep 17 00:00:00 2001 From: tildearrow Date: Tue, 3 May 2022 02:29:12 -0500 Subject: [PATCH] GUI: add audio load meter to statistics --- TODO.md | 1 - src/engine/engine.h | 5 ++++- src/engine/playback.cpp | 7 +++++++ src/gui/stats.cpp | 8 ++++++++ 4 files changed, 19 insertions(+), 2 deletions(-) diff --git a/TODO.md b/TODO.md index 26efc81db..4e352566f 100644 --- a/TODO.md +++ b/TODO.md @@ -28,6 +28,5 @@ - store edit/followOrders/followPattern state in config - add ability to select a column by double clicking - add ability to move selection by dragging -- settings: OK/Cancel buttons should be always visible - Apply button in settings - find and replace \ No newline at end of file diff --git a/src/engine/engine.h b/src/engine/engine.h index 809df944d..572fd90bc 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -26,6 +26,7 @@ #include "safeWriter.h" #include "../audio/taAudio.h" #include "blip_buf.h" +#include #include #include #include @@ -416,6 +417,7 @@ class DivEngine { float oscSize; int oscReadPos, oscWritePos; int tickMult; + std::atomic processTime; void runExportThread(); void nextBuf(float** in, float** out, int inChans, int outChans, unsigned int size); @@ -923,7 +925,8 @@ class DivEngine { oscSize(1), oscReadPos(0), oscWritePos(0), - tickMult(1) { + tickMult(1), + processTime(0) { memset(isMuted,0,DIV_MAX_CHANS*sizeof(bool)); memset(keyHit,0,DIV_MAX_CHANS*sizeof(bool)); memset(dispatchChanOfChan,0,DIV_MAX_CHANS*sizeof(int)); diff --git a/src/engine/playback.cpp b/src/engine/playback.cpp index 0010d5a99..5572fea05 100644 --- a/src/engine/playback.cpp +++ b/src/engine/playback.cpp @@ -17,6 +17,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ +#include #define _USE_MATH_DEFINES #include "dispatch.h" #include "engine.h" @@ -1060,6 +1061,8 @@ void DivEngine::nextBuf(float** in, float** out, int inChans, int outChans, unsi } got.bufsize=size; + std::chrono::steady_clock::time_point ts_processBegin=std::chrono::steady_clock::now(); + // process MIDI events (TODO: everything) if (output) if (output->midiIn) while (!output->midiIn->queue.empty()) { TAMidiMessage& msg=output->midiIn->queue.front(); @@ -1338,4 +1341,8 @@ void DivEngine::nextBuf(float** in, float** out, int inChans, int outChans, unsi } } isBusy.unlock(); + + std::chrono::steady_clock::time_point ts_processEnd=std::chrono::steady_clock::now(); + + processTime=std::chrono::duration_cast(ts_processEnd-ts_processBegin).count(); } diff --git a/src/gui/stats.cpp b/src/gui/stats.cpp index 35d6cfc49..9e1790c9e 100644 --- a/src/gui/stats.cpp +++ b/src/gui/stats.cpp @@ -19,6 +19,7 @@ #include "gui.h" #include +#include void FurnaceGUI::drawStats() { if (nextWindow==GUI_WINDOW_STATS) { @@ -28,6 +29,13 @@ void FurnaceGUI::drawStats() { } if (!statsOpen) return; if (ImGui::Begin("Statistics",&statsOpen)) { + size_t lastProcTime=e->processTime; + double maxGot=1000000000.0*(double)e->getAudioDescGot().bufsize/(double)e->getAudioDescGot().rate; + String procStr=fmt::sprintf("%.1f%%",100.0*((double)lastProcTime/(double)maxGot)); + ImGui::Text("Audio load"); + ImGui::SameLine(); + ImGui::ProgressBar((double)lastProcTime/maxGot,ImVec2(-FLT_MIN,0),procStr.c_str()); + ImGui::Separator(); for (int i=0; isong.systemLen; i++) { DivDispatch* dispatch=e->getDispatch(i); for (int j=0; dispatch!=NULL && dispatch->getSampleMemCapacity(j)>0; j++) {