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
|