#ifndef INCLUDE_SPECTRUMVIS_H #define INCLUDE_SPECTRUMVIS_H #include #include #include "dsp/fftengine.h" #include "fftwindow.h" #include "util/export.h" #include "util/message.h" class GLSpectrum; class MessageQueue; class SDRANGEL_API SpectrumVis : public BasebandSampleSink { public: class SDRANGEL_API MsgConfigureSpectrumVis : public Message { MESSAGE_CLASS_DECLARATION public: MsgConfigureSpectrumVis(int fftSize, int overlapPercent, FFTWindow::Function window) : Message(), m_fftSize(fftSize), m_overlapPercent(overlapPercent), m_window(window) { } int getFFTSize() const { return m_fftSize; } int getOverlapPercent() const { return m_overlapPercent; } FFTWindow::Function getWindow() const { return m_window; } private: int m_fftSize; int m_overlapPercent; FFTWindow::Function m_window; }; SpectrumVis(GLSpectrum* glSpectrum = NULL); virtual ~SpectrumVis(); void configure(MessageQueue* msgQueue, int fftSize, int overlapPercent, FFTWindow::Function window); virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, bool positiveOnly); void feedTriggered(const SampleVector::const_iterator& triggerPoint, const SampleVector::const_iterator& end, bool positiveOnly); virtual void start(); virtual void stop(); virtual bool handleMessage(const Message& message); private: FFTEngine* m_fft; FFTWindow m_window; std::vector m_fftBuffer; std::vector m_logPowerSpectrum; std::size_t m_fftSize; std::size_t m_overlapPercent; std::size_t m_overlapSize; std::size_t m_refillSize; std::size_t m_fftBufferFill; bool m_needMoreSamples; GLSpectrum* m_glSpectrum; QMutex m_mutex; void handleConfigure(int fftSize, int overlapPercent, FFTWindow::Function window); }; #endif // INCLUDE_SPECTRUMVIS_H