#pragma once #include #include "../concurrency/BufferConsumer.h" #include "../PluginProcessor.h" class PitchDetector : public juce::Thread, public juce::AsyncUpdater { public: PitchDetector(OscirenderAudioProcessor& p, std::function frequencyCallback); ~PitchDetector(); void run() override; void handleAsyncUpdate() override; std::atomic frequency = 0.0f; private: static constexpr int fftOrder = 15; static constexpr int fftSize = 1 << fftOrder; std::shared_ptr consumer = std::make_shared(fftSize); juce::dsp::FFT forwardFFT{fftOrder}; std::array fftData; OscirenderAudioProcessor& audioProcessor; std::function frequencyCallback; float frequencyFromIndex(int index); JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(PitchDetector) };