Big Mouth Billy Bass player that takes raw wavefiles and decision list text files from an SD card

Dependencies:   SDFileSystem mbed BillyBass

song.hpp

Committer:
bikeNomad
Date:
2013-06-15
Revision:
5:5b846ef42702

File content as of revision 5:5b846ef42702:

#ifndef __included_song_hpp
#define __included_song_hpp

#include "billybass.hpp"
#include "action.hpp"

struct Song
{
    char basename[ MAX_BASENAME_LENGTH + 1 ];
    unsigned sequenceNumber;
    unsigned whichFish;
    std::list<Action> actions;

    Song() : sequenceNumber(0)
        , whichFish(3) {
        basename[0] = 0;
    }

    bool readWaveFile(char const *_waveFileName)
    {
        if (!parseFilename(_waveFileName, sequenceNumber, whichFish, basename)) return false;

        char txtFileName[ FILENAME_MAX ];
        sprintf(txtFileName, "%u_%u_%s.txt", sequenceNumber, whichFish, basename);
        FILE *txtfile = fopen(txtFileName, "rt");
        if (!txtfile) return false;    // TODO

        // read actions from file
        char actionLine[ MAX_ACTION_LINE_LENGTH + 1 ];
        while (fgets(actionLine, sizeof(actionLine), txtfile))
        {
            Action action;
            if (action.parseLine(actionLine))
            {
                actions.push_back(action);
            }
        }
        return true;
    }

    static bool parseFilename(char const *_name, unsigned &_num1, unsigned &_num2, char *_basename)
    {
        char basename[ MAX_BASENAME_LENGTH + 1 ];
        unsigned num1, num2;
        char extension[ 4 ];
        int nItems = sscanf(_name, BASS_DIRECTORY "/%u_%u_%s", &num1, &num2, basename);
        if (nItems != 3)
        {
            return false;
        }
        char *p = strrchr(basename, '.');
        if (!p)
        {
            return false;
        }
        strcpy(extension, p+1);
        *p = 0;
        if (num2 > 2)
        {
            return false;
        }
        if (strcasecmp("raw", extension))
        {
            return false;
        }
        _num1 = num1;
        _num2 = num2;
        strcpy(_basename, basename);
        return true;
    }

    // return true if filename is of proper format
    // <num>_<num>_<name>.raw
    // and there is a corresponding .txt file
    static bool isValidWaveFileName(char const *_name)
    {
        unsigned int num1, num2;
        char basename[ 31 ];
        return parseFilename(_name, num1, num2, basename);
    }
};

#endif                                 // __included_song_hpp