Library for Skeleton of SD card player. SD カードプレーヤのための骨組みとして使うためのライブラリ.このライブラリを登録した際のプログラム:「F746_SD_Player_Demo」

Dependencies:   SDFileSystem_Warning_Fixed

Dependents:   F746_SD_Player_Demo F746_SD_VarableFilter F746_SD_GraphicEqualizer F746_MySoundMachine ... more

SD_PlayerSkeleton.cpp

Committer:
MikamiUitOpen
Date:
2016-11-15
Revision:
7:930d50953ec2
Parent:
6:6fe2b62f259d
Child:
8:59d3f9c81c4f

File content as of revision 7:930d50953ec2:

//--------------------------------------------------------------
//  SD プレーヤー用抽象基底クラス
//
//  2016/11/15, Copyright (c) 2016 MIKAMI, Naoki
//--------------------------------------------------------------

#include "SD_PlayerSkeleton.hpp"

namespace Mikami
{
    SD_PlayerSkeleton::SD_PlayerSkeleton(string str, int fs, bool resetButton)
        : FRAME_SIZE_(2048), sn_(FRAME_SIZE_),
          mySai_(SaiIO::OUTPUT, FRAME_SIZE_, fs),
          sdReader_(FRAME_SIZE_),
          title_(214, 4, str, Label::CENTER, Font16),
          selector_(0, 22, 256, 37, sdReader_),
          menu_(BG_LEFT_, 2, BG_WIDTH_, BG_HEIGHT_, 5,
                (string[]){"OPEN", "PLAY", "PAUSE", "RESUME", "STOP"},
                0, 2, 1)
    {
        if (!selector_.CreateTable())
            BlinkLabel errLabel(240, 100, "SD CARD ERROR", Label::CENTER);

        menu_.InactivateAll();
        menu_.Activate(0);
        if (resetButton) reset_ = new ResetButton();
        else             reset_ = NULL;
    }

    // SD プレーヤーの処理の実行
    void SD_PlayerSkeleton::Execute()
    {
        bool playAfterPause = false;
        int32_t loopCount;

        WaitTouched(0); // OPEN がタッチされるまで待つ
        SelectFile();
        bool whileFirst = true;

        while (true)
        {
            if (!playAfterPause)    // PAUSE 後の PLAY ではない場合
            {
                if (!whileFirst)    // while ループで初回の処理ではない場合
                {
                    menu_.Activate(1);      // PLAY ボタン有効
                    if (WaitTouched() == 0) SelectFile();
                }

                whileFirst = false;
                loopCount = SD_Open();
                WaitTouched(1);     // PLAY がタッチされるまで待つ
            }
            else                    // PAUSE 後の PLAY の場合
                loopCount = SD_Open();

            selector_.Erase(0, 0, BG_LEFT_-4, 272);
            title_.Draw();

            Display();  // アプリ固有の表示処理(仮想関数)
            if (reset_ != NULL) reset_->Draw();

            menu_.Inactivate(0);    // OPEN ボタン無効
            menu_.Activate(2);      // PAUSE ボタン有効
            menu_.Activate(4);      // STOP ボタン有効

            playAfterPause = false;
            bool stopOk = false;

            Clear();    // アプリ固有のクリア処理(仮想関数)

            mySai_.PlayOut();       // Play 開始

            // ファイルのデータがなくなるまで繰り返す
            for (int k=0; k<loopCount; k++)
            {
                int touch42 = -1;
                menu_.GetTouchedNumber(touch42);
                if (touch42 == 4) break;    // STOP
                if (touch42 == 2)           // PAUSE ボタンがタッチされた場合の処理
                {
                    menu_.Inactivate(2);    // PAUSE ボタン無効
                    menu_.Activate(3);      // RESUME ボタン有効
                    mySai_.PauseOut();

                    // PLAY か RESUME か STOP がタッチされるまで待つ
                    switch (WaitTouched())
                    {
                        case 1: playAfterPause = true;  // 最初から PLAY
                                break;
                        case 3: mySai_.ResumeOut();     // PAUSE したところから
                                menu_.Activate(2);      // PLAY 再開
                                menu_.Inactivate(3);
                                menu_.TouchedColor(1);
                                break;
                        case 4: stopOk = true;          // STOP
                                break;
                    }
                }
                if (playAfterPause || stopOk) break;

                DoIfHandled();
                // アプリ固有の1フレーム分の信号処理(純粋仮想関数)
                SignalProcessing();
            }
            mySai_.StopOut();
            menu_.Activate(0);         // OPEN ボタン有効
            if (!playAfterPause)
                menu_.Activate(1);     // PLAY ボタン有効
            for (int n=2; n<5; n++)    // その他のボタンは無効
                menu_.Inactivate(n);

            sdReader_.Close();   // SD のファイルのクローズ
        }
    }

    // 選択されたファイル名から拡張子を除いたものを取得
    string SD_PlayerSkeleton::GetFileNameNoExt()
    {
        string fName = fileName_;
        int k = fName.rfind(".");
        if (k != string::npos)
            return fName.erase(k);
        else
            return fName;
    }

    // SD カードのファイルのオープン
    int32_t SD_PlayerSkeleton::SD_Open()
    {
        sdReader_.Open(fileName_);
        sdReader_.IsWavFile();
        return sdReader_.GetSize()/FRAME_SIZE_;
    }

    // ファイルの選択
    //      selectedName:   選択されたファイル名
    void SD_PlayerSkeleton::SelectFile()
    {
        selector_.DisplayFileList();
        title_.Draw("Select file");
        menu_.Inactivate(1);      // PLAY ボタン無効
        do
            if (selector_.Select(fileName_))
                menu_.Activate(1);    // PLAY ボタン有効
        while (!menu_.Touched(1));    // PLAY ボタンがタッチされるまで繰り返す
    }

    // パネルが操作された場合の処理
    void SD_PlayerSkeleton::DoIfHandled()
    {
        if (reset_ != NULL) reset_->Do();
        Modefy();   // アプリ固有のパラメータ変更(仮想関数)
    }

    // メニュ-のボタンがタッチされるまで DoIfHandled() を実行しながら待つ
    int SD_PlayerSkeleton::WaitTouched()
    {
        int touchNum;
        while (!menu_.GetTouchedNumber(touchNum)) DoIfHandled();
        return touchNum;
    }
}