-1

I am using SeedStudio ESP32 Xiao Sense to record multiple samples of audio at once. I modified the sample code to do so. However, for some reason the header is corrupted(not sure for other parts) and the file will not play.

Below is the code I modified. I can't find the error and don't know how to proceed further.

Link to audio files: Google drive folder for audio samples recorded.

#include "ESP_I2S.h"
#include "FS.h"
#include "SD.h"

void record(uint8_t wav_buffer, size_t wav_size, int i);
void save(uint8_t* wav_buffer, size_t wav_size, int i);

void setup() {

  Serial.begin(115200);
  while (!Serial) {
    delay(10);
  }

  I2SClass i2s;

  uint8_t *wav_buffer;
  size_t wav_size;

  Serial.println("Initializing I2S bus...");

  i2s.setPinsPdmRx(42, 41);

  for(int i=0; i<5;i++){
    record(i2s, wav_buffer, wav_size, i);
  }

  Serial.println("Application complete.");
}

void record(I2SClass i2s, uint8_t* wav_buffer, size_t wav_size, int i){

  // start I2S at 16 kHz with 16-bits per sample
  if (!i2s.begin(I2S_MODE_PDM_RX, 16000, I2S_DATA_BIT_WIDTH_16BIT, I2S_SLOT_MODE_MONO)) {
    Serial.println("Failed to initialize I2S!");
    while (1); // do nothing
  }

  Serial.println("I2S bus initialized.");
  // Serial.println(wav_size);
  wav_buffer = i2s.recordWAV(5, &wav_size);

  // Serial.println(wav_size);
  free(wav_buffer);
  
  // Serial.println("Block END\n");
  save(wav_buffer, wav_size, i);
  }

void save(uint8_t* wav_buffer, size_t wav_size, int i){

  Serial.println("Initializing SD card...");
  if(!SD.begin(21)){
    Serial.println("Failed to mount SD Card!");
    while (1) ;
  }
  Serial.println("SD card initialized.");

  String file_name = "/audio_"+String(i)+".wav";
  // Create a file on the SD card
  File file = SD.open(file_name, FILE_WRITE);
  if (!file) {
    Serial.println("Failed to open file for writing!");
    return;
  }

  Serial.println("Writing audio data to file...");

  // Write the audio data to the file
  if (file.write(wav_buffer, wav_size) != wav_size) {
    Serial.println("Failed to write audio data to file!");
    return;
  }

  file.close();
}

void loop() {
  delay(1000);
  Serial.printf(".");
}

1 Answer 1

1

I was freeing the buffer before saving data to the file.

Here's the updated code.

#include "ESP_I2S.h"
#include "FS.h"
#include "SD.h"

void record(uint8_t wav_buffer, size_t wav_size, int i);
void save(uint8_t* wav_buffer, size_t wav_size, int i);

void setup() {

  Serial.begin(115200);
  while (!Serial) {
    delay(10);
  }

  I2SClass i2s;

  uint8_t *wav_buffer;
  size_t wav_size;

  Serial.println("Initializing I2S bus...");

  i2s.setPinsPdmRx(42, 41);

  for(int i=0; i<5;i++){
    record(i2s, wav_buffer, wav_size, i);
  }

  Serial.println("Application complete.");
}

void record(I2SClass i2s, uint8_t* wav_buffer, size_t wav_size, int i){

  // start I2S at 16 kHz with 16-bits per sample
  if (!i2s.begin(I2S_MODE_PDM_RX, 16000, I2S_DATA_BIT_WIDTH_16BIT, I2S_SLOT_MODE_MONO)) {
    Serial.println("Failed to initialize I2S!");
    while (1); // do nothing
  }

  Serial.println("I2S bus initialized.");
  // Serial.println(wav_size);
  wav_buffer = i2s.recordWAV(5, &wav_size);
  
  // Serial.println("Block END\n");
  save(wav_buffer, wav_size, i);

  // Serial.println(wav_size);
  free(wav_buffer);
  }

void save(uint8_t* wav_buffer, size_t wav_size, int i){

  Serial.println("Initializing SD card...");
  if(!SD.begin(21)){
    Serial.println("Failed to mount SD Card!");
    while (1) ;
  }
  Serial.println("SD card initialized.");

  String file_name = "/audio_"+String(i)+".wav";
  // Create a file on the SD card
  File file = SD.open(file_name, FILE_WRITE);
  if (!file) {
    Serial.println("Failed to open file for writing!");
    return;
  }

  Serial.println("Writing audio data to file...");

  // Write the audio data to the file
  if (file.write(wav_buffer, wav_size) != wav_size) {
    Serial.println("Failed to write audio data to file!");
    return;
  }

  file.close();
}

void loop() {
  delay(1000);
  Serial.printf(".");
}
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.