Big Mouth Billy Bass player that takes raw wavefiles and decision list text files from an SD card
Dependencies: SDFileSystem mbed BillyBass
Diff: main.cpp
- Revision:
- 3:00b4c1aadd30
- Parent:
- 2:f96989f2b8a1
- Child:
- 4:babc37764bd3
--- 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(;;)
- ;
}
Ned Konz