1 #include "effects/builtin/bessel8lvmixeqeffect.h"
2 
3 #include "effects/builtin/equalizer_util.h"
4 #include "util/math.h"
5 
6 // static
getId()7 QString Bessel8LVMixEQEffect::getId() {
8     return "org.mixxx.effects.bessel8lvmixeq";
9 }
10 
11 // static
getManifest()12 EffectManifestPointer Bessel8LVMixEQEffect::getManifest() {
13     EffectManifestPointer pManifest(new EffectManifest());
14     pManifest->setId(getId());
15     pManifest->setName(QObject::tr("Bessel8 LV-Mix Isolator"));
16     pManifest->setShortName(QObject::tr("Bessel8 ISO"));
17     pManifest->setAuthor("The Mixxx Team");
18     pManifest->setVersion("1.0");
19     pManifest->setDescription(QObject::tr(
20         "A Bessel 8th-order filter isolator with Lipshitz and Vanderkooy mix (bit perfect unity, roll-off -48 dB/octave).") + " " + EqualizerUtil::adjustFrequencyShelvesTip());
21     pManifest->setIsMixingEQ(true);
22     pManifest->setEffectRampsFromDry(true);
23 
24     EqualizerUtil::createCommonParameters(pManifest.data(), false);
25     return pManifest;
26 }
27 
Bessel8LVMixEQEffect(EngineEffect * pEffect)28 Bessel8LVMixEQEffect::Bessel8LVMixEQEffect(EngineEffect* pEffect)
29         : m_pPotLow(pEffect->getParameterById("low")),
30           m_pPotMid(pEffect->getParameterById("mid")),
31           m_pPotHigh(pEffect->getParameterById("high")),
32           m_pKillLow(pEffect->getParameterById("killLow")),
33           m_pKillMid(pEffect->getParameterById("killMid")),
34           m_pKillHigh(pEffect->getParameterById("killHigh")) {
35     m_pLoFreqCorner = new ControlProxy("[Mixer Profile]", "LoEQFrequency");
36     m_pHiFreqCorner = new ControlProxy("[Mixer Profile]", "HiEQFrequency");
37 }
38 
~Bessel8LVMixEQEffect()39 Bessel8LVMixEQEffect::~Bessel8LVMixEQEffect() {
40     delete m_pLoFreqCorner;
41     delete m_pHiFreqCorner;
42 }
43 
processChannel(const ChannelHandle & handle,Bessel8LVMixEQEffectGroupState * pState,const CSAMPLE * pInput,CSAMPLE * pOutput,const mixxx::EngineParameters & bufferParameters,const EffectEnableState enableState,const GroupFeatureState & groupFeatures)44 void Bessel8LVMixEQEffect::processChannel(const ChannelHandle& handle,
45                                           Bessel8LVMixEQEffectGroupState* pState,
46                                           const CSAMPLE* pInput, CSAMPLE* pOutput,
47                                           const mixxx::EngineParameters& bufferParameters,
48                                           const EffectEnableState enableState,
49                                           const GroupFeatureState& groupFeatures) {
50     Q_UNUSED(handle);
51     Q_UNUSED(groupFeatures);
52 
53     if (enableState == EffectEnableState::Disabling) {
54         // Ramp to dry, when disabling, this will ramp from dry when enabling as well
55         pState->processChannelAndPause(pInput, pOutput, bufferParameters.samplesPerBuffer());
56     } else {
57         double fLow;
58         double fMid;
59         double fHigh;
60         if (!m_pKillLow->toBool()) {
61             fLow = m_pPotLow->value();
62         } else {
63             fLow = 0;
64         }
65         if (!m_pKillMid->toBool()) {
66             fMid = m_pPotMid->value();
67         } else {
68             fMid = 0;
69         }
70         if (!m_pKillHigh->toBool()) {
71             fHigh = m_pPotHigh->value();
72         } else {
73             fHigh = 0;
74         }
75         pState->processChannel(
76                 pInput, pOutput,
77                 bufferParameters.samplesPerBuffer(), bufferParameters.sampleRate(),
78                 fLow, fMid, fHigh,
79                 m_pLoFreqCorner->get(), m_pHiFreqCorner->get());
80     }
81 }
82