Big Mouth Billy Bass automation library

Dependents:   BillyBass_with_SD

Revision:
4:f009306756b3
Parent:
3:6c91a6232c4a
Child:
6:ea8136eb6976
--- a/player.hpp	Tue Jun 18 13:11:07 2013 +0000
+++ b/player.hpp	Tue Jun 18 14:10:34 2013 +0000
@@ -47,7 +47,7 @@
     float timeInSong;
     Ticker sampleTicker;
     Song *song;
-    Song::actions_t::iterator nextAction;
+    Action *nextAction;
     unsigned actionsDone;
 
     SongPlayer() : playing(0)
@@ -68,26 +68,25 @@
     }
 
     bool startSong(Song *_song) {
-        if (song) delete song;
         song = _song;
-        nextAction = song->getActions().begin();
+        nextAction = song->getActions();
         timeInSong = 0.0;
         actionsDone = 0;
 
         fprintf(stderr, "starting %s: ", song->getSampleFileName());
         if (fp) fclose(fp);
         fp = fopen(song->getSampleFileName(), "rb");
+        if (!fp) goto on_error;
         fprintf(stderr, "opened, ");
-        if (!fp) return false;
 
+        if (fseek(fp, 0, SEEK_END)) goto on_error;
         fprintf(stderr, "seekend, ");
-        if (fseek(fp, 0, SEEK_END)) return false;
 
         long fileSize = ftell(fp);
         fprintf(stderr, "size=%d, ", fileSize);
-        if (fileSize < 0) return false;
+        if (fileSize < 0) goto on_error;
 
-        if (fseek(fp, 0, SEEK_SET)) return false;
+        if (fseek(fp, 0, SEEK_SET)) goto on_error;
 
         fprintf(stderr, "rewound, ");
         chunksRemaining = nChunks = fileSize / BUFFER_SIZE;
@@ -96,11 +95,16 @@
         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;
+            goto on_error;
         }
 
         sampleTicker.attach_us(this, &SongPlayer::playNextSample, SAMPLE_PERIOD_USEC);
         return true;
+
+on_error:
+        if (fp) fclose(fp);
+        fp = 0;
+        return false;
     }
 
     // swap loading/playing buffers;
@@ -133,7 +137,7 @@
     // look at loading buffer; load only if necessary.
     bool loadIfNecessary() {
         if (loading->isDone()) {
-        fprintf(stderr, "*");
+            fprintf(stderr, "*");
             timeInSong += SECONDS_PER_CHUNK;
             return loadNextChunk();
         } else {
@@ -143,10 +147,10 @@
 
     void playEntireSong(Song *_song) {
         if (!startSong(_song)) return;
-
+        Action* lastAction = song->getActions() + song->getNumActions();
         while (!isDone()) {
-            while (nextAction != song->getActions().end() && nextAction->actIfPast(timeInSong)) {
-            fprintf(stderr, ".");
+            while (nextAction < lastAction && nextAction->actIfPast(timeInSong)) {
+                fprintf(stderr, ".");
                 actionsDone++;
                 nextAction++;
             }