Files
XCEngine/engine/include/XCEngine/Audio/Equalizer.h

65 lines
1.6 KiB
C++

#pragma once
#include "IAudioEffect.h"
#include <vector>
namespace XCEngine {
namespace Audio {
class Equalizer : public IAudioEffect {
public:
Equalizer();
~Equalizer() override;
void ProcessAudio(float* buffer, uint32 frameCount, uint32 channels) override;
void SetBandCount(uint32 count);
uint32 GetBandCount() const { return m_bandCount; }
void SetBandFrequency(uint32 band, float frequency);
float GetBandFrequency(uint32 band) const;
void SetBandGain(uint32 band, float gainDb);
float GetBandGain(uint32 band) const;
void SetBandQ(uint32 band, float q);
float GetBandQ(uint32 band) const;
void SetEnabled(bool enabled) override;
bool IsEnabled() const override { return m_enabled; }
void SetWetMix(float wetMix) override;
float GetWetMix() const override { return m_wetMix; }
void SetSampleRate(uint32 sampleRate) override;
void ResetState() override;
private:
void EnsureStateCapacity(uint32 channels);
void ComputeCoefficients(uint32 band, float frequency, float q, float gainDb);
private:
uint32 m_bandCount = 0;
std::vector<float> m_frequencies;
std::vector<float> m_gains;
std::vector<float> m_qs;
std::vector<float> m_a0;
std::vector<float> m_a1;
std::vector<float> m_a2;
std::vector<float> m_b1;
std::vector<float> m_b2;
struct BandState {
float x1 = 0.0f;
float x2 = 0.0f;
float y1 = 0.0f;
float y2 = 0.0f;
};
std::vector<BandState> m_bandStates;
uint32 m_stateChannels = 0;
};
} // namespace Audio
} // namespace XCEngine