Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: song.cpp
- Revision:
- 1:9b1f3eb204ac
- Parent:
- 0:84aaade0de8f
- Child:
- 3:6c91a6232c4a
diff -r 84aaade0de8f -r 9b1f3eb204ac song.cpp
--- a/song.cpp Mon Jun 17 22:17:59 2013 +0000
+++ b/song.cpp Tue Jun 18 00:07:47 2013 +0000
@@ -15,8 +15,6 @@
char const *Song::sampleExtension = "raw";
// class static
unsigned const Song::NO_FISH = MAX_FISH + 1;
-// class static
-std::list<Song*> Song::songs;
// _name is relative to BASS_DIRECTORY
// class static
@@ -31,11 +29,11 @@
pc.printf("parseFilename(%s) failed\r\n", _name);
goto on_error;
}
+ pc.printf("parsed filename OK\r\n");
if (! s->readActions()) {
pc.printf("readActions(%s) failed\r\n", _name);
goto on_error;
}
- songs.push_back(s);
return s;
@@ -44,36 +42,6 @@
return 0;
}
-// class static
-void Song::clearAllSongs()
-{
- for (std::list<Song *>::const_iterator song = songs.begin(); song != songs.end(); song++)
- delete *song;
- songs.clear();
-}
-
-// class static
-unsigned Song::readAllSongs(DIR *bassDir)
-{
- if (!bassDir) return 0;
- clearAllSongs();
-
- while (dirent *dir = bassDir->readdir()) {
- pc.printf("Reading %s\r\n", dir->d_name);
- unsigned namelen = strlen(dir->d_name);
- if (namelen > 9 && !strcasecmp(dir->d_name + namelen - 3, sampleExtension)) {
- Song *song = Song::newSong(dir->d_name);
- if (!song) {
- pc.printf("ERROR reading %s\r\n", dir->d_name);
- } else {
- song->print(pc);
- }
- }
- }
-
- return songs.size();
-}
-
bool Song::parseFilename(char const *_name)
{
if (strlen(_name) > MAX_BASENAME_LENGTH)
@@ -117,11 +85,14 @@
bool Song::readActions()
{
+ pc.printf("reading actions of %s\r\n", getTextFileName());
+
FILE *txtfile = fopen(getTextFileName(), "r");
if (!txtfile) {
pc.printf("can't open %s\r\n", getTextFileName());
return false;
- }
+ } else
+ pc.printf("opened %s OK\r\n", getTextFileName());
bool retval = false;
BillyBass *bass = BillyBass::bassNumber(whichFish);
@@ -131,16 +102,18 @@
}
// read actions from file
+ static char textFileBuffer[ 2048 ];
+ memset(textFileBuffer, 0, sizeof(textFileBuffer));
+ int nread = fread(textFileBuffer, 1, sizeof(textFileBuffer), txtfile);
+ pc.printf("Read %d\r\n", nread);
+ if (nread <= 0 || nread == sizeof(textFileBuffer)) {
+ goto done;
+ }
unsigned line = 1;
- char actionLine[ MAX_ACTION_LINE_LENGTH + 1 ];
- while (true) {
- if (!fgets(actionLine, sizeof(actionLine), txtfile))
- break;
-
- // delete trailing whitespace
- char *p = actionLine + strlen(actionLine) - 1;
- while (isspace(*p)) *p-- = 0;
-
+ for (char *actionLine = strtok(textFileBuffer, "\r\n");
+ actionLine;
+ actionLine = strtok(0, "\r\n"), line++) {
+ char *p;
float startTime = strtof(actionLine, &p);
if (p == actionLine)
goto done;
@@ -150,29 +123,23 @@
if (q == p)
goto done;
- while (isspace(*q)) q++;
-
char const *outName;
- DigitalOut *out = bass->outputNamed(q, &outName);
+ DigitalOut *out = bass->outputNamed(++q, &outName);
if (!out) {
pc.printf("%s line %d: bad outname \"%s\"\r\n", getTextFileName(), line, q);
goto done;
}
pc.printf("%d add %f %f %s\r\n", line, startTime, endTime, outName);
- actions.push_back(Action(startTime, true, out, outName));
- actions.push_back(Action(endTime, false, out, outName));
-
- line++;
+ // actions.push_back(Action(startTime, true, out, outName));
+ // actions.push_back(Action(endTime, false, out, outName));
}
std::sort(actions.begin(), actions.end()); // sort actions by time
retval = true;
done:
- if (!retval) {
- pc.printf("Error reading action from \"%s\"\r\n", actionLine);
- }
+
fclose(txtfile);
return retval;
}