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

Dependencies:   SDFileSystem mbed BillyBass

Files at this revision

API Documentation at this revision

Comitter:
bikeNomad
Date:
Fri Jun 07 04:00:57 2013 +0000
Parent:
2:f96989f2b8a1
Child:
4:babc37764bd3
Commit message:
added song playing

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/main.cpp	Fri Jun 07 03:36:00 2013 +0000
+++ b/main.cpp	Fri Jun 07 04:00:57 2013 +0000
@@ -100,10 +100,14 @@
         char basename[ MAX_BASENAME_LENGTH + 1 ];
         unsigned num1, num2;
         char extension[ 4 ];
-        int nItems = sscanf(_name, "%u_%u_%30[^_.].%3[a-zA-Z]", &num1, &num2, basename, extension);
-        if (nItems != 4) return false;
-        if (num2 > 2) return false;
-        if (strcasecmp("raw", extension)) return false;
+        int nItems = sscanf(_name, "%u_%u_%s", &num1, &num2, basename);
+        if (nItems != 3) { pc.printf(" nItems=%d\n", nItems); return false; }
+        char *p = strrchr(basename, '.');
+        if (!p) { pc.printf(" no extension\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; }
         _num1 = num1;
         _num2 = num2;
         strcpy(_basename, basename);
@@ -157,6 +161,7 @@
     FILE *fp;
     size_t nChunks;
     size_t volatile chunksRemaining;
+    float timeInSong;
     Ticker sampleTicker;
 
     // interrupt handler
@@ -180,6 +185,7 @@
         playing = &buffer[1];
         if (! loadNextChunk())
             return false;
+        timeInSong = 0.0;
         sampleTicker.attach_us(this, &SongPlayer::playNextSample, SAMPLE_PERIOD_USEC);
         return true;
     }
@@ -213,15 +219,26 @@
     // look at loading buffer; load only if necessary.
     bool loadIfNecessary() {
         if (loading->isDone()) {
+            timeInSong += SECONDS_PER_CHUNK;
             return loadNextChunk();
         } else return true;
     }
+    
+    void playEntireSong(char const *name) {
+        if (!startSong(name)) return;
+        while (!isDone()) {
+            loadIfNecessary();
+        }
+        sampleTicker.detach();
+    }
 };
 
 std::list<Song> songs;
 
 int main()
 {
+    SongPlayer player;
+
     // read the directory
     DIR *bassDir = opendir(BASS_DIRECTORY);
     if (bassDir) {
@@ -230,6 +247,8 @@
             // if this is a valid wave filename
             if (Song::isValidWaveFileName(dir->d_name)) {
                 pc.printf("\tvalid\r\n");
+                player.playEntireSong(dir->d_name);
+                pc.printf("Song time: %f\r\n", player.timeInSong);
             } else {
                 pc.printf("\tnot valid\r\n");
             }
@@ -237,7 +256,4 @@
     } else {
         pc.printf("Error opening " BASS_DIRECTORY);
     }
-
-    for(;;)
-        ;
 }