Задержка звука 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
  };

, 👍0