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

Committer:
MikamiUitOpen
Date:
Tue Nov 08 05:03:43 2016 +0000
Revision:
5:7c8f0fc9dfb6
Parent:
4:d730d024ac32
Child:
6:6fe2b62f259d
6

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 0:d310bb78455d 1 //--------------------------------------------------------------
MikamiUitOpen 0:d310bb78455d 2 // SD プレーヤー用抽象基底クラス
MikamiUitOpen 0:d310bb78455d 3 //
MikamiUitOpen 5:7c8f0fc9dfb6 4 // 2016/11/08, Copyright (c) 2016 MIKAMI, Naoki
MikamiUitOpen 0:d310bb78455d 5 //--------------------------------------------------------------
MikamiUitOpen 0:d310bb78455d 6
MikamiUitOpen 0:d310bb78455d 7 #include "SD_PlayerSkeleton.hpp"
MikamiUitOpen 0:d310bb78455d 8
MikamiUitOpen 0:d310bb78455d 9 namespace Mikami
MikamiUitOpen 0:d310bb78455d 10 {
MikamiUitOpen 5:7c8f0fc9dfb6 11 SD_PlayerSkeleton::SD_PlayerSkeleton(string str, int fs, bool resetButton)
MikamiUitOpen 0:d310bb78455d 12 : FRAME_SIZE_(2048), sn_(FRAME_SIZE_),
MikamiUitOpen 0:d310bb78455d 13 mySai_(SaiIO::OUTPUT, FRAME_SIZE_, fs),
MikamiUitOpen 0:d310bb78455d 14 sdReader_(FRAME_SIZE_),
MikamiUitOpen 0:d310bb78455d 15 title_(214, 4, str, Label::CENTER, Font16),
MikamiUitOpen 2:511479736d6e 16 selector_(0, 22, 256, 37, sdReader_),
MikamiUitOpen 0:d310bb78455d 17 menu_(BG_LEFT_, 2, BG_WIDTH_, BG_HEIGHT_, 5,
MikamiUitOpen 0:d310bb78455d 18 (string[]){"OPEN", "PLAY", "PAUSE", "RESUME", "STOP"},
MikamiUitOpen 5:7c8f0fc9dfb6 19 0, 2, 1)
MikamiUitOpen 0:d310bb78455d 20 {
MikamiUitOpen 0:d310bb78455d 21 if (!selector_.CreateTable())
MikamiUitOpen 0:d310bb78455d 22 BlinkLabel errLabel(240, 100, "SD CARD ERROR", Label::CENTER);
MikamiUitOpen 0:d310bb78455d 23
MikamiUitOpen 0:d310bb78455d 24 menu_.InactivateAll();
MikamiUitOpen 0:d310bb78455d 25 menu_.Activate(0);
MikamiUitOpen 5:7c8f0fc9dfb6 26 if (resetButton) reset_ = new ResetButton();
MikamiUitOpen 5:7c8f0fc9dfb6 27 else reset_ = NULL;
MikamiUitOpen 0:d310bb78455d 28 }
MikamiUitOpen 0:d310bb78455d 29
MikamiUitOpen 0:d310bb78455d 30 void SD_PlayerSkeleton::Execute()
MikamiUitOpen 0:d310bb78455d 31 {
MikamiUitOpen 5:7c8f0fc9dfb6 32 bool playAfterPause = false;
MikamiUitOpen 5:7c8f0fc9dfb6 33 int32_t loopCount;
MikamiUitOpen 5:7c8f0fc9dfb6 34
MikamiUitOpen 5:7c8f0fc9dfb6 35 while (!menu_.Touched(0)) // OPEN がタッチされるまで待つ
MikamiUitOpen 5:7c8f0fc9dfb6 36 CheckCtrl();
MikamiUitOpen 5:7c8f0fc9dfb6 37 SelectFile();
MikamiUitOpen 0:d310bb78455d 38 bool whileFirst = true;
MikamiUitOpen 0:d310bb78455d 39
MikamiUitOpen 0:d310bb78455d 40 while (true)
MikamiUitOpen 0:d310bb78455d 41 {
MikamiUitOpen 5:7c8f0fc9dfb6 42 if (!playAfterPause) // PAUSE 後の PLAY ではない場合
MikamiUitOpen 0:d310bb78455d 43 {
MikamiUitOpen 5:7c8f0fc9dfb6 44 if (!whileFirst) // while ループで初回の処理ではない場合
MikamiUitOpen 0:d310bb78455d 45 {
MikamiUitOpen 5:7c8f0fc9dfb6 46 menu_.Activate(1); // PLAY ボタン有効
MikamiUitOpen 0:d310bb78455d 47 int touch10;
MikamiUitOpen 0:d310bb78455d 48 while (!menu_.GetTouchedNumber(touch10))
MikamiUitOpen 1:c7968701f7b3 49 CheckCtrl();
MikamiUitOpen 0:d310bb78455d 50 if (touch10 == 0) SelectFile();
MikamiUitOpen 0:d310bb78455d 51 }
MikamiUitOpen 0:d310bb78455d 52
MikamiUitOpen 5:7c8f0fc9dfb6 53 whileFirst = false;
MikamiUitOpen 0:d310bb78455d 54 loopCount = SD_Open();
MikamiUitOpen 5:7c8f0fc9dfb6 55 while (!menu_.Touched(1)) // PLAY がタッチされるまで待つ
MikamiUitOpen 1:c7968701f7b3 56 CheckCtrl();
MikamiUitOpen 0:d310bb78455d 57 }
MikamiUitOpen 5:7c8f0fc9dfb6 58 else // PAUSE 後の PLAY の場合
MikamiUitOpen 0:d310bb78455d 59 loopCount = SD_Open();
MikamiUitOpen 0:d310bb78455d 60
MikamiUitOpen 0:d310bb78455d 61 selector_.Erase(0, 0, BG_LEFT_-4, 272);
MikamiUitOpen 0:d310bb78455d 62 title_.Draw();
MikamiUitOpen 0:d310bb78455d 63
MikamiUitOpen 5:7c8f0fc9dfb6 64 Display(); // アプリ固有の表示処理(仮想関数)
MikamiUitOpen 5:7c8f0fc9dfb6 65 if (reset_ != NULL) reset_->Draw();
MikamiUitOpen 0:d310bb78455d 66
MikamiUitOpen 5:7c8f0fc9dfb6 67 menu_.Inactivate(0); // OPEN ボタン無効
MikamiUitOpen 5:7c8f0fc9dfb6 68 menu_.Activate(2); // PAUSE ボタン有効
MikamiUitOpen 5:7c8f0fc9dfb6 69 menu_.Activate(4); // STOP ボタン有効
MikamiUitOpen 0:d310bb78455d 70
MikamiUitOpen 5:7c8f0fc9dfb6 71 playAfterPause = false;
MikamiUitOpen 0:d310bb78455d 72 bool stopOk = false;
MikamiUitOpen 0:d310bb78455d 73
MikamiUitOpen 5:7c8f0fc9dfb6 74 Clear(); // アプリ固有のクリア処理(仮想関数)
MikamiUitOpen 0:d310bb78455d 75
MikamiUitOpen 0:d310bb78455d 76 mySai_.PlayOut(); // Play 開始
MikamiUitOpen 0:d310bb78455d 77
MikamiUitOpen 0:d310bb78455d 78 for (int k=0; k<loopCount; k++)
MikamiUitOpen 0:d310bb78455d 79 {
MikamiUitOpen 0:d310bb78455d 80 int touch42 = -1;
MikamiUitOpen 0:d310bb78455d 81 menu_.GetTouchedNumber(touch42);
MikamiUitOpen 0:d310bb78455d 82 if (touch42 == 4) break; // STOP
MikamiUitOpen 5:7c8f0fc9dfb6 83 if (touch42 == 2) // PAUSE ボタンがタッチされた場合の処理
MikamiUitOpen 0:d310bb78455d 84 {
MikamiUitOpen 5:7c8f0fc9dfb6 85 menu_.Inactivate(2); // PAUSE ボタン無効
MikamiUitOpen 5:7c8f0fc9dfb6 86 menu_.Activate(3); // RESUME ボタン有効
MikamiUitOpen 0:d310bb78455d 87 mySai_.PauseOut();
MikamiUitOpen 0:d310bb78455d 88
MikamiUitOpen 0:d310bb78455d 89 // PLAY か RESUME か STOP がタッチされるまで待つ
MikamiUitOpen 0:d310bb78455d 90 int touch134 = -1;
MikamiUitOpen 0:d310bb78455d 91 while (!menu_.GetTouchedNumber(touch134))
MikamiUitOpen 1:c7968701f7b3 92 CheckCtrl();
MikamiUitOpen 0:d310bb78455d 93 switch (touch134)
MikamiUitOpen 0:d310bb78455d 94 {
MikamiUitOpen 5:7c8f0fc9dfb6 95 case 1: playAfterPause = true; // 最初から PLAY
MikamiUitOpen 0:d310bb78455d 96 break;
MikamiUitOpen 5:7c8f0fc9dfb6 97 case 3: mySai_.ResumeOut(); // PAUSE したところから
MikamiUitOpen 5:7c8f0fc9dfb6 98 menu_.Activate(2); // PLAY 再開
MikamiUitOpen 0:d310bb78455d 99 menu_.Inactivate(3);
MikamiUitOpen 0:d310bb78455d 100 menu_.TouchedColor(1);
MikamiUitOpen 0:d310bb78455d 101 break;
MikamiUitOpen 5:7c8f0fc9dfb6 102 case 4: stopOk = true; // STOP
MikamiUitOpen 0:d310bb78455d 103 break;
MikamiUitOpen 0:d310bb78455d 104 }
MikamiUitOpen 0:d310bb78455d 105 }
MikamiUitOpen 5:7c8f0fc9dfb6 106 if (playAfterPause || stopOk) break;
MikamiUitOpen 0:d310bb78455d 107
MikamiUitOpen 1:c7968701f7b3 108 CheckCtrl();
MikamiUitOpen 5:7c8f0fc9dfb6 109 // アプリ固有の1フレーム分の信号処理(純粋仮想関数)
MikamiUitOpen 0:d310bb78455d 110 SignalProcessing();
MikamiUitOpen 0:d310bb78455d 111 }
MikamiUitOpen 0:d310bb78455d 112 mySai_.StopOut();
MikamiUitOpen 5:7c8f0fc9dfb6 113 menu_.Activate(0); // OPEN ボタン有効
MikamiUitOpen 5:7c8f0fc9dfb6 114 if (!playAfterPause)
MikamiUitOpen 5:7c8f0fc9dfb6 115 menu_.Activate(1); // PLAY ボタン有効
MikamiUitOpen 5:7c8f0fc9dfb6 116 for (int n=2; n<5; n++) // その他のボタンは無効
MikamiUitOpen 0:d310bb78455d 117 menu_.Inactivate(n);
MikamiUitOpen 5:7c8f0fc9dfb6 118
MikamiUitOpen 0:d310bb78455d 119 sdReader_.Close(); // SD のファイルのクローズ
MikamiUitOpen 0:d310bb78455d 120 }
MikamiUitOpen 0:d310bb78455d 121 }
MikamiUitOpen 0:d310bb78455d 122
MikamiUitOpen 4:d730d024ac32 123 // 拡張子を除いたファイル名を取得
MikamiUitOpen 4:d730d024ac32 124 string SD_PlayerSkeleton::GetFileNameNoExt()
MikamiUitOpen 4:d730d024ac32 125 {
MikamiUitOpen 4:d730d024ac32 126 string fName = fileName_;
MikamiUitOpen 4:d730d024ac32 127 int k = fName.rfind(".");
MikamiUitOpen 4:d730d024ac32 128 if (k != string::npos)
MikamiUitOpen 4:d730d024ac32 129 return fName.erase(k);
MikamiUitOpen 4:d730d024ac32 130 else
MikamiUitOpen 4:d730d024ac32 131 return fName;
MikamiUitOpen 4:d730d024ac32 132 }
MikamiUitOpen 4:d730d024ac32 133
MikamiUitOpen 0:d310bb78455d 134 // SD カードのファイルのオープン
MikamiUitOpen 0:d310bb78455d 135 int32_t SD_PlayerSkeleton::SD_Open()
MikamiUitOpen 0:d310bb78455d 136 {
MikamiUitOpen 0:d310bb78455d 137 sdReader_.Open(fileName_);
MikamiUitOpen 0:d310bb78455d 138 sdReader_.IsWavFile();
MikamiUitOpen 0:d310bb78455d 139 return sdReader_.GetSize()/FRAME_SIZE_;
MikamiUitOpen 0:d310bb78455d 140 }
MikamiUitOpen 0:d310bb78455d 141
MikamiUitOpen 0:d310bb78455d 142 // ファイルの選択
MikamiUitOpen 0:d310bb78455d 143 // selectedName: 選択されたファイル名
MikamiUitOpen 0:d310bb78455d 144 void SD_PlayerSkeleton::SelectFile()
MikamiUitOpen 0:d310bb78455d 145 {
MikamiUitOpen 5:7c8f0fc9dfb6 146 selector_.DisplayFileList();
MikamiUitOpen 0:d310bb78455d 147 title_.Draw("Select file");
MikamiUitOpen 5:7c8f0fc9dfb6 148 menu_.Inactivate(1); // PLAY ボタン無効
MikamiUitOpen 0:d310bb78455d 149 do
MikamiUitOpen 0:d310bb78455d 150 if (selector_.Select(fileName_))
MikamiUitOpen 5:7c8f0fc9dfb6 151 menu_.Activate(1); // PLAY ボタン有効
MikamiUitOpen 5:7c8f0fc9dfb6 152 while (!menu_.Touched(1)); // PLAY ボタンがタッチされるまで繰り返す
MikamiUitOpen 0:d310bb78455d 153 }
MikamiUitOpen 1:c7968701f7b3 154
MikamiUitOpen 1:c7968701f7b3 155 // パネル操作のチェック
MikamiUitOpen 1:c7968701f7b3 156 void SD_PlayerSkeleton::CheckCtrl()
MikamiUitOpen 1:c7968701f7b3 157 {
MikamiUitOpen 5:7c8f0fc9dfb6 158 if (reset_ != NULL) reset_->Do();
MikamiUitOpen 5:7c8f0fc9dfb6 159 Modefy(); // アプリ固有のパラメータ変更(仮想関数)
MikamiUitOpen 1:c7968701f7b3 160 }
MikamiUitOpen 0:d310bb78455d 161 }