10#include "freertos/FreeRTOS.h"
11#include "freertos/task.h"
12#include "freertos/queue.h"
15#include "bsp/esp-bsp.h"
23#define BUFFER_SIZE (64)
24#define SAMPLE_RATE (16000)
25#define DEFAULT_VOLUME (100)
28static const char *
TAG =
"example";
41 uint16_t num_channels;
44 uint16_t bits_per_sample;
59static const char play_filename[] = BSP_SPIFFS_MOUNT_POINT
"/16bit_mono_44_1_khz.wav";
112 float multiplier = 1.0 / (float)(INT16_MAX + 1);
113 for (
int i = 0 ; i < len ; i++) {
114 float_data[i] = (float)int16_data[i] * multiplier;
121 float multiplier = (float)(INT16_MAX + 1);
122 for (
int i = 0 ; i < len ; i++) {
123 int16_data[i] = (int16_t)((
float)multiplier * (
float)float_data[i]);
133void digitalLimiter(
float *input_signal,
float *output_signal,
int signal_length,
float threshold,
float attack_value,
float release_value,
float *in_envelope)
135 float envelope = *in_envelope;
136 for (
int i = 0; i < signal_length; i++) {
138 float abs_input = fabsf(input_signal[i]);
139 if (abs_input > envelope) {
140 envelope = envelope * (1 - attack_value) + attack_value * abs_input;
142 envelope = envelope * (1 - release_value) + release_value * abs_input;
146 if (envelope > threshold) {
147 output_signal[i] = input_signal[i] * (threshold / envelope);
149 output_signal[i] = input_signal[i];
152 *in_envelope = envelope;
169 ESP_LOGW(
TAG,
"Error in reading file");
173 ESP_LOGI(
TAG,
"Number of channels: %" PRIu16
"",
wav_header.num_channels);
174 ESP_LOGI(
TAG,
"Bits per sample: %" PRIu16
"",
wav_header.bits_per_sample);
175 ESP_LOGI(
TAG,
"Sample rate: %" PRIu32
"",
wav_header.sample_rate);
176 ESP_LOGI(
TAG,
"Data size: %" PRIu32
"",
wav_header.data_size);
177 esp_codec_dev_sample_info_t fs = {
180 .bits_per_sample =
wav_header.bits_per_sample,
192 BaseType_t ret = xTaskCreate(
buttons_process_task,
"buttons_process_task", 4096, NULL, 4, NULL);
193 assert(ret == pdPASS);
197 ret = xTaskCreate(
audio_read_task,
"audio_read_task", 4096, NULL, 7, NULL);
198 assert(ret == pdPASS);
201 ESP_LOGW(
TAG,
"To select volume/bass/treble please use the 'Set' button. And adjust the value with +/- buttons.");
218 ESP_LOGW(
TAG,
"Audio buffer overflow!");
264 ESP_LOGE(
TAG,
"Audio timeout!");
273 if (xQueueReceive(
audio_button_q, &btn_index, portMAX_DELAY) == pdTRUE) {
275 case BSP_BUTTON_SET: {
282 ESP_LOGW(
TAG,
"Select volume");
285 ESP_LOGW(
TAG,
"Select bass");
288 ESP_LOGW(
TAG,
"Select treble");
295 case BSP_BUTTON_VOLDOWN: {
326 case BSP_BUTTON_VOLUP: {
358 ESP_LOGI(
TAG,
"No function for this button");
367 ESP_ERROR_CHECK(bsp_spiffs_mount());
373 BaseType_t ret = xTaskCreate(
audio_process_task,
"audio_process_task", 4096, NULL, 6, NULL);
374 assert(ret == pdPASS);
377 button_handle_t btns[BSP_BUTTON_NUM];
378 ESP_ERROR_CHECK(bsp_iot_button_create(btns, NULL, BSP_BUTTON_NUM));
379 for (
int i = 0; i < BSP_BUTTON_NUM; i++) {
380 ESP_ERROR_CHECK(iot_button_register_cb(btns[i], BUTTON_PRESS_DOWN,
btn_handler, (
void *) i));
static bool button_pressed
void digitalLimiter(float *input_signal, float *output_signal, int signal_length, float threshold, float attack_value, float release_value, float *in_envelope)
static SemaphoreHandle_t sync_read_task
static audio_set_t current_set
static void audio_read_task(void *arg)
static QueueHandle_t audio_button_q
static void btn_handler(void *button_handle, void *usr_data)
static const char play_filename[]
float processing_audio_buffer[(64)]
static void buttons_process_task(void *arg)
enum audio_set audio_set_t
static dumb_wav_header_t wav_header
static void audio_process_task(void *arg)
int audio_buffer_read_index
int audio_buffer_write_index
static esp_codec_dev_handle_t spk_codec_dev
static void convert_float2short(float *float_data, int16_t *int16_data, int len)
int16_t triple_audio_buffer[3 *(64)]
static void convert_short2float(int16_t *int16_data, float *float_data, int len)
esp_err_t dsps_biquad_gen_lowShelf_f32(float *coeffs, float f, float gain, float qFactor)
low shelf IIR filter coefficients
esp_err_t dsps_biquad_gen_highShelf_f32(float *coeffs, float f, float gain, float qFactor)
high shelf IIR filter coefficients
esp_err_t dsps_mulc_f32_ansi(const float *input, float *output, int len, float C, int step_in, int step_out)
multiply constant
struct __attribute__((packed))
static float data[128 *2]