1 #pragma once
2 
3 #include "control/controlproxy.h"
4 #include "effects/effect.h"
5 #include "effects/effectprocessor.h"
6 #include "engine/effects/engineeffect.h"
7 #include "engine/effects/engineeffectparameter.h"
8 #include "engine/filters/enginefilterbiquad1.h"
9 #include "engine/filters/enginefilterbessel4.h"
10 #include "effects/builtin/lvmixeqbase.h"
11 #include "engine/filters/enginefilterdelay.h"
12 #include "util/class.h"
13 #include "util/defs.h"
14 #include "util/sample.h"
15 #include "util/types.h"
16 #include "util/memory.h"
17 #include "util/samplebuffer.h"
18 
19 class BiquadFullKillEQEffectGroupState : public EffectState {
20   public:
21     BiquadFullKillEQEffectGroupState(const mixxx::EngineParameters& bufferParameters);
22 
23     void setFilters(
24             mixxx::audio::SampleRate sampleRate,
25             double lowFreqCorner,
26             double highFreqCorner);
27 
28     std::unique_ptr<EngineFilterBiquad1Peaking> m_lowBoost;
29     std::unique_ptr<EngineFilterBiquad1Peaking> m_midBoost;
30     std::unique_ptr<EngineFilterBiquad1Peaking> m_highBoost;
31     std::unique_ptr<EngineFilterBiquad1LowShelving> m_lowKill;
32     std::unique_ptr<EngineFilterBiquad1Peaking> m_midKill;
33     std::unique_ptr<EngineFilterBiquad1HighShelving> m_highKill;
34     std::unique_ptr<LVMixEQEffectGroupState<EngineFilterBessel4Low>> m_lvMixIso;
35 
36     mixxx::SampleBuffer m_pLowBuf;
37     mixxx::SampleBuffer m_pBandBuf;
38     mixxx::SampleBuffer m_pHighBuf;
39     mixxx::SampleBuffer m_tempBuf;
40 
41     double m_oldLowBoost;
42     double m_oldMidBoost;
43     double m_oldHighBoost;
44     double m_oldLowKill;
45     double m_oldMidKill;
46     double m_oldHighKill;
47     double m_oldLow;
48     double m_oldMid;
49     double m_oldHigh;
50 
51     double m_loFreqCorner;
52     double m_highFreqCorner;
53 
54     SINT m_rampHoldOff;
55     SINT m_groupDelay;
56 
57     mixxx::audio::SampleRate m_oldSampleRate;
58 };
59 
60 class BiquadFullKillEQEffect : public EffectProcessorImpl<BiquadFullKillEQEffectGroupState> {
61   public:
62     BiquadFullKillEQEffect(EngineEffect* pEffect);
63 
64     static QString getId();
65     static EffectManifestPointer getManifest();
66 
67     void setFilters(
68             mixxx::audio::SampleRate sampleRate,
69             double lowFreqCorner,
70             double highFreqCorner);
71 
72     void processChannel(const ChannelHandle& handle,
73                         BiquadFullKillEQEffectGroupState* pState,
74                         const CSAMPLE* pInput, CSAMPLE *pOutput,
75                         const mixxx::EngineParameters& bufferParameters,
76                         const EffectEnableState enableState,
77                         const GroupFeatureState& groupFeatureState) override;
78 
79   private:
80     BiquadFullKillEQEffect(const BiquadFullKillEQEffect&) = delete;
81     void operator=(const BiquadFullKillEQEffect&) = delete;
82 
debugString()83     QString debugString() const {
84         return getId();
85     }
86 
87     EngineEffectParameter* m_pPotLow;
88     EngineEffectParameter* m_pPotMid;
89     EngineEffectParameter* m_pPotHigh;
90 
91     EngineEffectParameter* m_pKillLow;
92     EngineEffectParameter* m_pKillMid;
93     EngineEffectParameter* m_pKillHigh;
94 
95     std::unique_ptr<ControlProxy> m_pLoFreqCorner;
96     std::unique_ptr<ControlProxy> m_pHiFreqCorner;
97 };
98