Go Down

Topic: Issues with sd.exists and sd.open  (Read 556 times) previous topic - next topic

neha__sharma

Hi,

I'm trying to record Ogg files using the Record Ogg example included with the Adafruit_VS1053.h library, but am running into some issues. I feel quite confident that my hardware setup is ok, and am pretty sure it is a code issue. After debugging the example code with several Serial.print commands, commenting out certain sections, and searching extensively on Google, I have reached the conclusion that the commands sd.exists(filename) and sd.open(filename) are the culprits that are causing my code to hang. What I mean by hang is that the code does not progress to the next line after these commands and gets stuck on them (and returns no values).

Upon Googling, I've found some posts talking about how sd.exists(filename) and sd.open(filename) break stuff due to some kind of discrepancy in the SD.h library about what can be passed into them (char* or const char*). Since I am very new to Arduino and programming, this is all kind of going over my head. I was wondering if there was a way to somehow fix the Record Ogg example included with the Adafruit_VS1053.h library to avoid these issues? Or perhaps there's another SD library that it can work with?

Thanks a lot for your time!

PS: This is my first post on any Arduino forum, so please bear with me!

Here is the code I am using:

 This is an example for the Adafruit VS1053 Codec Breakout

  Designed specifically to work with the Adafruit VS1053 Codec Breakout
  ----> https://www.adafruit.com/products/1381

  Adafruit invests time and resources providing this open source code,
  please support Adafruit and open-source hardware by purchasing
  products from Adafruit!

  Written by Limor Fried/Ladyada for Adafruit Industries. 
  BSD license, all text above must be included in any redistribution
 ****************************************************/

// This is a very beta demo of Ogg Vorbis recording. It works...
// Connect a button to digital 7 on the Arduino and use that to
// start and stop recording.

// A mic or line-in connection is required. See page 13 of the
// datasheet for wiring

// Don't forget to copy the v44k1q05.img patch to your micro SD
// card before running this example!


// include SPI, MP3 and SD libraries
#include <SPI.h>
#include <Adafruit_VS1053.h>
#include <SD.h>

// define the pins used
#define RESET 8      // VS1053 reset pin (output)
#define CS 6        // VS1053 chip select pin (output)
#define DCS 7        // VS1053 Data/command select pin (output)
#define CARDCS 9     // Card chip select pin
#define DREQ 2       // VS1053 Data request, ideally an Interrupt pin

#define REC_BUTTON 10

Adafruit_VS1053_FilePlayer musicPlayer = Adafruit_VS1053_FilePlayer(RESET, CS, DCS, DREQ, CARDCS);

File recording;  // the file we will save our recording to
#define RECBUFFSIZE 128  // 64 or 128 bytes.
uint8_t recording_buffer[RECBUFFSIZE];

void setup() {
  Serial.begin(9600);
  Serial.println("Adafruit VS1053 Ogg Recording Test");

  // initialise the music player
  if (!musicPlayer.begin()) {
    Serial.println("VS1053 not found");
    while (1);  // don't do anything more
  }

  musicPlayer.sineTest(0x44, 500);    // Make a tone to indicate VS1053 is working
 
  if (!SD.begin(CARDCS)) {
    Serial.println("SD failed, or not present");
    while (1);  // don't do anything more
  }
  Serial.println("SD OK!");
 
  // Set volume for left, right channels. lower numbers == louder volume!
  musicPlayer.setVolume(10,10);
 
  // when the button is pressed, record!
  pinMode(REC_BUTTON, INPUT);
  digitalWrite(REC_BUTTON, HIGH);
 
  // load plugin from SD card! We'll use mono 44.1KHz, high quality
  if (! musicPlayer.prepareRecordOgg("v44k1q05.img")) {
     Serial.println("Couldn't load plugin!");
     while (1);   
  }
}

uint8_t isRecording = false;

