From cfc8c1e846aaa47438c9ed3d0c95c6b2fcdc36d3 Mon Sep 17 00:00:00 2001 From: Eknous-P Date: Mon, 3 Nov 2025 15:31:43 +0400 Subject: [PATCH] per-channel fft separate input, output, plan and plot to be per-channel --- src/gui/gui.cpp | 31 +++++++++++---------- src/gui/gui.h | 18 ++++++------ src/gui/spectrum.cpp | 66 ++++++++++++++++++++++++-------------------- 3 files changed, 63 insertions(+), 52 deletions(-) diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index a3d5f5b50..f8a486237 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -8653,20 +8653,23 @@ bool FurnaceGUI::finish(bool saveConfig) { fftw_free(tunerPlan); tunerPlan=NULL; } - if (spectrum.in) { - delete[] spectrum.in; - spectrum.in=NULL; - } - if (spectrum.plan) { - fftw_free(spectrum.plan); - spectrum.plan=NULL; - } - if (spectrum.buffer) { - fftw_free(spectrum.buffer); - } - if (spectrum.plot) { - delete[] spectrum.plot; - spectrum.plot=NULL; + for (int i=0; i frequencies; bool update, running, mono; bool showXGrid, showYGrid, showXScale, showYScale; @@ -2785,9 +2785,6 @@ class FurnaceGUI { xZoom(1.0f), xOffset(0.0f), yOffset(0.0f), - buffer(NULL), - in(NULL), - plot(NULL), frequencies({}), update(true), running(false), @@ -2795,7 +2792,12 @@ class FurnaceGUI { showXGrid(true), showYGrid(true), showXScale(true), - showYScale(true) {} + showYScale(true) { + memset(plan,0,DIV_MAX_OUTPUTS*sizeof(fftw_plan*)); + memset(in,0,DIV_MAX_OUTPUTS*sizeof(double*)); + memset(buffer,0,DIV_MAX_OUTPUTS*sizeof(fftw_complex*)); + memset(plot,0,DIV_MAX_OUTPUTS*sizeof(ImVec2*)); + } } spectrum; // visualizer diff --git a/src/gui/spectrum.cpp b/src/gui/spectrum.cpp index f8db7cab1..04b823ea0 100644 --- a/src/gui/spectrum.cpp +++ b/src/gui/spectrum.cpp @@ -114,30 +114,34 @@ void FurnaceGUI::drawSpectrum() { if (spectrum.update) { spectrum.update=false; spectrum.running=true; - if (spectrum.buffer) { - fftw_free(spectrum.buffer); - spectrum.buffer=NULL; + for (int i=0; igetAudioDescGot().rate/2; @@ -154,7 +158,7 @@ void FurnaceGUI::drawSpectrum() { if (spectrum.running) { for (int z=spectrum.mono?0:(chans-1); z>=0; z--) { // get buffer - memset(spectrum.in,0,sizeof(double)*spectrum.bins); + memset(spectrum.in[z],0,sizeof(double)*spectrum.bins); int needle=e->oscReadPos-spectrum.bins; for (int j=0; joscBuf[z][pos]; } - spectrum.in[j]=sample*(0.5*(1.0-cos(2.0*M_PI*j/(spectrum.bins-1)))); + spectrum.in[z][j]=sample*(0.5*(1.0-cos(2.0*M_PI*j/(spectrum.bins-1)))); } - fftw_execute(spectrum.plan); + fftw_execute(spectrum.plan[z]); unsigned int count=0; float mag=0.0f, x=0.0f, y=0.0f; count=spectrum.bins/2; for (unsigned int i=0; iAddPolyline(spectrum.plot,count,ImGui::GetColorU32(uiColors[spectrum.mono?GUI_COLOR_OSC_WAVE:GUI_COLOR_OSC_WAVE_CH0+z]),0,dpiScale); + dl->AddPolyline(spectrum.plot[z],count,ImGui::GetColorU32(uiColors[spectrum.mono?GUI_COLOR_OSC_WAVE:GUI_COLOR_OSC_WAVE_CH0+z]),0,dpiScale); dl->PathFillConcave(ImGui::GetColorU32(uiColors[spectrum.mono?GUI_COLOR_OSC_WAVE:GUI_COLOR_OSC_WAVE_CH0+z])); ImGui::PopClipRect(); } @@ -193,7 +197,9 @@ void FurnaceGUI::drawSpectrum() { ImGui::TextUnformatted(ICON_FA_BARS "##spectrumSettings"); } if (ImGui::BeginPopupContextItem("spectrumSettingsPopup",ImGuiPopupFlags_MouseButtonLeft)) { - ImGui::Checkbox(_("Mono##spec"),&spectrum.mono); + if (ImGui::Checkbox(_("Mono##spec"),&spectrum.mono)) { + spectrum.update=true; + } if (ImGui::InputScalar("Bins",ImGuiDataType_U32,&spectrum.bins)) { if (spectrum.bins<32) spectrum.bins=32; if (spectrum.bins>32768) spectrum.bins=32768;