Big Mouth Billy Bass player that takes raw wavefiles and decision list text files from an SD card
Dependencies: SDFileSystem mbed BillyBass
Revision 3:00b4c1aadd30, committed 2013-06-07
- 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(;;) - ; }