Задержка звука I2S с SD-карты на усилитель MAX98357A
Я пытаюсь воспроизвести wav-файл, сохраненный на SD-карте, с помощью модуля разработчика ESP32. Для вывода я использую модуль усилителя MAX98357A и I2S.
Все работает нормально, за исключением того, что я получаю задержку вывода примерно на 4–5 секунд, и из-за этого я не могу сказать, когда звук был завершен, поэтому я могу закрыть этот порт I2S.
Я добавил задержку в 4 секунды только для завершения воспроизведения звука, чем закрываю порт I2S, и я не хочу добавлять случайные задержки, подобные этой.
Вопрос в том, почему у меня вообще возникает задержка? Есть ли способ узнать, что воспроизведение аудио было завершено ?? Мой "i2s_read_len" имеет размер 16384. Он слишком большой или что-то в этом роде? Размер файла составляет 1 МБ.
Спасибо. Пожалуйста, спросите, если вам нужна дополнительная информация.
if (!digitalRead(15)) { // Воспроизведение
digitalWrite(2, 1);
file = SD.open(filename, FILE_READ);
if (!file) return;
byte header[headerSize];
file.read(header, headerSize);
WAV_RECORD_SIZE = (header[43] << 24) + (header[42] << 16) + (header[41] << 8) + header[40];
// WAV_RECORD_SIZE = file.size();
Serial.print("record size : ");
Serial.println(WAV_RECORD_SIZE);
i2sInit_tx();
unsigned long i2s_wr_size = 0;
size_t bytes_written;
uint8_t* sd_read_buff = (uint8_t*)calloc(i2s_read_len, sizeof(uint8_t));
Serial.println(" *** Playing Start *** ");
while (i2s_wr_size < WAV_RECORD_SIZE) {
file.read((uint8_t*)sd_read_buff, i2s_read_len);
i2s_write(I2S_PORT_TX, (void*)sd_read_buff, i2s_read_len, &bytes_written, portMAX_DELAY);
i2s_wr_size += i2s_read_len;
ets_printf(" %u", i2s_wr_size * 100 / WAV_RECORD_SIZE); // показать процент процесса
}
ets_printf("\n");
file.close();
free(sd_read_buff);
sd_read_buff = NULL;
delay(4000);
// i2s_zero_dma_buffer(I2S_PORT_TX);
i2s_driver_uninstall(I2S_PORT_TX);
digitalWrite(2, 0);
Serial.println("Audio play completed");
}
delay(10);
Ниже приведена конфигурация I2S
i2s_config_t i2s_config = {
.mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),
.sample_rate = I2S_SAMPLE_RATE, // 16000
.bits_per_sample = i2s_bits_per_sample_t(I2S_SAMPLE_BITS), // 16
.channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,
.communication_format = i2s_comm_format_t(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB),
.intr_alloc_flags = 0,
.dma_buf_count = 64,
.dma_buf_len = 1024,
.use_apll = 1
};
@dharmikP, 👍0
0
- Ошибка StoreProhibited при попытке чтения файла в PROGMEM
- ESP32 в Arduino-IDE с FS.h и SPIFFS
- Программаторы для этой платы отсутствуют - Программирование ESP32 Cam с помощью Ardunio IDE
- Установка значения float до двух знаков после запятой
- ESP32-CAM первый: 0x8 TG1WDT_SYS_RESET загрузочный цикл
- esp32 Stack canary watchpoint срабатывает
- Проверка размера во флэш-памяти Esp32
- Ошибка Cast from 'char*' to 'uint8_t {aka unsigned char}' loses precision [-fpermissive]