Big Mouth Billy Bass automation library
Diff: player.hpp
- Revision:
- 3:6c91a6232c4a
- Parent:
- 2:eaba75af0f0d
- Child:
- 4:f009306756b3
--- a/player.hpp Tue Jun 18 06:12:48 2013 +0000 +++ b/player.hpp Tue Jun 18 13:11:07 2013 +0000 @@ -3,6 +3,8 @@ #include "billybass.hpp" +extern AnalogOut speaker; + class SongPlayer; struct SampleBuffer { @@ -54,8 +56,7 @@ , nChunks(0) , chunksRemaining(0) , song(0) - , actionsDone(0) - { + , actionsDone(0) { } // interrupt handler @@ -63,7 +64,7 @@ if (playing->samplesRemaining == 0) swapBuffers(); // NOTE bias of 0xC000 requires normalizing to 75% of full scale - speaker.write_u16(static_cast<uint16_t>(playing->getNextSample() + 0x8000) / 2); + speaker.write_u16(static_cast<uint16_t>(playing->getNextSample() + ANALOG_OUTPUT_BIAS)); } bool startSong(Song *_song) { @@ -73,29 +74,30 @@ timeInSong = 0.0; actionsDone = 0; - pc.printf("starting %s: ", song->getSampleFileName()); + fprintf(stderr, "starting %s: ", song->getSampleFileName()); if (fp) fclose(fp); fp = fopen(song->getSampleFileName(), "rb"); - pc.printf("opened, "); + fprintf(stderr, "opened, "); if (!fp) return false; - pc.printf("seekend, "); + fprintf(stderr, "seekend, "); if (fseek(fp, 0, SEEK_END)) return false; long fileSize = ftell(fp); - pc.printf("size=%d, ", fileSize); + fprintf(stderr, "size=%d, ", fileSize); if (fileSize < 0) return false; if (fseek(fp, 0, SEEK_SET)) return false; - pc.printf("rewound, "); + fprintf(stderr, "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()) + fprintf(stderr, "chunks=%d expected=%f seconds\r\n", nChunks, nChunks * SECONDS_PER_CHUNK); + if (!loadNextChunk()) { + fprintf(stderr, "first chunk empty!\r\n"); return false; - + } sampleTicker.attach_us(this, &SongPlayer::playNextSample, SAMPLE_PERIOD_USEC); return true; @@ -118,8 +120,8 @@ // to prepare for eventual swap. // returns true if more samples remain bool loadNextChunk() { - if (!chunksRemaining) return false; - + if (isDone()) + return false; bool notDone = loading->loadFrom(fp); return notDone; } @@ -131,6 +133,7 @@ // look at loading buffer; load only if necessary. bool loadIfNecessary() { if (loading->isDone()) { + fprintf(stderr, "*"); timeInSong += SECONDS_PER_CHUNK; return loadNextChunk(); } else { @@ -143,12 +146,14 @@ while (!isDone()) { while (nextAction != song->getActions().end() && nextAction->actIfPast(timeInSong)) { + fprintf(stderr, "."); actionsDone++; nextAction++; } loadIfNecessary(); } sampleTicker.detach(); + song->myFish()->relax(); } };