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-10-02
Revision:
2:511479736d6e
Parent:
1:c7968701f7b3
Child:
4:d730d024ac32

File content as of revision 2:511479736d6e:

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

#include "SD_PlayerSkeleton.hpp"

namespace Mikami
{
    SD_PlayerSkeleton::SD_PlayerSkeleton(string str, int fs, bool reset)
        : 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),
          resetActive_(reset)
    {
        if (!selector_.CreateTable())
            BlinkLabel errLabel(240, 100, "SD CARD ERROR", Label::CENTER);

        menu_.InactivateAll();
        menu_.Activate(0);
        if (resetActive_) reset_ = new ResetButton();
    }

    void SD_PlayerSkeleton::Execute()
    {
        bool playOk = false;
        bool whileFirst = true;
        int32_t loopCount;

        while (true)
        {
            if (!playOk)
            {
                if (whileFirst)
                {
                    whileFirst = false;
                    while (!menu_.Touched(0))   // OPEN がタッチされるまで待つ
                        CheckCtrl();
                    SelectFile();
                }
                else
                {
                    menu_.Activate(1);          // PLAY 有効
                    int touch10;
                    while (!menu_.GetTouchedNumber(touch10))
                        CheckCtrl();
                    if (touch10 == 0) SelectFile();
                }

                loopCount = SD_Open();
                while (!menu_.Touched(1))       // PLAY がタッチされるまで待つ
                    CheckCtrl();
            }
            else
                loopCount = SD_Open();

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

            Display();  // アプリ固有の表示処理
            if (resetActive_) reset_->Draw();

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

            playOk = 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 がタッチされるまで待つ
                    int touch134 = -1;
                    while (!menu_.GetTouchedNumber(touch134))
                        CheckCtrl();
                    switch (touch134)
                    {
                        case 1: playOk = true;      // 最初から PLAY
                                break;
                        case 3: mySai_.ResumeOut(); // PAUSE したところから PLAY 再開
                                menu_.Activate(2);
                                menu_.Inactivate(3);
                                menu_.TouchedColor(1);
                                break;
                        case 4: stopOk = true;      // STOP
                                break;
                    }
                }
                if (playOk || stopOk) break;

                CheckCtrl();
                // 1フレーム分の信号処理の実行
                SignalProcessing();
            }
            mySai_.StopOut();
            menu_.Activate(0);                  // OPEN 有効
            if (!playOk) menu_.Activate(1);     // PLAY 有効
            for (int n=2; n<5; n++)             // その他は無効
                menu_.Inactivate(n);
            sdReader_.Close();   // SD のファイルのクローズ
        }
    }

    // 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");
        do
        {
            if (selector_.Select(fileName_))
                menu_.Activate(1);      // PLAY 有効
            wait_ms(200);
        } while (!menu_.Touched(1));    // PLAY がタッチされるまで繰り返す
    }

    // パネル操作のチェック
    void SD_PlayerSkeleton::CheckCtrl()
    {
        if (resetActive_) reset_->Do();
        Modefy();
    }
}