| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 | 
							- #pragma once
 
- #include <math.h>    // for expf
 
- #include <stdint.h>  // for uint32_t
 
- #include <map>       // for map
 
- #include <memory>    // for unique_ptr
 
- #include <mutex>     // for scoped_lock
 
- #include <string>    // for string, operator<
 
- #include <vector>    // for vector
 
- #include "AudioTransform.h"   // for AudioTransform
 
- #include "StreamInfo.h"       // for StreamInfo
 
- #include "TransformConfig.h"  // for TransformConfig
 
- #define pow10f(x) expf(2.302585092994046f * x)
 
- // This is a fast approximation to log2()
 
- // Y = C[0]*F*F*F + C[1]*F*F + C[2]*F + C[3] + E;
 
- float log2f_approx(float X);
 
- #define log10f_fast(x) (log2f_approx(x) * 0.3010299956639812f)
 
- namespace bell {
 
- class Compressor : public bell::AudioTransform {
 
-  private:
 
-   std::vector<int> channels;
 
-   std::vector<float> tmp;
 
-   std::map<std::string, float> paramCache;
 
-   float attack;
 
-   float release;
 
-   float threshold;
 
-   float factor;
 
-   float clipLimit;
 
-   float makeupGain;
 
-   float lastLoudness = -100.0f;
 
-   float sampleRate = 44100;
 
-  public:
 
-   Compressor();
 
-   ~Compressor(){};
 
-   void configure(std::vector<int> channels, float attack, float release,
 
-                  float threshold, float factor, float makeupGain);
 
-   void sumChannels(std::unique_ptr<StreamInfo>& data);
 
-   void calLoudness();
 
-   void calGain();
 
-   void applyGain(std::unique_ptr<StreamInfo>& data);
 
-   void reconfigure() override {
 
-     std::scoped_lock lock(this->accessMutex);
 
-     auto newChannels = config->getChannels();
 
-     float newAttack = config->getFloat("attack");
 
-     float newRelease = config->getFloat("release");
 
-     float newThreshold = config->getFloat("threshold");
 
-     float newFactor = config->getFloat("factor");
 
-     float newMakeupGain = config->getFloat("makeup_gain");
 
-     if (paramCache["attack"] == newAttack &&
 
-         paramCache["release"] == newRelease &&
 
-         paramCache["threshold"] == newThreshold &&
 
-         paramCache["factor"] == newFactor &&
 
-         paramCache["makeup_gain"] == newMakeupGain) {
 
-       return;
 
-     } else {
 
-       paramCache["attack"] = newAttack;
 
-       paramCache["release"] = newRelease;
 
-       paramCache["threshold"] = newThreshold;
 
-       paramCache["factor"] = newFactor;
 
-       paramCache["makeup_gain"] = newMakeupGain;
 
-     }
 
-     this->configure(newChannels, newAttack, newRelease, newThreshold, newFactor,
 
-                     newMakeupGain);
 
-   }
 
-   // void fromJSON(cJSON* json) override {
 
-   //     // get field channels
 
-   //     channels = jsonGetChannels(json);
 
-   //     float attack = jsonGetNumber<float>(json, "attack", false, 0);
 
-   //     float release = jsonGetNumber<float>(json, "release", false, 0);
 
-   //     float factor = jsonGetNumber<float>(json, "factor", false, 4);
 
-   //     float makeupGain = jsonGetNumber<float>(json, "makeup_gain", false, 0);
 
-   //     float threshold = jsonGetNumber<float>(json, "threshold", false, 0);
 
-   //     this->configure(attack, release, clipLimit, threshold, factor, makeupGain);
 
-   // }
 
-   std::unique_ptr<StreamInfo> process(
 
-       std::unique_ptr<StreamInfo> data) override;
 
-   void sampleRateChanged(uint32_t sampleRate) override {
 
-     this->sampleRate = sampleRate;
 
-   };
 
- };
 
- };  // namespace bell
 
 
  |