title: Arduino WaveHC library: How do I point the program to look in a folder on the root of the SD card?
body: <p>I can't figure out how to make the program look in a specific folder instead of the root of the SD card. I have tried to change the path of the files, but all it says is that it's unable to find the files.</p>
  
  <p>Here's the code:</p>
  
  <pre><code>#include &lt;FatReader.h&gt;
  #include &lt;SdReader.h&gt;
  #include &lt;avr/pgmspace.h&gt;
  #include "WaveUtil.h"
  #include "WaveHC.h"
  
  SdReader card;    // This object holds the information for the card
  FatVolume vol;    // This holds the information for the partition on the card
  FatReader root;   // This holds the information for the filesystem on the card
  FatReader f;      // This holds the information for the file we're play
  
  WaveHC wave; // This is the only wave (audio) object, since we will only play one at a time
  
  #define DEBOUNCE 100  // button debouncer
  
  // This handy function will return the number of bytes currently free in RAM, great for debugging!
  int freeRam(void)
  {
      extern int  __bss_end;
      extern int  *__brkval;
      int free_memory;
      if ((int)__brkval == 0) {
          free_memory = ((int)&amp;free_memory) - ((int)&amp;__bss_end);
  }
  else {
      free_memory = ((int)&amp;free_memory) - ((int)__brkval);
  }
      return free_memory;
  }
  
  void sdErrorCheck(void)
  {
      if (!card.errorCode())
          return;
      putstring("\n\rSD I/O error: ");
      Serial.print(card.errorCode(), HEX);
      putstring(", ");
      Serial.println(card.errorData(), HEX);
      while(1);
  }
  
  void setup() {
      // Set up serial port
      Serial.begin(9600);
      putstring_nl("WaveHC with 6 buttons");
  
      putstring("Free RAM: ");  // This can help with debugging, running out of RAM is bad
      Serial.println(freeRam()); // if this is under 150 bytes it may spell trouble!
  
      // Set the output pins for the DAC control. This pins are defined in the library
      pinMode(2, OUTPUT);
      pinMode(3, OUTPUT);
      pinMode(4, OUTPUT);
      pinMode(5, OUTPUT);
  
      // pin13 LED
      pinMode(13, OUTPUT);
  
      // Enable pull-up resistors on switch pins (analog inputs)
      digitalWrite(14, HIGH);
      digitalWrite(15, HIGH);
      digitalWrite(16, HIGH);
      digitalWrite(17, HIGH);
      digitalWrite(18, HIGH);
      digitalWrite(19, HIGH);
  
      //  if (!card.init(true)) { //play with 4 MHz SPI if 8MHz isn't working for you
      if (!card.init()) {    //play with 8 MHz SPI (default faster!)
          putstring_nl("Card init. failed!");  // Something went wrong, lets print out why
          sdErrorCheck();
          while(1);        // then 'halt' - do nothing!
      }
  
      // enable optimize read - some cards may timeout. Disable if you're having problems
      card.partialBlockRead(true);
  
      // Now we will look for a FAT partition!
      uint8_t part;
      for (part = 0; part &lt; 5; part++) { // We have up to 5 slots to look in
          if (vol.init(card, part))
              break;         // We found one, let's bail
      }
      if (part == 5) { // if we ended up not finding one  :(
        putstring_nl("No valid FAT partition!");
        sdErrorCheck(); // Something went wrong, lets print out why
        while(1);        // then 'halt' - do nothing!
      }
  
      // Let's tell the user about what we found
      putstring("Using partition ");
      Serial.print(part, DEC);
      putstring(", type is FAT");
      Serial.println(vol.fatType(),DEC);     // FAT16 or FAT32?
  
      // Try to open the root directory
      if (!root.openRoot(vol)) {
          putstring_nl("Can't open root dir!"); // Something went wrong,
          while(1);         // then 'halt' - do nothing!
      }
  
      // Whew! We got past the tough parts.
      putstring_nl("Ready!");
  }
  
  void loop() {
      //putstring(".");  // Uncomment this to see if the loop isnt running
      switch (check_switches()) {
          case 1:
            playcomplete("1.WAV");
            break;
          case 2:
              playcomplete("2.WAV");
              break;
          case 3:
              playcomplete("3.WAV");
              break;
           case 4:
               playcomplete("4.WAV");
               break;
           case 5:
               playcomplete("5.WAV");
               break;
           case 6:
               playcomplete("6.WAV");
      }
  }
  
  byte check_switches()
  {
      static byte previous[6];
      static long time[6];
      byte reading;
      byte pressed;
      byte index;
      pressed = 0;
  
      for (byte index = 0; index &lt; 6; ++index) {
          reading = digitalRead(14 + index);
          if (reading == LOW &amp;&amp; previous[index] == HIGH &amp;&amp; millis() - time[index] &gt; DEBOUNCE)
          {
              // switch pressed
              time[index] = millis();
              pressed = index + 1;
              break;
          }
          previous[index] = reading;
      }
      // return switch number (1 - 6)
      return (pressed);
  }
  
  // Plays a full file from beginning to end with no pause.
  void playcomplete(char *name) {
      // call our helper to find and play this name
      playfile(name);
      while (wave.isplaying) {
          // Do nothing while its playing
      }
      // Now it's done playing
  }
  
  void playfile(char *name) {
      // see if the wave object is currently doing something
      if (wave.isplaying) { // Already playing something, so stop it!
            wave.stop(); // Stop it
      }
      // Look in the root directory and open the file
      if (!f.open(root, name)) {
          putstring("Couldn't open file "); Serial.print(name); return;
      }
      // OK read the file and turn it into a wave object
      if (!wave.create(f)) {
          putstring_nl("Not a valid WAV"); return;
      }
  
      // OK time to play! Start playback
      wave.play();
  }
  </code></pre>