revised version of F746_SD_GraphicEqualizer
Dependencies: BSP_DISCO_F746NG F746_GUI F746_SAI_IO FrequencyResponseDrawer LCD_DISCO_F746NG SDFileSystem_Warning_Fixed TS_DISCO_F746NG mbed
Fork of F746_SD_GraphicEqualizer by
Diff: main.cpp
- Revision:
- 10:fc6367c2ffcf
- Parent:
- 9:0d5bd1539291
- Child:
- 12:87f6955b5a80
diff -r 0d5bd1539291 -r fc6367c2ffcf main.cpp --- a/main.cpp Mon May 09 13:48:33 2016 +0000 +++ b/main.cpp Wed Jun 22 03:50:38 2016 +0000 @@ -12,6 +12,9 @@ #include "BlinkLabel.hpp" using namespace Mikami; +enum ts_State { + IDLE_NOPALY, SELECTED_PREPARE_PALY, PALYING, PAUSED, STOPPED, RESUMED +}; int main() { @@ -23,6 +26,8 @@ SD_WavReader sdReader(mySai.GetLength()); // SD カード読み込み用オブジェクト const int MAX_FILES = 7; + string PlayList[MAX_FILES]; + int list_id = 0; FileSelector selector(4, 26, MAX_FILES, 37, sdReader); if (!selector.CreateTable()) BlinkLabel errLabel(240, 100, "SD CARD ERROR", Label::CENTER); @@ -39,8 +44,8 @@ // OPEN のみアクティブ menu.Activate(0); for (int n=1; n<5; n++) menu.Inactivate(n); - - Button flat(BG_LEFT, 197, BG_WIDTH, BG_HEIGHT, "FLAT"); +// printf("Button flat with 0 expanded detection Area\n"); + Button flat(BG_LEFT, 197, BG_WIDTH, BG_HEIGHT, 0, "FLAT"); const string ON_OFF[2] = {"ON", "OFF"}; ButtonGroup onOff(BG_LEFT, 235, BG_WIDTH/2, BG_HEIGHT, @@ -49,12 +54,12 @@ // フィルタの設計と周波数特性描画用 const int STAGES = 9; // バンド数 DesignerDrawer drawerObj( - 28, // グラフの左端の位置 - 130, // グラフの下端の位置 - STAGES, // バンド数 - 62.5f, // 最低域バンドの中心周波数 - FS, // 標本化周波数 - 2.5f); // 1 dB 当たりのピクセル数 + 28, // グラフの左端の位置 + 130, // グラフの下端の位置 + STAGES, // バンド数 + 62.5f, // 最低域バンドの中心周波数 + FS, // 標本化周波数 + 2.5f); // 1 dB 当たりのピクセル数 // 周波数特性変更用スライダ SeekbarGroup myBars(drawerObj.GetX0(), 178, 82, STAGES, @@ -69,94 +74,103 @@ int32_t frameSize = mySai.GetLength(); int16_t *sn = new int16_t[frameSize+1]; // フレームバッファ - bool playOk = false; bool on = true; - bool whileFirst = true; string fileName; int32_t loopCount; - - while (true) - { - if (!playOk) - { - if (whileFirst) - { - whileFirst = false; + ts_State ui_mode = IDLE_NOPALY; + int k; + while (true) { + switch(ui_mode) { + case IDLE_NOPALY: while (!menu.Touched(0)) // OPEN がタッチされるまで待つ ModifyFilter(drawerObj, myBars, hn, flat, onOff, on); - SelectFile(menu, selector, myLabel1, fileName); + for(int m=0; m<MAX_FILES; m++) PlayList[m]=""; // clear playlist + SelectFile(menu, selector, myLabel1, PlayList, &list_id); // returned playlist and selected ID + ui_mode = SELECTED_PREPARE_PALY ; + case SELECTED_PREPARE_PALY: + printf(" current track is %s ******\n", PlayList[list_id].c_str()); + loopCount = SD_Open(sdReader, PlayList[list_id], frameSize); + // while (!menu.Touched(1)) // PLAY がタッチされるまで待つ + // ModifyFilter(drawerObj, myBars, hn, flat, onOff, on); + selector.Erase(0, 0, BG_LEFT-4, 288); + myLabel1.Draw("9-band Graphic Equalizer"); + myBars.RedrawAll(); + drawerObj.DrawResponse(); + menu.Inactivate(0); // OPEN 無効 + menu.Activate(2); // PAUSE 有効 + menu.Activate(4); // STOP 有効 + // IIR フィルタの内部の遅延器のクリア + for (int j=0; j<STAGES; j++) hn[j].Clear(); + mySai.PlayOut(); // Play 開始 + ui_mode = PALYING ; + k=0; + case PALYING: + for (; k<loopCount && ui_mode==PALYING; k++) { + int touch42 = -1; + menu.GetTouchedNumber(touch42); + if (touch42 == 4) ui_mode = STOPPED; // STOP + else if (touch42 == 2) ui_mode = PAUSED; // PAUSE + ModifyFilter(drawerObj, myBars, hn, flat, onOff, on); + // 1フレーム分の信号処理 (イコライザ) の実行 + SignalProcessing(sdReader, mySai, sn, hn, STAGES, on); + } + if(ui_mode == PAUSED) break; // Paused + mySai.StopOut(); // current track play ended + sdReader.Close(); // SD のファイルのクローズ + if(ui_mode == STOPPED) break; // Stopped + + if (list_id < MAX_FILES-1) { // goto next track + if (PlayList[list_id+1].empty()) list_id=0; + else list_id++; + } else list_id=0; + ui_mode = SELECTED_PREPARE_PALY; + break; + case PAUSED: { + menu.Inactivate(2); // PAUSE 無効 + menu.Activate(3); // RESUME 有効 + mySai.PauseOut(); + // PLAY か RESUME か STOP がタッチされるまで待つ + int touch134 = -1; + while (!menu.GetTouchedNumber(touch134)) + ModifyFilter(drawerObj, myBars, hn, flat, onOff, on); + if(touch134 == 3) { + ui_mode = RESUMED; + break; // PAUSE したところから PLAY 再開 + } + mySai.ResumeOut(); // PAUSE したところから PLAY 再開 またはSTOPの後処理 + mySai.StopOut(); + sdReader.Close(); // SD のファイルのクローズ + + if(touch134 == 4) { + ui_mode = STOPPED; break; // STOP + } + if(touch134 == 1) { + ui_mode = SELECTED_PREPARE_PALY; // 最初から PLAY + menu.Inactivate(3); // RESUME disable to start play + break; + } + printf("a very bad wrong point\n"); + break; } - else - { - menu.Activate(1); // PLAY 有効 + case STOPPED: + menu.Activate(0); // OPEN 有効 + menu.Activate(1); // PLAY 有効 + for (int n=2; n<5; n++) // その他は無効 + menu.Inactivate(n); int touch10; while (!menu.GetTouchedNumber(touch10)) ModifyFilter(drawerObj, myBars, hn, flat, onOff, on); if (touch10 == 0) - SelectFile(menu, selector, myLabel1, fileName); - } - - loopCount = SD_Open(sdReader, fileName, frameSize); - while (!menu.Touched(1)) // PLAY がタッチされるまで待つ - ModifyFilter(drawerObj, myBars, hn, flat, onOff, on); + SelectFile(menu, selector, myLabel1, PlayList, &list_id); + ui_mode = SELECTED_PREPARE_PALY; + break; + case RESUMED: + mySai.ResumeOut(); // PAUSE したところから PLAY 再開 + menu.Activate(2); + menu.Inactivate(3); + menu.TouchedColor(1); + ui_mode = PALYING; + break; } - else - loopCount = SD_Open(sdReader, fileName, frameSize); - - selector.Erase(0, 0, BG_LEFT-4, 288); - myLabel1.Draw("9-band Graphic Equalizer"); - myBars.RedrawAll(); - drawerObj.DrawResponse(); - menu.Inactivate(0); // OPEN 無効 - menu.Activate(2); // PAUSE 有効 - menu.Activate(4); // STOP 有効 - - playOk = false; - bool stopOk = false; - - // IIR フィルタの内部の遅延器のクリア - for (int k=0; k<STAGES; k++) hn[k].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)) - ModifyFilter(drawerObj, myBars, hn, flat, onOff, on); - 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; - - ModifyFilter(drawerObj, myBars, hn, flat, onOff, on); - // 1フレーム分の信号処理 (イコライザ) の実行 - SignalProcessing(sdReader, mySai, sn, hn, STAGES, on); - } - 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 のファイルのクローズ } }