void loop() { 
  if (!isRecording && !digitalRead(REC_BUTTON)) {
    Serial.println("Begin recording");
    isRecording = true;
   
    // Check if the file exists already
    char filename[15];
    strcpy(filename, "RECORD00.OGG");
    for (uint8_t i = 0; i < 100; i++) {
      filename[6] = '0' + i/10;
      filename[7] = '0' + i%10;
      // create if does not exist, do not open existing, write, sync after write
      if (! SD.exists(filename)) {
        break;
      }
    }
    Serial.print("Recording to "); Serial.println(filename);
    recording = SD.open(filename, FILE_WRITE);
    if (! recording) {
       Serial.println("Couldn't open file to record!");
       while (1);
    }
    musicPlayer.startRecordOgg(true); // use microphone (for linein, pass in 'false')
    Serial.println("start record ogg stuff done");
  }
  if (isRecording){
    saveRecordedData(isRecording);
     }
  if (isRecording && digitalRead(REC_BUTTON)) {
    Serial.println("End recording");
    musicPlayer.stopRecordOgg();
    isRecording = false;
    // flush all the data!
    saveRecordedData(isRecording);
    // close it up
    recording.close();
    delay(1000);
  }
}


uint16_t saveRecordedData(boolean isrecord) {
  uint16_t written = 0;
 
    // read how many words are waiting for us
  uint16_t wordswaiting = musicPlayer.recordedWordsWaiting();
 
  // try to process 256 words (512 bytes) at a time, for best speed
  while (wordswaiting > 256) {
    //Serial.print("Waiting: "); Serial.println(wordswaiting);
    // for example 128 bytes x 4 loops = 512 bytes
    for (int x=0; x < 512/RECBUFFSIZE; x++) {
      // fill the buffer!
      for (uint16_t addr=0; addr < RECBUFFSIZE; addr+=2) {
        uint16_t t = musicPlayer.recordedReadWord();
        //Serial.println(t, HEX);
        recording_buffer[addr] = t >> 8;
        recording_buffer[addr+1] = t;
      }
      if (! recording.write(recording_buffer, RECBUFFSIZE)) {
            Serial.print("Couldn't write "); Serial.println(RECBUFFSIZE);
            while (1);
      }
    }
    // flush 512 bytes at a time
    recording.flush();
    written += 256;
    wordswaiting -= 256;
  }
 
  wordswaiting = musicPlayer.recordedWordsWaiting();
  if (!isrecord) {
    Serial.print(wordswaiting); Serial.println(" remaining");
    // wrapping up the recording!
    uint16_t addr = 0;
    for (int x=0; x < wordswaiting-1; x++) {
      // fill the buffer!
      uint16_t t = musicPlayer.recordedReadWord();
      recording_buffer[addr] = t >> 8;
      recording_buffer[addr+1] = t;
      if (addr > RECBUFFSIZE) {
          if (! recording.write(recording_buffer, RECBUFFSIZE)) {
                Serial.println("Couldn't write!");
                while (1);
          }
          recording.flush();
          addr = 0;
      }
    }
    if (addr != 0) {
      if (!recording.write(recording_buffer, addr)) {
        Serial.println("Couldn't write!"); while (1);
      }
      written += addr;
    }
    musicPlayer.sciRead(VS1053_SCI_AICTRL3);
    if (! (musicPlayer.sciRead(VS1053_SCI_AICTRL3) & _BV(2))) {
       recording.write(musicPlayer.recordedReadWord() & 0xFF);
       written++;
    }
    recording.flush();
  }

  return written;
}

Vomitcomet

#1
Jun 17, 2019, 12:50 am Last Edit: Jun 17, 2019, 01:13 am by Vomitcomet Reason: More detailed answer
Scratch that: See topic: https://forum.arduino.cc/index.php?topic=143246.0  it's possible you may need to rewindDirectory

First question: Have you modified the header library? (Adafruit_VS1053.h) because they hard-code the DREQ pin if I remember correctly with #define VS1053_FILEPLAYER_PIN_INT 5 (line 74).

Second: Do you have the codec already loaded onto your card? v44k1q05.img That's not included in the library and needs to be uploaded to your SD card.

Third: Did you check all your wiring and is SPI correctly initializing (SineTest should play)?

Fourth: Are you using an UNO or something with a clock of 16mhz? Because they can't really handle 44.1khz sample rate that well I found, max comfortably without data loss is 16 khz.

Fifth: What sort of microphone input are you using? Differential? Or just Output signal? I personally have used a MAX9814 (with lowest gain setting and using a polarized capacitor to remove DC offset) with output going into MIC+. Then you would set startRecordOgg(false) since you are passing in a line versus differential.

Anyways, i'm pretty sure your issue isn't due to sd.exists and sd.open since this example works fine for me, it's hardware limits/incorrect setup or hard-coding in library.

Go Up