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:
Fri Mar 17 16:47:54 2017 +0000
Revision:
13:3df6a1f66b1c
Parent:
10:303d6435a09b
Child:
14:284093250bab
14

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