Add IAudioEffect interface and FFTFilter DSP effect using KissFFT

This commit is contained in:
2026-03-21 12:08:16 +08:00
parent dfc948fc89
commit b68cde82b2
4 changed files with 192 additions and 0 deletions

View File

@@ -0,0 +1,42 @@
#pragma once
#include "IAudioEffect.h"
#include <vector>
namespace XCEngine {
namespace Audio {
class FFTFilter : public IAudioEffect {
public:
FFTFilter();
explicit FFTFilter(uint32 fftSize);
~FFTFilter() override;
void ProcessAudio(float* buffer, uint32 sampleCount, uint32 channels) override;
void SetFFTSize(uint32 size);
uint32 GetFFTSize() const { return m_fftSize; }
void SetSmoothingFactor(float factor);
float GetSmoothingFactor() const { return m_smoothingFactor; }
const float* GetSpectrumData() const { return m_spectrumData.data(); }
size_t GetSpectrumSize() const { return m_spectrumData.size(); }
private:
void InitializeFFT(uint32 size);
void ComputeFFT(const float* input, uint32 size);
private:
uint32 m_fftSize = 1024;
float m_smoothingFactor = 0.8f;
std::vector<float> m_spectrumData;
std::vector<float> m_prevSpectrum;
void* m_fftConfig = nullptr;
void* m_fftrConfig = nullptr;
};
} // namespace Audio
} // namespace XCEngine

View File

@@ -0,0 +1,26 @@
#pragma once
#include "AudioTypes.h"
namespace XCEngine {
namespace Audio {
class IAudioEffect {
public:
virtual ~IAudioEffect() = default;
virtual void ProcessAudio(float* buffer, uint32 sampleCount, uint32 channels) = 0;
virtual void SetEnabled(bool enabled) { m_enabled = enabled; }
virtual bool IsEnabled() const { return m_enabled; }
virtual void SetWetMix(float wetMix) { m_wetMix = wetMix; }
virtual float GetWetMix() const { return m_wetMix; }
protected:
bool m_enabled = true;
float m_wetMix = 1.0f;
};
} // namespace Audio
} // namespace XCEngine