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:
- 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");
Ned Konz