From a71e1bc6e910a4d325f907af948ae91fc9316244 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Fri, 8 Sep 2023 00:41:47 -0500 Subject: [PATCH] GUI: optimize readOsc --- src/engine/filter.cpp | 18 ++++---- src/gui/osc.cpp | 100 ++++++++++++++++++++---------------------- 2 files changed, 57 insertions(+), 61 deletions(-) diff --git a/src/engine/filter.cpp b/src/engine/filter.cpp index 25d581b5a..ee325052b 100644 --- a/src/engine/filter.cpp +++ b/src/engine/filter.cpp @@ -111,20 +111,20 @@ float* DivFilterTables::getSincIntegralTable() { float* DivFilterTables::getSincIntegralSmallTable() { if (sincIntegralSmallTable==NULL) { logD("initializing small sinc integral table."); - sincIntegralSmallTable=new float[256]; + sincIntegralSmallTable=new float[512]; sincIntegralSmallTable[0]=-0.5f; - for (int i=1; i<256; i++) { - int mapped=((i&31)<<3)|(i>>5); - int mappedPrev=(((i-1)&31)<<3)|((i-1)>>5); - double x=(double)i*M_PI/32.0; + for (int i=1; i<512; i++) { + int mapped=((i&63)<<3)|(i>>6); + int mappedPrev=(((i-1)&63)<<3)|((i-1)>>6); + double x=(double)i*M_PI/64.0; double sinc=sin(x)/x; - sincIntegralSmallTable[mapped]=sincIntegralSmallTable[mappedPrev]+(sinc/32.0); + sincIntegralSmallTable[mapped]=sincIntegralSmallTable[mappedPrev]+(sinc/64.0); } - for (int i=0; i<256; i++) { - int mapped=((i&31)<<3)|(i>>5); - sincIntegralSmallTable[mapped]*=pow(cos(M_PI*(double)i/512.0),2.0); + for (int i=0; i<512; i++) { + int mapped=((i&63)<<3)|(i>>6); + sincIntegralSmallTable[mapped]*=pow(cos(M_PI*(double)i/1024.0),2.0); } } return sincIntegralSmallTable; diff --git a/src/gui/osc.cpp b/src/gui/osc.cpp index 4a12ff34c..d43e82055 100644 --- a/src/gui/osc.cpp +++ b/src/gui/osc.cpp @@ -52,36 +52,30 @@ void FurnaceGUI::readOsc() { for (int ch=0; chgetAudioDescGot().outChans; ch++) { if (oscValues[ch]==NULL) { - oscValues[ch]=new float[1024]; + oscValues[ch]=new float[2048]; } - memset(oscValues[ch],0,1024*sizeof(float)); + memset(oscValues[ch],0,2048*sizeof(float)); float* sincITable=DivFilterTables::getSincIntegralSmallTable(); float posFrac=0.0; float factor=(float)oscWidth/(float)winSize; int posInt=oscReadPos-(8.0f/factor); - for (int i=-8; i=0 && ioscBuf[ch][posInt&0x7fff]; - } + for (int i=7; ioscBuf[ch][posInt&0x7fff]; posFrac+=1.0; while (posFrac>=1.0) { - unsigned int n=((unsigned int)(posFrac*32.0))&31; + unsigned int n=((unsigned int)(posFrac*64.0))&63; posFrac-=factor; posInt++; - float* t1=&sincITable[(31-n)<<3]; + float* t1=&sincITable[(63-n)<<3]; float* t2=&sincITable[n<<3]; float delta=e->oscBuf[ch][posInt&0x7fff]-e->oscBuf[ch][(posInt-1)&0x7fff]; for (int j=0; j<8; j++) { - if ((i-j)>=0 && (i-j)=0 && (i+j+1)DC.CursorPos; @@ -248,61 +242,63 @@ void FurnaceGUI::drawOsc() { dpiScale ); - oscWidth=round(inRect.Max.x-inRect.Min.x); - if (oscWidth<1) oscWidth=1; - if (oscWidth>1024) oscWidth=1024; + oscWidth=round(inRect.Max.x-inRect.Min.x)+24; + if (oscWidth<17) oscWidth=17; + if (oscWidth>2048) oscWidth=2048; ImDrawListFlags prevFlags=dl->Flags; if (!settings.oscAntiAlias) { dl->Flags&=~(ImDrawListFlags_AntiAliasedLines|ImDrawListFlags_AntiAliasedLinesUseTex); } - if (settings.oscMono) { - for (int i=0; igetAudioDescGot().outChans; j++) { - avg+=oscValues[j][i]; - } - avg/=e->getAudioDescGot().outChans; + if ((oscWidth-24)>0) { + if (settings.oscMono) { + for (int i=0; igetAudioDescGot().outChans; j++) { + avg+=oscValues[j][i+12]; + } + avg/=e->getAudioDescGot().outChans; - float y=avg*oscZoom; - if (!settings.oscEscapesBoundary) { - if (y<-0.5f) y=-0.5f; - if (y>0.5f) y=0.5f; - } - waveform[i]=ImLerp(inRect.Min,inRect.Max,ImVec2(x,0.5f-y)); - } - - if (settings.oscEscapesBoundary) { - dl->PushClipRectFullScreen(); - dl->AddPolyline(waveform,oscWidth,color,ImDrawFlags_None,dpiScale); - dl->PopClipRect(); - } else { - dl->AddPolyline(waveform,oscWidth,color,ImDrawFlags_None,dpiScale); - } - } else { - for (int ch=0; chgetAudioDescGot().outChans; ch++) { - for (int i=0; i0.5f) y=0.5f; } waveform[i]=ImLerp(inRect.Min,inRect.Max,ImVec2(x,0.5f-y)); } - - if (!isClipping) { - color=ImGui::GetColorU32(uiColors[GUI_COLOR_OSC_WAVE_CH0+ch]); - } if (settings.oscEscapesBoundary) { dl->PushClipRectFullScreen(); - dl->AddPolyline(waveform,oscWidth,color,ImDrawFlags_None,dpiScale); + dl->AddPolyline(waveform,oscWidth-24,color,ImDrawFlags_None,dpiScale); dl->PopClipRect(); } else { - dl->AddPolyline(waveform,oscWidth,color,ImDrawFlags_None,dpiScale); + dl->AddPolyline(waveform,oscWidth-24,color,ImDrawFlags_None,dpiScale); + } + } else { + for (int ch=0; chgetAudioDescGot().outChans; ch++) { + for (int i=0; i0.5f) y=0.5f; + } + waveform[i]=ImLerp(inRect.Min,inRect.Max,ImVec2(x,0.5f-y)); + } + + if (!isClipping) { + color=ImGui::GetColorU32(uiColors[GUI_COLOR_OSC_WAVE_CH0+ch]); + } + + if (settings.oscEscapesBoundary) { + dl->PushClipRectFullScreen(); + dl->AddPolyline(waveform,oscWidth-24,color,ImDrawFlags_None,dpiScale); + dl->PopClipRect(); + } else { + dl->AddPolyline(waveform,oscWidth-24,color,ImDrawFlags_None,dpiScale); + } } } }