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@18:6631cd0fbbcd, 2019-06-04 (annotated)
- Committer:
- phungductung
- Date:
- Tue Jun 04 21:35:59 2019 +0000
- Revision:
- 18:6631cd0fbbcd
- Parent:
- 17:abfd6af9a236
WAV
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| phungductung | 18:6631cd0fbbcd | 1 | |
| MikamiUitOpen | 0:d310bb78455d | 2 | //-------------------------------------------------------------- |
| MikamiUitOpen | 0:d310bb78455d | 3 | |
| MikamiUitOpen | 0:d310bb78455d | 4 | #include "SD_PlayerSkeleton.hpp" |
| MikamiUitOpen | 0:d310bb78455d | 5 | |
| MikamiUitOpen | 0:d310bb78455d | 6 | namespace Mikami |
| MikamiUitOpen | 0:d310bb78455d | 7 | { |
| MikamiUitOpen | 16:299cc1052baa | 8 | SD_PlayerSkeleton::SD_PlayerSkeleton(string str, bool resetButton) |
| MikamiUitOpen | 16:299cc1052baa | 9 | : BUFF_SIZE_(2048), sn_(BUFF_SIZE_), |
| MikamiUitOpen | 16:299cc1052baa | 10 | mySai_(SaiIO::OUTPUT, BUFF_SIZE_, AUDIO_FREQUENCY_44K), |
| MikamiUitOpen | 16:299cc1052baa | 11 | sdReader_(BUFF_SIZE_), |
| MikamiUitOpen | 8:59d3f9c81c4f | 12 | fileName_(""), |
| MikamiUitOpen | 0:d310bb78455d | 13 | title_(214, 4, str, Label::CENTER, Font16), |
| MikamiUitOpen | 2:511479736d6e | 14 | selector_(0, 22, 256, 37, sdReader_), |
| MikamiUitOpen | 0:d310bb78455d | 15 | menu_(BG_LEFT_, 2, BG_WIDTH_, BG_HEIGHT_, 5, |
| MikamiUitOpen | 14:284093250bab | 16 | (string[]){"SELECT", "PLAY", "PAUSE", "RESUME", "STOP"}, |
| MikamiUitOpen | 5:7c8f0fc9dfb6 | 17 | 0, 2, 1) |
| MikamiUitOpen | 0:d310bb78455d | 18 | { |
| MikamiUitOpen | 14:284093250bab | 19 | menu_.InactivateAll(); |
| MikamiUitOpen | 14:284093250bab | 20 | menu_.Activate(0); |
| MikamiUitOpen | 14:284093250bab | 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 | 5:7c8f0fc9dfb6 | 25 | if (resetButton) reset_ = new ResetButton(); |
| MikamiUitOpen | 5:7c8f0fc9dfb6 | 26 | else reset_ = NULL; |
| MikamiUitOpen | 0:d310bb78455d | 27 | } |
| MikamiUitOpen | 0:d310bb78455d | 28 | |
| phungductung | 18:6631cd0fbbcd | 29 | // thực thi xử lý trình phát SD |
| MikamiUitOpen | 0:d310bb78455d | 30 | void SD_PlayerSkeleton::Execute() |
| MikamiUitOpen | 0:d310bb78455d | 31 | { |
| MikamiUitOpen | 13:3df6a1f66b1c | 32 | bool playOk = false; |
| MikamiUitOpen | 5:7c8f0fc9dfb6 | 33 | int32_t loopCount; |
| MikamiUitOpen | 5:7c8f0fc9dfb6 | 34 | |
| MikamiUitOpen | 0:d310bb78455d | 35 | while (true) |
| MikamiUitOpen | 0:d310bb78455d | 36 | { |
| phungductung | 18:6631cd0fbbcd | 37 | if (playOk) // Trong trường hợp PLAY sau PAUSE |
| MikamiUitOpen | 8:59d3f9c81c4f | 38 | loopCount = SD_Open(); |
| phungductung | 18:6631cd0fbbcd | 39 | else // Nếu không PLAY sau PAUSE |
| MikamiUitOpen | 0:d310bb78455d | 40 | { |
| MikamiUitOpen | 15:4ac0f4715454 | 41 | if (0 == WaitTouched()) SelectFile(); |
| MikamiUitOpen | 0:d310bb78455d | 42 | loopCount = SD_Open(); |
| phungductung | 18:6631cd0fbbcd | 43 | while (1 != WaitTouched()) {} // Đợi cho đến khi PLAY được chạm |
| MikamiUitOpen | 0:d310bb78455d | 44 | } |
| MikamiUitOpen | 0:d310bb78455d | 45 | |
| phungductung | 18:6631cd0fbbcd | 46 | Display(); // Xử lý hiển thị dành riêng cho ứng dụng (chức năng ảo) |
| MikamiUitOpen | 5:7c8f0fc9dfb6 | 47 | if (reset_ != NULL) reset_->Draw(); |
| MikamiUitOpen | 0:d310bb78455d | 48 | |
| phungductung | 18:6631cd0fbbcd | 49 | menu_.Inactivate(0); // SELECT bị vô hiệu hóa |
| phungductung | 18:6631cd0fbbcd | 50 | menu_.Activate(2); // PAUSE bị vô hiệu hóa |
| phungductung | 18:6631cd0fbbcd | 51 | menu_.Activate(4); // STOP bị vô hiệu hóa |
| MikamiUitOpen | 0:d310bb78455d | 52 | |
| MikamiUitOpen | 13:3df6a1f66b1c | 53 | playOk = false; |
| MikamiUitOpen | 0:d310bb78455d | 54 | bool stopOk = false; |
| MikamiUitOpen | 0:d310bb78455d | 55 | |
| phungductung | 18:6631cd0fbbcd | 56 | Clear(); // Quá trình xóa ứng dụng cụ thể (chức năng ảo) |
| MikamiUitOpen | 0:d310bb78455d | 57 | |
| phungductung | 18:6631cd0fbbcd | 58 | mySai_.PlayOut(); // Play |
| MikamiUitOpen | 0:d310bb78455d | 59 | |
| phungductung | 18:6631cd0fbbcd | 60 | // Lặp lại cho đến khi hết dữ liệu tệp |
| MikamiUitOpen | 0:d310bb78455d | 61 | for (int k=0; k<loopCount; k++) |
| MikamiUitOpen | 0:d310bb78455d | 62 | { |
| MikamiUitOpen | 0:d310bb78455d | 63 | int touch42 = -1; |
| MikamiUitOpen | 0:d310bb78455d | 64 | menu_.GetTouchedNumber(touch42); |
| MikamiUitOpen | 0:d310bb78455d | 65 | if (touch42 == 4) break; // STOP |
| phungductung | 18:6631cd0fbbcd | 66 | if (touch42 == 2) // PAUSE Xử lý khi chạm vào nút |
| MikamiUitOpen | 0:d310bb78455d | 67 | { |
| phungductung | 18:6631cd0fbbcd | 68 | menu_.Inactivate(2); // PAUSE Nút không hợp lệ |
| phungductung | 18:6631cd0fbbcd | 69 | menu_.Activate(3); // RESUME Đã bật nút |
| MikamiUitOpen | 0:d310bb78455d | 70 | mySai_.PauseOut(); |
| MikamiUitOpen | 0:d310bb78455d | 71 | |
| phungductung | 18:6631cd0fbbcd | 72 | // PLAY Đợi cho đến khi 'RESUME' hoặc 'STOP' được chạm vào |
| MikamiUitOpen | 6:6fe2b62f259d | 73 | switch (WaitTouched()) |
| MikamiUitOpen | 0:d310bb78455d | 74 | { |
| phungductung | 18:6631cd0fbbcd | 75 | case 1: playOk = true; // PLAY từ đầu |
| MikamiUitOpen | 0:d310bb78455d | 76 | break; |
| phungductung | 18:6631cd0fbbcd | 77 | case 3: mySai_.ResumeOut(); // Tiếp tục PLAY từ điểm PAUSE |
| MikamiUitOpen | 8:59d3f9c81c4f | 78 | menu_.Activate(2); |
| MikamiUitOpen | 0:d310bb78455d | 79 | menu_.Inactivate(3); |
| MikamiUitOpen | 0:d310bb78455d | 80 | menu_.TouchedColor(1); |
| MikamiUitOpen | 0:d310bb78455d | 81 | break; |
| MikamiUitOpen | 13:3df6a1f66b1c | 82 | case 4: stopOk = true; // STOP |
| MikamiUitOpen | 0:d310bb78455d | 83 | break; |
| MikamiUitOpen | 0:d310bb78455d | 84 | } |
| MikamiUitOpen | 0:d310bb78455d | 85 | } |
| MikamiUitOpen | 13:3df6a1f66b1c | 86 | if (playOk || stopOk) break; |
| MikamiUitOpen | 0:d310bb78455d | 87 | |
| MikamiUitOpen | 6:6fe2b62f259d | 88 | DoIfHandled(); |
| phungductung | 18:6631cd0fbbcd | 89 | // Xử lý tín hiệu cho một khối dành riêng cho ứng dụng (hàm ảo thuần túy) |
| MikamiUitOpen | 0:d310bb78455d | 90 | SignalProcessing(); |
| MikamiUitOpen | 0:d310bb78455d | 91 | } |
| MikamiUitOpen | 0:d310bb78455d | 92 | mySai_.StopOut(); |
| phungductung | 18:6631cd0fbbcd | 93 | if (!playOk) menu_.Activate(0); // SELECT hợp lệ |
| phungductung | 18:6631cd0fbbcd | 94 | menu_.Draw(1); // Khởi tạo màu của nút PLAY |
| phungductung | 18:6631cd0fbbcd | 95 | for (int n=2; n<5; n++) // Các nút khác bị vô hiệu hóa |
| MikamiUitOpen | 0:d310bb78455d | 96 | menu_.Inactivate(n); |
| MikamiUitOpen | 5:7c8f0fc9dfb6 | 97 | |
| phungductung | 18:6631cd0fbbcd | 98 | sdReader_.Close(); // Đóng tệp SD |
| MikamiUitOpen | 0:d310bb78455d | 99 | } |
| MikamiUitOpen | 0:d310bb78455d | 100 | } |
| MikamiUitOpen | 0:d310bb78455d | 101 | |
| phungductung | 18:6631cd0fbbcd | 102 | // Lấy tên tệp đã chọn mà không cần phần mở rộng |
| MikamiUitOpen | 4:d730d024ac32 | 103 | string SD_PlayerSkeleton::GetFileNameNoExt() |
| MikamiUitOpen | 4:d730d024ac32 | 104 | { |
| MikamiUitOpen | 4:d730d024ac32 | 105 | string fName = fileName_; |
| MikamiUitOpen | 4:d730d024ac32 | 106 | int k = fName.rfind("."); |
| MikamiUitOpen | 4:d730d024ac32 | 107 | if (k != string::npos) |
| MikamiUitOpen | 4:d730d024ac32 | 108 | return fName.erase(k); |
| MikamiUitOpen | 4:d730d024ac32 | 109 | else |
| MikamiUitOpen | 4:d730d024ac32 | 110 | return fName; |
| MikamiUitOpen | 4:d730d024ac32 | 111 | } |
| MikamiUitOpen | 4:d730d024ac32 | 112 | |
| phungductung | 18:6631cd0fbbcd | 113 | // Mở tệp thẻ SD |
| MikamiUitOpen | 0:d310bb78455d | 114 | int32_t SD_PlayerSkeleton::SD_Open() |
| MikamiUitOpen | 0:d310bb78455d | 115 | { |
| MikamiUitOpen | 8:59d3f9c81c4f | 116 | if (fileName_.empty()) SelectFile(); |
| MikamiUitOpen | 0:d310bb78455d | 117 | sdReader_.Open(fileName_); |
| MikamiUitOpen | 0:d310bb78455d | 118 | sdReader_.IsWavFile(); |
| MikamiUitOpen | 16:299cc1052baa | 119 | return sdReader_.GetSize()/BUFF_SIZE_; |
| MikamiUitOpen | 0:d310bb78455d | 120 | } |
| MikamiUitOpen | 0:d310bb78455d | 121 | |
| phungductung | 18:6631cd0fbbcd | 122 | // Lựa chọn tập tin |
| MikamiUitOpen | 0:d310bb78455d | 123 | void SD_PlayerSkeleton::SelectFile() |
| MikamiUitOpen | 0:d310bb78455d | 124 | { |
| MikamiUitOpen | 5:7c8f0fc9dfb6 | 125 | selector_.DisplayFileList(); |
| MikamiUitOpen | 0:d310bb78455d | 126 | title_.Draw("Select file"); |
| phungductung | 18:6631cd0fbbcd | 127 | menu_.Inactivate(0); // SELECT vô hiệu hóa |
| phungductung | 18:6631cd0fbbcd | 128 | menu_.Inactivate(1); // PLAY vô hiệu hóa |
| MikamiUitOpen | 0:d310bb78455d | 129 | do |
| MikamiUitOpen | 0:d310bb78455d | 130 | if (selector_.Select(fileName_)) |
| phungductung | 18:6631cd0fbbcd | 131 | menu_.Activate(1); // PLAY đã bật |
| phungductung | 18:6631cd0fbbcd | 132 | while (!menu_.Touched(1)); // PLAY Lặp lại cho đến khi nút được chạm |
| MikamiUitOpen | 13:3df6a1f66b1c | 133 | |
| MikamiUitOpen | 13:3df6a1f66b1c | 134 | selector_.Erase(0, 0, BG_LEFT_-4, 272); |
| MikamiUitOpen | 13:3df6a1f66b1c | 135 | title_.Draw(); |
| MikamiUitOpen | 0:d310bb78455d | 136 | } |
| MikamiUitOpen | 1:c7968701f7b3 | 137 | |
| phungductung | 18:6631cd0fbbcd | 138 | // Xử lý khi bảng điều khiển được vận hành |
| MikamiUitOpen | 6:6fe2b62f259d | 139 | void SD_PlayerSkeleton::DoIfHandled() |
| MikamiUitOpen | 1:c7968701f7b3 | 140 | { |
| MikamiUitOpen | 9:1ba92e340dce | 141 | if (reset_ != NULL) reset_->DoIfTouched(); |
| phungductung | 18:6631cd0fbbcd | 142 | Modefy(); // Ứng dụng thay đổi tham số cụ thể (chức năng ảo) |
| MikamiUitOpen | 1:c7968701f7b3 | 143 | } |
| MikamiUitOpen | 6:6fe2b62f259d | 144 | |
| phungductung | 18:6631cd0fbbcd | 145 | //Đợi trong khi thực hiện Do IfHandled () cho đến khi bất kỳ nút nào trên menu được chạm vào |
| MikamiUitOpen | 6:6fe2b62f259d | 146 | int SD_PlayerSkeleton::WaitTouched() |
| MikamiUitOpen | 6:6fe2b62f259d | 147 | { |
| MikamiUitOpen | 6:6fe2b62f259d | 148 | int touchNum; |
| MikamiUitOpen | 6:6fe2b62f259d | 149 | while (!menu_.GetTouchedNumber(touchNum)) DoIfHandled(); |
| MikamiUitOpen | 6:6fe2b62f259d | 150 | return touchNum; |
| MikamiUitOpen | 6:6fe2b62f259d | 151 | } |
| MikamiUitOpen | 0:d310bb78455d | 152 | } |