Compressor.h 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. #pragma once
  2. #include <vector>
  3. #include <memory>
  4. #include <algorithm>
  5. #include <cmath>
  6. #include <math.h>
  7. #include <iostream>
  8. #include <mutex>
  9. #include <map>
  10. #include "Biquad.h"
  11. #include "AudioTransform.h"
  12. #define pow10f(x) expf(2.302585092994046f*x)
  13. // This is a fast approximation to log2()
  14. // Y = C[0]*F*F*F + C[1]*F*F + C[2]*F + C[3] + E;
  15. float log2f_approx(float X);
  16. #define log10f_fast(x) (log2f_approx(x)*0.3010299956639812f)
  17. namespace bell
  18. {
  19. class Compressor : public bell::AudioTransform
  20. {
  21. private:
  22. std::vector<int> channels;
  23. std::vector<float> tmp;
  24. std::map<std::string, float> paramCache;
  25. float attack;
  26. float release;
  27. float threshold;
  28. float factor;
  29. float clipLimit;
  30. float makeupGain;
  31. float lastLoudness = -100.0f;
  32. float sampleRate = 44100;
  33. public:
  34. Compressor();
  35. ~Compressor(){};
  36. void configure(std::vector<int> channels, float attack, float release, float threshold, float factor, float makeupGain);
  37. void sumChannels(std::unique_ptr<StreamInfo> &data);
  38. void calLoudness();
  39. void calGain();
  40. void applyGain(std::unique_ptr<StreamInfo> &data);
  41. void reconfigure() override
  42. {
  43. std::scoped_lock lock(this->accessMutex);
  44. auto newChannels = config->getChannels();
  45. float newAttack = config->getFloat("attack");
  46. float newRelease = config->getFloat("release");
  47. float newThreshold = config->getFloat("threshold");
  48. float newFactor = config->getFloat("factor");
  49. float newMakeupGain = config->getFloat("makeup_gain");
  50. if (paramCache["attack"] == newAttack &&
  51. paramCache["release"] == newRelease &&
  52. paramCache["threshold"] == newThreshold &&
  53. paramCache["factor"] == newFactor &&
  54. paramCache["makeup_gain"] == newMakeupGain)
  55. {
  56. return;
  57. }
  58. else
  59. {
  60. paramCache["attack"] = newAttack;
  61. paramCache["release"] = newRelease;
  62. paramCache["threshold"] = newThreshold;
  63. paramCache["factor"] = newFactor;
  64. paramCache["makeup_gain"] = newMakeupGain;
  65. }
  66. this->configure(newChannels, newAttack, newRelease, newThreshold, newFactor, newMakeupGain);
  67. }
  68. // void fromJSON(cJSON* json) override {
  69. // // get field channels
  70. // channels = jsonGetChannels(json);
  71. // float attack = jsonGetNumber<float>(json, "attack", false, 0);
  72. // float release = jsonGetNumber<float>(json, "release", false, 0);
  73. // float factor = jsonGetNumber<float>(json, "factor", false, 4);
  74. // float makeupGain = jsonGetNumber<float>(json, "makeup_gain", false, 0);
  75. // float threshold = jsonGetNumber<float>(json, "threshold", false, 0);
  76. // this->configure(attack, release, clipLimit, threshold, factor, makeupGain);
  77. // }
  78. std::unique_ptr<StreamInfo> process(std::unique_ptr<StreamInfo> data) override;
  79. void sampleRateChanged(uint32_t sampleRate) override { this->sampleRate = sampleRate; };
  80. };
  81. };