#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