equalizer.c 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. /*
  2. * Squeezelite for esp32
  3. *
  4. * (c) Philippe G. 2020, philippe_44@outlook.com
  5. *
  6. * This software is released under the MIT License.
  7. * https://opensource.org/licenses/MIT
  8. *
  9. */
  10. #include "squeezelite.h"
  11. #include "equalizer.h"
  12. #include "esp_equalizer.h"
  13. #define EQ_BANDS 10
  14. static log_level loglevel = lINFO;
  15. static struct {
  16. void *handle;
  17. float gain[EQ_BANDS];
  18. bool update;
  19. } equalizer = { .update = true };
  20. /****************************************************************************************
  21. * open equalizer
  22. */
  23. void equalizer_open(u32_t sample_rate) {
  24. if (sample_rate != 11025 && sample_rate != 22050 && sample_rate != 44100 && sample_rate != 48000) {
  25. LOG_WARN("equalizer only supports 11025, 22050, 44100 and 48000 sample rates, not %u", sample_rate);
  26. return;
  27. }
  28. equalizer.handle = esp_equalizer_init(2, sample_rate, EQ_BANDS, 0);
  29. equalizer.update = false;
  30. if (equalizer.handle) {
  31. bool active = false;
  32. for (int i = 0; i < EQ_BANDS; i++) {
  33. esp_equalizer_set_band_value(equalizer.handle, equalizer.gain[i], i, 0);
  34. esp_equalizer_set_band_value(equalizer.handle, equalizer.gain[i], i, 1);
  35. active |= equalizer.gain[i] != 0;
  36. }
  37. // do not activate equalizer if all gain are 0
  38. if (!active) equalizer_close();
  39. LOG_INFO("equalizer initialized %u", active);
  40. } else {
  41. LOG_WARN("can't init equalizer");
  42. }
  43. }
  44. /****************************************************************************************
  45. * close equalizer
  46. */
  47. void equalizer_close(void) {
  48. if (equalizer.handle) {
  49. esp_equalizer_uninit(equalizer.handle);
  50. equalizer.handle = NULL;
  51. }
  52. }
  53. /****************************************************************************************
  54. * update equalizer gain
  55. */
  56. void equalizer_update(s8_t *gain) {
  57. for (int i = 0; i < EQ_BANDS; i++) equalizer.gain[i] = gain[i];
  58. equalizer.update = true;
  59. }
  60. /****************************************************************************************
  61. * process equalizer
  62. */
  63. void equalizer_process(u8_t *buf, u32_t bytes, u32_t sample_rate) {
  64. // don't want to process with output locked, so tak ethe small risk to miss one parametric update
  65. if (equalizer.update) {
  66. equalizer_close();
  67. equalizer_open(sample_rate);
  68. }
  69. if (equalizer.handle) {
  70. esp_equalizer_process(equalizer.handle, buf, bytes, sample_rate, 2);
  71. }
  72. }