]> git.sesse.net Git - nageru/blobdiff - filter.h
Fix an issue where the mixer lagging too much behind CEF would cause us to display...
[nageru] / filter.h
index 5e455d2fff840704a7ab3ae44cca24105f89a8d7..1bf18c9cd5855afdc119bb7c8a399b6e9b560db0 100644 (file)
--- a/filter.h
+++ b/filter.h
 #define _FILTER_H 1
 
 #define _USE_MATH_DEFINES
-#include <math.h>
-#include <string.h>
+#include <cmath>
 #include <complex>
 
 #ifdef __SSE__
 #include <xmmintrin.h>
 #endif
 
-#include "defs.h"
-
-namespace std {
-template <typename _Tp> struct complex;
-}  // namespace std
-
 enum FilterType
 {
        FILTER_NONE = 0,
@@ -32,6 +25,11 @@ enum FilterType
        FILTER_BPF,
        FILTER_NOTCH,
        FILTER_APF,
+
+       // EQ filters.
+       FILTER_PEAKING_EQ,
+       FILTER_LOW_SHELF,
+       FILTER_HIGH_SHELF,
 };
 
 #define FILTER_MAX_ORDER 4
@@ -69,6 +67,12 @@ public:
                resonance = new_resonance;
        }
 
+       // For EQ filters only.
+       void set_dbgain_normalized(float db_gain_div_40)
+       {
+               A = pow(10.0f, db_gain_div_40);
+       }
+
 #ifdef __SSE__
        // We don't need the stride argument for SSE, as StereoFilter
        // has its own SSE implementations.
@@ -81,6 +85,7 @@ public:
 private:
        float omega; //which is 2*Pi*frequency /SAMPLE_RATE
        float resonance;
+       float A;  // which is 10^(db_gain / 40)
 
 public:
        unsigned filter_order;
@@ -104,7 +109,7 @@ class StereoFilter
 public:
        void init(FilterType type, int new_order);
        
-       void render(float *inout_left_ptr, unsigned n_samples, float cutoff, float resonance);
+       void render(float *inout_left_ptr, unsigned n_samples, float cutoff, float resonance, float dbgain_normalized = 0.0f);
 #ifndef NDEBUG
 #ifdef __SSE__
        void debug() { parm_filter.debug(); }