Big Mouth Billy Bass player that takes raw wavefiles and decision list text files from an SD card

Dependencies:   SDFileSystem mbed BillyBass

Revision:
4:babc37764bd3
Parent:
3:00b4c1aadd30
Child:
5:5b846ef42702
--- a/main.cpp	Fri Jun 07 04:00:57 2013 +0000
+++ b/main.cpp	Fri Jun 14 05:08:54 2013 +0000
@@ -100,14 +100,26 @@
         char basename[ MAX_BASENAME_LENGTH + 1 ];
         unsigned num1, num2;
         char extension[ 4 ];
-        int nItems = sscanf(_name, "%u_%u_%s", &num1, &num2, basename);
-        if (nItems != 3) { pc.printf(" nItems=%d\n", nItems); return false; }
+        int nItems = sscanf(_name, BASS_DIRECTORY "/%u_%u_%s", &num1, &num2, basename);
+        if (nItems != 3) {
+            pc.printf(" nItems=%d\r\n", nItems);
+            return false;
+        }
         char *p = strrchr(basename, '.');
-        if (!p) { pc.printf(" no extension\n"); return false;}
+        if (!p) {
+            pc.printf(" no extension\r\n");
+            return false;
+        }
         strcpy(extension, p+1);
         *p = 0;
-        if (num2 > 2) { pc.printf(" num2=%d\n", num2); return false; }
-        if (strcasecmp("raw", extension)) { pc.printf(" ext=%s\n", extension); return false; }
+        if (num2 > 2) {
+            pc.printf(" num2=%d\r\n", num2);
+            return false;
+        }
+        if (strcasecmp("raw", extension)) {
+            pc.printf(" ext=%s\r\n", extension);
+            return false;
+        }
         _num1 = num1;
         _num2 = num2;
         strcpy(_basename, basename);
@@ -164,25 +176,34 @@
     float timeInSong;
     Ticker sampleTicker;
 
+    SongPlayer() : playing(0), loading(0), fp(0), nChunks(0), chunksRemaining(0)
+    {}
+
     // interrupt handler
     void playNextSample(void) {
-        if (!playing->samplesRemaining)
+        if (playing->samplesRemaining == 0)
             swapBuffers();
-        // TODO change bias to 0xC000 (requires normalizing to 75% of full scale)
-        speaker.write_u16(static_cast<uint16_t>(playing->getNextSample() + 0x8000));
+        // NOTE bias of 0xC000 requires normalizing to 75% of full scale
+        speaker.write_u16(static_cast<uint16_t>(playing->getNextSample() + 0x8000) / 2);
     }
 
     bool startSong(char const *name) {
+        pc.printf("starting %s: ", name);
         if (fp) fclose(fp);
         fp = fopen(name, "rb");
-        if (!fp) return false;
+        pc.printf("opened, ");
+        if (!fp)  return false;
+        pc.printf("seekend, ");
         if (fseek(fp, 0, SEEK_END)) return false;
         long fileSize = ftell(fp);
+        pc.printf("size=%d, ", fileSize);
         if (fileSize < 0) return false;
         if (fseek(fp, 0, SEEK_SET)) return false;
+        pc.printf("rewound, ");
         chunksRemaining = nChunks = fileSize / BUFFER_SIZE;
         loading = &buffer[0];
         playing = &buffer[1];
+        pc.printf("chunks=%d expected=%f seconds\r\n", nChunks, nChunks * SECONDS_PER_CHUNK);
         if (! loadNextChunk())
             return false;
         timeInSong = 0.0;
@@ -223,7 +244,7 @@
             return loadNextChunk();
         } else return true;
     }
-    
+
     void playEntireSong(char const *name) {
         if (!startSong(name)) return;
         while (!isDone()) {
@@ -238,16 +259,19 @@
 int main()
 {
     SongPlayer player;
+    pc.baud(115200);
 
     // read the directory
     DIR *bassDir = opendir(BASS_DIRECTORY);
     if (bassDir) {
         while (dirent *dir = bassDir->readdir()) {
-            pc.printf("%s", dir->d_name);
+            char fn[ 60 ];
+            snprintf(fn, sizeof(fn), "%s/%s", BASS_DIRECTORY, dir->d_name);
+            pc.printf(fn);
             // if this is a valid wave filename
-            if (Song::isValidWaveFileName(dir->d_name)) {
+            if (Song::isValidWaveFileName(fn)) {
                 pc.printf("\tvalid\r\n");
-                player.playEntireSong(dir->d_name);
+                player.playEntireSong(fn);
                 pc.printf("Song time: %f\r\n", player.timeInSong);
             } else {
                 pc.printf("\tnot valid\r\n");