#ifndef VIVY_AUDIOVISUALIZER_H #define VIVY_AUDIOVISUALIZER_H #ifndef __cplusplus #error "This is a C++ header" #endif #include "AudioVisualizer/TimingScene.hh" #include "AudioVisualizer/TimingView.hh" #include "AudioVisualizer/TimingParams.hh" #include "../../Lib/Audio.hh" #include "../VivyDocumentView.hh" namespace Vivy { class AudioVisualizer final : public QWidget, public AbstractVivyDocumentNeeder { Q_OBJECT private: AudioContext::StreamPtr audioStream; private: static constexpr inline auto fftSampleDeleter = [](FFTSample *ptr) noexcept -> void { if (ptr) av_free(ptr); }; static constexpr inline auto rdftContextDeleter = [](RDFTContext *ptr) noexcept -> void { if (ptr) av_rdft_end(ptr); }; static constexpr inline auto pixelsDeleter = [](void *ptr) noexcept -> void { if (ptr) delete[](reinterpret_cast<uchar *>(ptr)); }; using FFTSamplePtr = std::unique_ptr<FFTSample[], decltype(fftSampleDeleter)>; using RDFTContextPtr = std::unique_ptr<RDFTContext, decltype(rdftContextDeleter)>; public: explicit AudioVisualizer(AudioContext::StreamPtr, VivyDocumentView &rootView, QWidget *parent = nullptr); ~AudioVisualizer() noexcept override = default; public slots: void printSpectrum(QImage, AudioContext::StreamPtr) noexcept; }; } #endif // VIVY_AUDIOVISUALIZER_H