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:
- 1:f3f439154ab4
- Parent:
- 0:0944c3654ded
- Child:
- 2:f96989f2b8a1
--- a/main.cpp Wed Jun 05 15:33:45 2013 +0000
+++ b/main.cpp Fri Jun 07 03:33:10 2013 +0000
@@ -40,6 +40,7 @@
const size_t BUFFER_SIZE = 512;
const float SAMPLE_RATE_HZ = 8000.0;
+const unsigned SAMPLE_PERIOD_USEC = (unsigned)(1.0e6/SAMPLE_RATE_HZ);
const size_t SAMPLES_PER_BUFFER = BUFFER_SIZE / sizeof(Sample_t);
const float SECONDS_PER_CHUNK = SAMPLES_PER_BUFFER / SAMPLE_RATE_HZ;
@@ -141,6 +142,11 @@
return samplesRemaining > 0;
}
+ Sample_t getNextSample() {
+ --samplesRemaining;
+ return *++nextSample;
+ }
+
SampleBuffer() : samplesRemaining(0), nextSample(buf) { }
};
@@ -151,6 +157,15 @@
FILE *fp;
size_t nChunks;
size_t volatile chunksRemaining;
+ Ticker sampleTicker;
+
+ // interrupt handler
+ void playNextSample(void) {
+ if (!playing->samplesRemaining)
+ swapBuffers();
+ // TODO change bias to 0xC000 (requires normalizing to 75% of full scale)
+ speaker.write_u16(static_cast<uint16_t>(playing->getNextSample() + 0x8000));
+ }
bool startSong(char const *name) {
if (fp) fclose(fp);
@@ -163,7 +178,10 @@
chunksRemaining = nChunks = fileSize / BUFFER_SIZE;
loading = &buffer[0];
playing = &buffer[1];
- return loadNextChunk();
+ if (! loadNextChunk())
+ return false;
+ sampleTicker.attach_us(this, &SongPlayer::playNextSample, SAMPLE_PERIOD_USEC);
+ return true;
}
// swap loading/playing buffers;
@@ -192,6 +210,12 @@
return !chunksRemaining;
}
+ // look at loading buffer; load only if necessary.
+ bool loadIfNecessary() {
+ if (loading->isDone()) {
+ return loadNextChunk();
+ } else return true;
+ }
};
std::list<Song> songs;
Ned Konz