Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: SDFileSystem_Warning_Fixed
SD_PlayerSkeleton.cpp
- Committer:
- MikamiUitOpen
- Date:
- 2016-11-16
- Revision:
- 8:59d3f9c81c4f
- Parent:
- 7:930d50953ec2
- Child:
- 9:1ba92e340dce
File content as of revision 8:59d3f9c81c4f:
//--------------------------------------------------------------
// SD プレーヤー用抽象基底クラス
//
// 2016/11/16, 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_),
fileName_(""),
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 がタッチされるまで待つ
while (true)
{
if (playAfterPause) // PAUSE 後の PLAY の場合
loopCount = SD_Open();
else // PAUSE 後の PLAY ではない場合
{
if (WaitTouched() == 0) SelectFile();
loopCount = SD_Open();
WaitTouched(1); // PLAY がタッチされるまで待つ
}
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 箇所から PLAY 再開
menu_.Activate(2);
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 ボタン有効
menu_.Draw(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()
{
if (fileName_.empty()) SelectFile();
sdReader_.Open(fileName_);
sdReader_.IsWavFile();
return sdReader_.GetSize()/FRAME_SIZE_;
}
// ファイルの選択
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;
}
}