main.c 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. #include "freertos/FreeRTOS.h"
  2. #include "freertos/task.h"
  3. #include "esp_log.h"
  4. #include "esp_err.h"
  5. #include "esp_timer.h"
  6. #include "bsp_board.h"
  7. #include "tca9555_driver.h"
  8. #include "LED.h"
  9. #define SAMPLE_RATE 16000
  10. #define DELAY_SECONDS 1
  11. #define DELAY_SAMPLES (SAMPLE_RATE * DELAY_SECONDS)
  12. static int16_t mono[256];
  13. static int16_t stereo[512];
  14. static int16_t delay_buffer[DELAY_SAMPLES];
  15. static uint32_t write_idx = 0;
  16. static uint32_t read_idx = DELAY_SAMPLES/2;
  17. static void mic_task(void *arg)
  18. {
  19. int16_t buffer[1024];
  20. while(1)
  21. {
  22. esp_get_feed_data(true, buffer, sizeof(buffer));
  23. int level = get_mic_level();
  24. for(int i = 0; i < 256; i++)
  25. {
  26. mono[i] = buffer[i*4+3];
  27. }
  28. for(int i = 0; i < 256; i++) {
  29. delay_buffer[write_idx] = mono[i];
  30. write_idx++;
  31. if(write_idx >= DELAY_SAMPLES)
  32. write_idx = 0;
  33. }
  34. static int16_t delayed_mono[256];
  35. for(int i = 0; i < 256; i++) {
  36. delayed_mono[i] = delay_buffer[read_idx];
  37. read_idx++;
  38. if(read_idx >= DELAY_SAMPLES)
  39. read_idx = 0;
  40. }
  41. for(int i = 0; i < 256; i++)
  42. {
  43. stereo[i*2] = delayed_mono[i];
  44. stereo[i*2+1] = delayed_mono[i];
  45. }
  46. esp_audio_play(
  47. stereo,
  48. sizeof(stereo),
  49. portMAX_DELAY
  50. );
  51. if(level > 70)
  52. {
  53. led_strip_set_pixel(
  54. led_strip,
  55. 0,
  56. 5,
  57. 5,
  58. 5
  59. );
  60. led_strip_refresh(led_strip);
  61. }
  62. else
  63. {
  64. led_strip_clear(led_strip);
  65. }
  66. }
  67. }
  68. void app_main()
  69. {
  70. ESP_ERROR_CHECK(esp_board_init(16000, 2, 16));
  71. gpio_set_level(GPIO_PWR_CTRL, 1);
  72. esp_audio_set_play_vol(60);
  73. tca9555_driver_init();
  74. led_strip = configure_led();
  75. xTaskCreate(
  76. mic_task,
  77. "mic_task",
  78. 8192,
  79. NULL,
  80. 5,
  81. NULL
  82. );
  83. }