diff --git a/sdrgui/gui/glspectrum.cpp b/sdrgui/gui/glspectrum.cpp index 642ba9329..44e80184f 100644 --- a/sdrgui/gui/glspectrum.cpp +++ b/sdrgui/gui/glspectrum.cpp @@ -812,7 +812,8 @@ void GLSpectrum::paintGL() m_maxHold[i] = (j * m_powerRange) / 99.0 + m_referenceLevel; } { - GLfloat q3[2*m_fftSize]; + //GLfloat q3[2*m_fftSize]; + GLfloat *q3 = m_shaderArrays.m_q3FFT; Real bottom = -m_powerRange; for(int i = 0; i < m_fftSize; i++) { @@ -835,7 +836,8 @@ void GLSpectrum::paintGL() { { Real bottom = -m_powerRange; - GLfloat q3[2*m_fftSize]; + //GLfloat q3[2*m_fftSize]; + GLfloat *q3 = m_shaderArrays.m_q3FFT; for(int i = 0; i < m_fftSize; i++) { Real v = (*m_currentSpectrum)[i] - m_referenceLevel; @@ -860,7 +862,8 @@ void GLSpectrum::paintGL() tickList = &m_timeScale.getTickList(); { - GLfloat q3[4*tickList->count()]; + //GLfloat q3[4*tickList->count()]; + GLfloat *q3 = m_shaderArrays.m_q3TickTime; int effectiveTicks = 0; for (int i= 0; i < tickList->count(); i++) @@ -887,7 +890,8 @@ void GLSpectrum::paintGL() tickList = &m_frequencyScale.getTickList(); { - GLfloat q3[4*tickList->count()]; + //GLfloat q3[4*tickList->count()]; + GLfloat *q3 = m_shaderArrays.m_q3TickFrequency; int effectiveTicks = 0; for (int i= 0; i < tickList->count(); i++) @@ -920,7 +924,8 @@ void GLSpectrum::paintGL() tickList = &m_powerScale.getTickList(); { - GLfloat q3[4*tickList->count()]; + //GLfloat q3[4*tickList->count()]; + GLfloat *q3 = m_shaderArrays.m_q3TickPower; int effectiveTicks = 0; for(int i= 0; i < tickList->count(); i++) @@ -947,7 +952,8 @@ void GLSpectrum::paintGL() tickList = &m_frequencyScale.getTickList(); { - GLfloat q3[4*tickList->count()]; + //GLfloat q3[4*tickList->count()]; + GLfloat *q3 = m_shaderArrays.m_q3TickFrequency; int effectiveTicks = 0; for(int i= 0; i < tickList->count(); i++) @@ -1572,6 +1578,8 @@ void GLSpectrum::applyChanges() memset(m_histogram, 0x00, 100 * m_fftSize); m_histogramHoldoff = new quint8[100 * m_fftSize]; memset(m_histogramHoldoff, 0x07, 100 * m_fftSize); + + m_shaderArrays.allocFFT(2*m_fftSize); } if(fftSizeChanged || windowSizeChanged) @@ -1579,6 +1587,10 @@ void GLSpectrum::applyChanges() m_waterfallTextureHeight = waterfallHeight; m_waterfallTexturePos = 0; } + + m_shaderArrays.allocTickTime(4*m_timeScale.getTickList().count()); + m_shaderArrays.allocTickFrequency(4*m_frequencyScale.getTickList().count()); + m_shaderArrays.allocTickPower(4*m_powerScale.getTickList().count()); } void GLSpectrum::mouseMoveEvent(QMouseEvent* event) diff --git a/sdrgui/gui/glspectrum.h b/sdrgui/gui/glspectrum.h index 0dbae94a5..dcc4d8c65 100644 --- a/sdrgui/gui/glspectrum.h +++ b/sdrgui/gui/glspectrum.h @@ -72,6 +72,82 @@ public: void connectTimer(const QTimer& timer); private: + struct ShaderArrays + { + GLfloat *m_q3TickTime; + GLfloat *m_q3TickFrequency; + GLfloat *m_q3TickPower; + GLfloat *m_q3FFT; + + uint32_t m_q3TickTimeSize; + uint32_t m_q3TickTimeFrequencySize; + uint32_t m_q3TickPowerSize; + uint32_t m_q3FFTSize; + + ShaderArrays() : + m_q3TickTime(0), + m_q3TickFrequency(0), + m_q3TickPower(0), + m_q3FFT(0), + m_q3TickTimeSize(0), + m_q3TickTimeFrequencySize(0), + m_q3TickPowerSize(0), + m_q3FFTSize(0) + {} + + ~ShaderArrays() + { + if (m_q3TickTime) { delete[] m_q3TickTime; } + if (m_q3TickFrequency) { delete[] m_q3TickFrequency; } + if (m_q3TickPower) { delete[] m_q3TickPower; } + if (m_q3FFT) { delete[] m_q3FFT; } + } + + void allocTickTime(uint32_t size) + { + if (size <= m_q3TickTimeSize) { + return; + } + + if (m_q3TickTime) { delete[] m_q3TickTime; } + m_q3TickTime = new GLfloat[size]; + m_q3TickTimeSize = size; + } + + void allocTickFrequency(uint32_t size) + { + if (size <= m_q3TickTimeFrequencySize) { + return; + } + + if (m_q3TickFrequency) { delete[] m_q3TickFrequency; } + m_q3TickFrequency = new GLfloat[size]; + m_q3TickTimeFrequencySize = size; + } + + void allocTickPower(uint32_t size) + { + if (size <= m_q3TickPowerSize) { + return; + } + + if (m_q3TickPower) { delete[] m_q3TickPower; } + m_q3TickPower = new GLfloat[size]; + m_q3TickPowerSize = size; + } + + void allocFFT(uint32_t size) + { + if (size <= m_q3FFTSize) { + return; + } + + if (m_q3FFT) { delete[] m_q3FFT; } + m_q3FFT = new GLfloat[size]; + m_q3FFTSize = size; + } + }; + struct ChannelMarkerState { ChannelMarker* m_channelMarker; QMatrix4x4 m_glMatrixWaterfall; @@ -164,6 +240,7 @@ private: GLShaderTextured m_glShaderHistogram; int m_matrixLoc; int m_colorLoc; + ShaderArrays m_shaderArrays; static const int m_waterfallBufferHeight = 256;