Nam
Dependencies: SRC_STM32F7 F746-GUI SD_PlayerSkeleton F746-SAI-IO
main.cpp@0:415638154129, 2019-06-10 (annotated)
- Committer:
- nhancap98
- Date:
- Mon Jun 10 11:19:36 2019 +0000
- Revision:
- 0:415638154129
SPKT
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
nhancap98 | 0:415638154129 | 1 | |
nhancap98 | 0:415638154129 | 2 | //-------------------------------------------------------------------- |
nhancap98 | 0:415638154129 | 3 | #include "VolumeCtrl.hpp" |
nhancap98 | 0:415638154129 | 4 | #include "FileSelectorWav.hpp" |
nhancap98 | 0:415638154129 | 5 | #include "SD_PlayerSkeleton.hpp" |
nhancap98 | 0:415638154129 | 6 | #include "SD_WavReader.hpp" |
nhancap98 | 0:415638154129 | 7 | |
nhancap98 | 0:415638154129 | 8 | using namespace Mikami; |
nhancap98 | 0:415638154129 | 9 | |
nhancap98 | 0:415638154129 | 10 | int main() |
nhancap98 | 0:415638154129 | 11 | { |
nhancap98 | 0:415638154129 | 12 | VolumeCtrl myPlayer("Music Player"); |
nhancap98 | 0:415638154129 | 13 | myPlayer.Execute(); |
nhancap98 | 0:415638154129 | 14 | |
nhancap98 | 0:415638154129 | 15 | } |
nhancap98 | 0:415638154129 | 16 | //------------------------------------------------- |
nhancap98 | 0:415638154129 | 17 | //Chuong trình con di?u ch?nh biên d? âm thanh |
nhancap98 | 0:415638154129 | 18 | |
nhancap98 | 0:415638154129 | 19 | namespace Mikami |
nhancap98 | 0:415638154129 | 20 | { |
nhancap98 | 0:415638154129 | 21 | // Th?c thi x? lý tín hi?u cho m?t kh?i |
nhancap98 | 0:415638154129 | 22 | void VolumeCtrl::SignalProcessing() |
nhancap98 | 0:415638154129 | 23 | { |
nhancap98 | 0:415638154129 | 24 | // Ð?c giá tr? d? li?u âm thanh n?i c?a m?t kh?i t? SD và bi?n nó thành don âm |
nhancap98 | 0:415638154129 | 25 | sdReader_.ReadAndToMono(sn_); |
nhancap98 | 0:415638154129 | 26 | |
nhancap98 | 0:415638154129 | 27 | while (!mySai_.IsXferred()) {} // Ch? cho d?n khi truy?n d? li?u hoàn t?t |
nhancap98 | 0:415638154129 | 28 | |
nhancap98 | 0:415638154129 | 29 | for (int n=0; n<BUFF_SIZE_; n++) |
nhancap98 | 0:415638154129 | 30 | { |
nhancap98 | 0:415638154129 | 31 | int16_t data = volume_*sn_[n]; //Thay d?i âm lu?ng d?u ra |
nhancap98 | 0:415638154129 | 32 | mySai_.Output(data, data); |
nhancap98 | 0:415638154129 | 33 | } |
nhancap98 | 0:415638154129 | 34 | //-------------------------------------------------------------- |
nhancap98 | 0:415638154129 | 35 | } |
nhancap98 | 0:415638154129 | 36 | |
nhancap98 | 0:415638154129 | 37 | // Ði?u ch?nh âm lu?ng |
nhancap98 | 0:415638154129 | 38 | void VolumeCtrl::Modefy() |
nhancap98 | 0:415638154129 | 39 | { |
nhancap98 | 0:415638154129 | 40 | if (myBar_.Slide()) |
nhancap98 | 0:415638154129 | 41 | volume_ = myBar_.GetValue(); |
nhancap98 | 0:415638154129 | 42 | } |
nhancap98 | 0:415638154129 | 43 | // Hi?n th? khi phát m?t bài hát |
nhancap98 | 0:415638154129 | 44 | void VolumeCtrl::Display() |
nhancap98 | 0:415638154129 | 45 | { |
nhancap98 | 0:415638154129 | 46 | Label musicTitle(207, 80, GetFileNameNoExt(), Label::CENTER, Font16); |
nhancap98 | 0:415638154129 | 47 | ctrl_.Draw(); |
nhancap98 | 0:415638154129 | 48 | myBar_.Redraw(); |
nhancap98 | 0:415638154129 | 49 | } |
nhancap98 | 0:415638154129 | 50 | } |
nhancap98 | 0:415638154129 | 51 | //-------------------------------------------------------------- |
nhancap98 | 0:415638154129 | 52 | namespace Mikami |
nhancap98 | 0:415638154129 | 53 | { |
nhancap98 | 0:415638154129 | 54 | FileSelector::FileSelector(uint8_t x0, uint8_t y0, int maxFiles, |
nhancap98 | 0:415638154129 | 55 | int maxNameLength, SD_WavReader &reader) |
nhancap98 | 0:415638154129 | 56 | : X_(x0), Y_(y0), |
nhancap98 | 0:415638154129 | 57 | MAX_FILES_(maxFiles), MAX_NAME_LENGTH_(maxNameLength), |
nhancap98 | 0:415638154129 | 58 | fileNames_(maxFiles), fileNameLabels_(MAX_LIST_PAGE_), |
nhancap98 | 0:415638154129 | 59 | next_(50, 238, 64, 36, 2, (string[]){"<", ">"}, 10, 0, 2, -1, Font24), |
nhancap98 | 0:415638154129 | 60 | pageLabel_(210, 250, Label::LEFT, Font16), |
nhancap98 | 0:415638154129 | 61 | lcd_(GuiBase::GetLcd()), sdReader_(reader), page_(1), |
nhancap98 | 0:415638154129 | 62 | nOld_(-1), kOld_(-1) |
nhancap98 | 0:415638154129 | 63 | { |
nhancap98 | 0:415638154129 | 64 | Array<string> nonString(MAX_LIST_PAGE_, ""); |
nhancap98 | 0:415638154129 | 65 | rect_ = new ButtonGroup(X_, Y_, W_H_, W_H_, MAX_LIST_PAGE_, |
nhancap98 | 0:415638154129 | 66 | nonString, 0, V_L_-W_H_, 1, |
nhancap98 | 0:415638154129 | 67 | -1, Font12, 0, GuiBase::ENUM_BACK, |
nhancap98 | 0:415638154129 | 68 | BASE_COLOR_, TOUCHED_COLOR_); |
nhancap98 | 0:415638154129 | 69 | rect_->EraseAll(); |
nhancap98 | 0:415638154129 | 70 | next_.EraseAll(); |
nhancap98 | 0:415638154129 | 71 | |
nhancap98 | 0:415638154129 | 72 | // T?o Label |
nhancap98 | 0:415638154129 | 73 | for (int n=0; n<MAX_LIST_PAGE_; n++) |
nhancap98 | 0:415638154129 | 74 | fileNameLabels_[n] = new Label(X_+30, Y_+5+V_L_*n, "", |
nhancap98 | 0:415638154129 | 75 | Label::LEFT, Font16, BASE_COLOR_); |
nhancap98 | 0:415638154129 | 76 | } |
nhancap98 | 0:415638154129 | 77 | |
nhancap98 | 0:415638154129 | 78 | FileSelector::~FileSelector() |
nhancap98 | 0:415638154129 | 79 | { |
nhancap98 | 0:415638154129 | 80 | delete rect_; |
nhancap98 | 0:415638154129 | 81 | for (int n=0; n<MAX_LIST_PAGE_; n++) delete fileNameLabels_[n]; |
nhancap98 | 0:415638154129 | 82 | } |
nhancap98 | 0:415638154129 | 83 | |
nhancap98 | 0:415638154129 | 84 | // L?p danh sách các t?p tin. Tr? v? false n?u t?p WAV không t?n t?i |
nhancap98 | 0:415638154129 | 85 | bool FileSelector::CreateTable() |
nhancap98 | 0:415638154129 | 86 | { |
nhancap98 | 0:415638154129 | 87 | DIR* dp = opendir("/sd"); |
nhancap98 | 0:415638154129 | 88 | fileCount_ = 0; |
nhancap98 | 0:415638154129 | 89 | if (dp != NULL) |
nhancap98 | 0:415638154129 | 90 | { |
nhancap98 | 0:415638154129 | 91 | dirent* entry; |
nhancap98 | 0:415638154129 | 92 | for (int n=0; n<256; n++) |
nhancap98 | 0:415638154129 | 93 | { |
nhancap98 | 0:415638154129 | 94 | entry = readdir(dp); |
nhancap98 | 0:415638154129 | 95 | if (entry == NULL) break; |
nhancap98 | 0:415638154129 | 96 | |
nhancap98 | 0:415638154129 | 97 | string strName = entry->d_name; |
nhancap98 | 0:415638154129 | 98 | if ( (strName.find(".wav") != string::npos) || |
nhancap98 | 0:415638154129 | 99 | (strName.find(".WAV") != string::npos) ) |
nhancap98 | 0:415638154129 | 100 | { |
nhancap98 | 0:415638154129 | 101 | sdReader_.Open(strName); // m? t?p tin |
nhancap98 | 0:415638154129 | 102 | |
nhancap98 | 0:415638154129 | 103 | // Lo?i tr? các t?p không ph?i PCM, âm thanh n?i 16 bit, t?n s? l?y m?u 44,1 kHz |
nhancap98 | 0:415638154129 | 104 | if (sdReader_.IsWavFile()) |
nhancap98 | 0:415638154129 | 105 | fileNames_[fileCount_++] = strName; |
nhancap98 | 0:415638154129 | 106 | sdReader_.Close(); |
nhancap98 | 0:415638154129 | 107 | } |
nhancap98 | 0:415638154129 | 108 | if (fileCount_ >= MAX_FILES_) break; |
nhancap98 | 0:415638154129 | 109 | } |
nhancap98 | 0:415638154129 | 110 | closedir(dp); |
nhancap98 | 0:415638154129 | 111 | } |
nhancap98 | 0:415638154129 | 112 | else |
nhancap98 | 0:415638154129 | 113 | return false; // n?u th? SD không du?c cài d?t |
nhancap98 | 0:415638154129 | 114 | if (fileCount_ == 0) return false; //N?u t?p WAV tuong ?ng không t?n t?i |
nhancap98 | 0:415638154129 | 115 | |
nhancap98 | 0:415638154129 | 116 | div_t m = div(fileCount_, MAX_LIST_PAGE_); |
nhancap98 | 0:415638154129 | 117 | maxPage_ = (m.rem == 0) ? m.quot : m.quot+1; |
nhancap98 | 0:415638154129 | 118 | return true; //Khi t?p WAV tuong ?ng t?n t?i |
nhancap98 | 0:415638154129 | 119 | } |
nhancap98 | 0:415638154129 | 120 | |
nhancap98 | 0:415638154129 | 121 | // ch?n t?p tin |
nhancap98 | 0:415638154129 | 122 | bool FileSelector::Select(string &fileName) |
nhancap98 | 0:415638154129 | 123 | { |
nhancap98 | 0:415638154129 | 124 | int m; |
nhancap98 | 0:415638154129 | 125 | if (next_.GetTouchedNumber(m)) |
nhancap98 | 0:415638154129 | 126 | { |
nhancap98 | 0:415638154129 | 127 | if (m==0) page_--; |
nhancap98 | 0:415638154129 | 128 | else page_++; |
nhancap98 | 0:415638154129 | 129 | DisplayFileList(false); |
nhancap98 | 0:415638154129 | 130 | nOld_ = -1; |
nhancap98 | 0:415638154129 | 131 | wait_ms(300); |
nhancap98 | 0:415638154129 | 132 | } |
nhancap98 | 0:415638154129 | 133 | |
nhancap98 | 0:415638154129 | 134 | int n; |
nhancap98 | 0:415638154129 | 135 | if (rect_->GetTouchedNumber(n)) |
nhancap98 | 0:415638154129 | 136 | { |
nhancap98 | 0:415638154129 | 137 | int k = (page_ - 1)*MAX_LIST_PAGE_ + n; |
nhancap98 | 0:415638154129 | 138 | fileNameLabels_[n]->Draw(GetFileNameNoExt(k), |
nhancap98 | 0:415638154129 | 139 | TOUCHED_COLOR_); |
nhancap98 | 0:415638154129 | 140 | fileName = fileNames_[k]; |
nhancap98 | 0:415638154129 | 141 | // Tr? v? màu c?a tên t?p dã ch?n tru?c dó trên cùng m?t trang |
nhancap98 | 0:415638154129 | 142 | if (nOld_ != -1) |
nhancap98 | 0:415638154129 | 143 | fileNameLabels_[nOld_]->Draw(GetFileNameNoExt(kOld_), |
nhancap98 | 0:415638154129 | 144 | BASE_COLOR_); |
nhancap98 | 0:415638154129 | 145 | if (page_ == maxPage_) // xóa hình ch? nh?t ph? trên trang cu?i |
nhancap98 | 0:415638154129 | 146 | for (int j=fileCount_ % MAX_LIST_PAGE_ + 1; |
nhancap98 | 0:415638154129 | 147 | j < MAX_LIST_PAGE_; j++) rect_->Erase(j); |
nhancap98 | 0:415638154129 | 148 | nOld_ = n; |
nhancap98 | 0:415638154129 | 149 | kOld_ = k; |
nhancap98 | 0:415638154129 | 150 | wait_ms(300); |
nhancap98 | 0:415638154129 | 151 | return true; |
nhancap98 | 0:415638154129 | 152 | } |
nhancap98 | 0:415638154129 | 153 | else |
nhancap98 | 0:415638154129 | 154 | return false; |
nhancap98 | 0:415638154129 | 155 | } |
nhancap98 | 0:415638154129 | 156 | |
nhancap98 | 0:415638154129 | 157 | // Hi?n th? danh sách các t?p tin |
nhancap98 | 0:415638154129 | 158 | void FileSelector::DisplayFileList(bool sortEnable) |
nhancap98 | 0:415638154129 | 159 | { |
nhancap98 | 0:415638154129 | 160 | if (sortEnable) |
nhancap98 | 0:415638154129 | 161 | std::sort((string *)fileNames_, |
nhancap98 | 0:415638154129 | 162 | (string *)fileNames_+fileCount_); |
nhancap98 | 0:415638154129 | 163 | |
nhancap98 | 0:415638154129 | 164 | Erase(X_, Y_, MAX_NAME_LENGTH_*((sFONT *)(&Font16))->Width, 272-Y_); |
nhancap98 | 0:415638154129 | 165 | |
nhancap98 | 0:415638154129 | 166 | div_t m = div(fileCount_, MAX_LIST_PAGE_); |
nhancap98 | 0:415638154129 | 167 | int count = (m.quot >= page_) ? MAX_LIST_PAGE_ : m.rem; |
nhancap98 | 0:415638154129 | 168 | for (int n=0; n<count; n++) rect_->Draw(n); |
nhancap98 | 0:415638154129 | 169 | for (int n=0; n<count; n++) |
nhancap98 | 0:415638154129 | 170 | fileNameLabels_[n]->Draw(GetFileNameNoExt(n+(page_-1)*MAX_LIST_PAGE_)); |
nhancap98 | 0:415638154129 | 171 | // Hi?n th? trang tru?c, nút ch?n trang ti?p theo, v.v. |
nhancap98 | 0:415638154129 | 172 | next_.InactivateAll(); |
nhancap98 | 0:415638154129 | 173 | if (page_ > 1) next_.Activate(0); // "<" h?p l? |
nhancap98 | 0:415638154129 | 174 | if (page_ < maxPage_) next_.Activate(1); // ">" h?p l? |
nhancap98 | 0:415638154129 | 175 | char page[6]; |
nhancap98 | 0:415638154129 | 176 | sprintf(page, "%d/%d", page_, maxPage_); |
nhancap98 | 0:415638154129 | 177 | pageLabel_.Draw(page); |
nhancap98 | 0:415638154129 | 178 | } |
nhancap98 | 0:415638154129 | 179 | |
nhancap98 | 0:415638154129 | 180 | // xóa danh sách các t?p tin |
nhancap98 | 0:415638154129 | 181 | void FileSelector::Erase(uint16_t x, uint16_t y, uint16_t width, uint16_t height, |
nhancap98 | 0:415638154129 | 182 | uint32_t color) |
nhancap98 | 0:415638154129 | 183 | { |
nhancap98 | 0:415638154129 | 184 | lcd_.SetTextColor(color); |
nhancap98 | 0:415638154129 | 185 | lcd_.FillRect(x, y, width, height); |
nhancap98 | 0:415638154129 | 186 | } |
nhancap98 | 0:415638154129 | 187 | |
nhancap98 | 0:415638154129 | 188 | // L?y tên t?p v?i ph?n m? r?ng b? xóa |
nhancap98 | 0:415638154129 | 189 | string FileSelector::GetFileNameNoExt(int n) |
nhancap98 | 0:415638154129 | 190 | { |
nhancap98 | 0:415638154129 | 191 | string name = fileNames_[n]; |
nhancap98 | 0:415638154129 | 192 | int k = name.rfind("."); |
nhancap98 | 0:415638154129 | 193 | if (k != string::npos) |
nhancap98 | 0:415638154129 | 194 | return name.erase(k); |
nhancap98 | 0:415638154129 | 195 | else |
nhancap98 | 0:415638154129 | 196 | return name; |
nhancap98 | 0:415638154129 | 197 | } |
nhancap98 | 0:415638154129 | 198 | } |
nhancap98 | 0:415638154129 | 199 | //-------------------------------------------------------------- |
nhancap98 | 0:415638154129 | 200 | //chuong trình hi?n th? giao di?n & di?u khi?n |
nhancap98 | 0:415638154129 | 201 | |
nhancap98 | 0:415638154129 | 202 | namespace Mikami |
nhancap98 | 0:415638154129 | 203 | { |
nhancap98 | 0:415638154129 | 204 | SD_PlayerSkeleton::SD_PlayerSkeleton(string str, bool resetButton) |
nhancap98 | 0:415638154129 | 205 | : BUFF_SIZE_(2048), sn_(BUFF_SIZE_), |
nhancap98 | 0:415638154129 | 206 | mySai_(SaiIO::OUTPUT, BUFF_SIZE_, AUDIO_FREQUENCY_44K), |
nhancap98 | 0:415638154129 | 207 | sdReader_(BUFF_SIZE_), |
nhancap98 | 0:415638154129 | 208 | fileName_(""), |
nhancap98 | 0:415638154129 | 209 | title_(214, 4, str, Label::CENTER, Font16), |
nhancap98 | 0:415638154129 | 210 | selector_(0, 22, 256, 37, sdReader_), |
nhancap98 | 0:415638154129 | 211 | menu_(BG_LEFT_, 2, BG_WIDTH_, BG_HEIGHT_, 5, |
nhancap98 | 0:415638154129 | 212 | (string[]){"SELECT", "PLAY", "PAUSE", "RESUME", "STOP"}, |
nhancap98 | 0:415638154129 | 213 | 0, 2, 1) |
nhancap98 | 0:415638154129 | 214 | { |
nhancap98 | 0:415638154129 | 215 | menu_.InactivateAll(); |
nhancap98 | 0:415638154129 | 216 | menu_.Activate(0); |
nhancap98 | 0:415638154129 | 217 | |
nhancap98 | 0:415638154129 | 218 | if (!selector_.CreateTable()) |
nhancap98 | 0:415638154129 | 219 | BlinkLabel errLabel(240, 100, "SD CARD ERROR", Label::CENTER); |
nhancap98 | 0:415638154129 | 220 | |
nhancap98 | 0:415638154129 | 221 | if (resetButton) reset_ = new ResetButton(); |
nhancap98 | 0:415638154129 | 222 | else reset_ = NULL; |
nhancap98 | 0:415638154129 | 223 | } |
nhancap98 | 0:415638154129 | 224 | |
nhancap98 | 0:415638154129 | 225 | // th?c thi x? lý trình phát SD |
nhancap98 | 0:415638154129 | 226 | void SD_PlayerSkeleton::Execute() |
nhancap98 | 0:415638154129 | 227 | { |
nhancap98 | 0:415638154129 | 228 | bool playOk = false; |
nhancap98 | 0:415638154129 | 229 | int32_t loopCount; |
nhancap98 | 0:415638154129 | 230 | |
nhancap98 | 0:415638154129 | 231 | while (true) |
nhancap98 | 0:415638154129 | 232 | { |
nhancap98 | 0:415638154129 | 233 | if (playOk) // Trong tru?ng h?p PLAY sau PAUSE |
nhancap98 | 0:415638154129 | 234 | loopCount = SD_Open(); |
nhancap98 | 0:415638154129 | 235 | else // N?u không PLAY sau PAUSE |
nhancap98 | 0:415638154129 | 236 | { |
nhancap98 | 0:415638154129 | 237 | if (0 == WaitTouched()) SelectFile(); |
nhancap98 | 0:415638154129 | 238 | loopCount = SD_Open(); |
nhancap98 | 0:415638154129 | 239 | while (1 != WaitTouched()) {} // Ð?i cho d?n khi PLAY du?c ch?m |
nhancap98 | 0:415638154129 | 240 | } |
nhancap98 | 0:415638154129 | 241 | |
nhancap98 | 0:415638154129 | 242 | Display(); // X? lý hi?n th? dành riêng cho ?ng d?ng (ch?c nang ?o) |
nhancap98 | 0:415638154129 | 243 | if (reset_ != NULL) reset_->Draw(); |
nhancap98 | 0:415638154129 | 244 | |
nhancap98 | 0:415638154129 | 245 | menu_.Inactivate(0); // SELECT b? vô hi?u hóa |
nhancap98 | 0:415638154129 | 246 | menu_.Activate(2); // PAUSE b? vô hi?u hóa |
nhancap98 | 0:415638154129 | 247 | menu_.Activate(4); // STOP b? vô hi?u hóa |
nhancap98 | 0:415638154129 | 248 | |
nhancap98 | 0:415638154129 | 249 | playOk = false; |
nhancap98 | 0:415638154129 | 250 | bool stopOk = false; |
nhancap98 | 0:415638154129 | 251 | |
nhancap98 | 0:415638154129 | 252 | Clear(); // Quá trình xóa ?ng d?ng c? th? (ch?c nang ?o) |
nhancap98 | 0:415638154129 | 253 | |
nhancap98 | 0:415638154129 | 254 | mySai_.PlayOut(); // Play |
nhancap98 | 0:415638154129 | 255 | |
nhancap98 | 0:415638154129 | 256 | // L?p l?i cho d?n khi h?t d? li?u t?p |
nhancap98 | 0:415638154129 | 257 | for (int k=0; k<loopCount; k++) |
nhancap98 | 0:415638154129 | 258 | { |
nhancap98 | 0:415638154129 | 259 | int touch42 = -1; |
nhancap98 | 0:415638154129 | 260 | menu_.GetTouchedNumber(touch42); |
nhancap98 | 0:415638154129 | 261 | if (touch42 == 4) break; // STOP |
nhancap98 | 0:415638154129 | 262 | if (touch42 == 2) // PAUSE X? lý khi ch?m vào nút |
nhancap98 | 0:415638154129 | 263 | { |
nhancap98 | 0:415638154129 | 264 | menu_.Inactivate(2); // PAUSE Nút không h?p l? |
nhancap98 | 0:415638154129 | 265 | menu_.Activate(3); // RESUME Ðã b?t nút |
nhancap98 | 0:415638154129 | 266 | mySai_.PauseOut(); |
nhancap98 | 0:415638154129 | 267 | |
nhancap98 | 0:415638154129 | 268 | // PLAY Ð?i cho d?n khi 'RESUME' ho?c 'STOP' du?c ch?m vào |
nhancap98 | 0:415638154129 | 269 | switch (WaitTouched()) |
nhancap98 | 0:415638154129 | 270 | { |
nhancap98 | 0:415638154129 | 271 | case 1: playOk = true; // PLAY t? d?u |
nhancap98 | 0:415638154129 | 272 | break; |
nhancap98 | 0:415638154129 | 273 | case 3: mySai_.ResumeOut(); // Ti?p t?c PLAY t? di?m PAUSE |
nhancap98 | 0:415638154129 | 274 | menu_.Activate(2); |
nhancap98 | 0:415638154129 | 275 | menu_.Inactivate(3); |
nhancap98 | 0:415638154129 | 276 | menu_.TouchedColor(1); |
nhancap98 | 0:415638154129 | 277 | break; |
nhancap98 | 0:415638154129 | 278 | case 4: stopOk = true; // STOP |
nhancap98 | 0:415638154129 | 279 | break; |
nhancap98 | 0:415638154129 | 280 | } |
nhancap98 | 0:415638154129 | 281 | } |
nhancap98 | 0:415638154129 | 282 | if (playOk || stopOk) break; |
nhancap98 | 0:415638154129 | 283 | |
nhancap98 | 0:415638154129 | 284 | DoIfHandled(); |
nhancap98 | 0:415638154129 | 285 | // 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) |
nhancap98 | 0:415638154129 | 286 | SignalProcessing(); |
nhancap98 | 0:415638154129 | 287 | } |
nhancap98 | 0:415638154129 | 288 | mySai_.StopOut(); |
nhancap98 | 0:415638154129 | 289 | if (!playOk) menu_.Activate(0); // SELECT h?p l? |
nhancap98 | 0:415638154129 | 290 | menu_.Draw(1); // Kh?i t?o màu c?a nút PLAY |
nhancap98 | 0:415638154129 | 291 | for (int n=2; n<5; n++) // Các nút khác b? vô hi?u hóa |
nhancap98 | 0:415638154129 | 292 | menu_.Inactivate(n); |
nhancap98 | 0:415638154129 | 293 | |
nhancap98 | 0:415638154129 | 294 | sdReader_.Close(); // Ðóng t?p SD |
nhancap98 | 0:415638154129 | 295 | } |
nhancap98 | 0:415638154129 | 296 | } |
nhancap98 | 0:415638154129 | 297 | |
nhancap98 | 0:415638154129 | 298 | // L?y tên t?p dã ch?n mà không c?n ph?n m? r?ng |
nhancap98 | 0:415638154129 | 299 | string SD_PlayerSkeleton::GetFileNameNoExt() |
nhancap98 | 0:415638154129 | 300 | { |
nhancap98 | 0:415638154129 | 301 | string fName = fileName_; |
nhancap98 | 0:415638154129 | 302 | int k = fName.rfind("."); |
nhancap98 | 0:415638154129 | 303 | if (k != string::npos) |
nhancap98 | 0:415638154129 | 304 | return fName.erase(k); |
nhancap98 | 0:415638154129 | 305 | else |
nhancap98 | 0:415638154129 | 306 | return fName; |
nhancap98 | 0:415638154129 | 307 | } |
nhancap98 | 0:415638154129 | 308 | |
nhancap98 | 0:415638154129 | 309 | // M? t?p th? SD |
nhancap98 | 0:415638154129 | 310 | int32_t SD_PlayerSkeleton::SD_Open() |
nhancap98 | 0:415638154129 | 311 | { |
nhancap98 | 0:415638154129 | 312 | if (fileName_.empty()) SelectFile(); |
nhancap98 | 0:415638154129 | 313 | sdReader_.Open(fileName_); |
nhancap98 | 0:415638154129 | 314 | sdReader_.IsWavFile(); |
nhancap98 | 0:415638154129 | 315 | return sdReader_.GetSize()/BUFF_SIZE_; |
nhancap98 | 0:415638154129 | 316 | } |
nhancap98 | 0:415638154129 | 317 | |
nhancap98 | 0:415638154129 | 318 | // L?a ch?n t?p tin |
nhancap98 | 0:415638154129 | 319 | void SD_PlayerSkeleton::SelectFile() |
nhancap98 | 0:415638154129 | 320 | { |
nhancap98 | 0:415638154129 | 321 | selector_.DisplayFileList(); |
nhancap98 | 0:415638154129 | 322 | title_.Draw("Select file"); |
nhancap98 | 0:415638154129 | 323 | menu_.Inactivate(0); // SELECT vô hi?u hóa |
nhancap98 | 0:415638154129 | 324 | menu_.Inactivate(1); // PLAY vô hi?u hóa |
nhancap98 | 0:415638154129 | 325 | do |
nhancap98 | 0:415638154129 | 326 | if (selector_.Select(fileName_)) |
nhancap98 | 0:415638154129 | 327 | menu_.Activate(1); // PLAY dã b?t |
nhancap98 | 0:415638154129 | 328 | while (!menu_.Touched(1)); // PLAY L?p l?i cho d?n khi nút du?c ch?m |
nhancap98 | 0:415638154129 | 329 | |
nhancap98 | 0:415638154129 | 330 | selector_.Erase(0, 0, BG_LEFT_-4, 272); |
nhancap98 | 0:415638154129 | 331 | title_.Draw(); |
nhancap98 | 0:415638154129 | 332 | } |
nhancap98 | 0:415638154129 | 333 | |
nhancap98 | 0:415638154129 | 334 | // X? lý khi b?ng di?u khi?n du?c v?n hành |
nhancap98 | 0:415638154129 | 335 | void SD_PlayerSkeleton::DoIfHandled() |
nhancap98 | 0:415638154129 | 336 | { |
nhancap98 | 0:415638154129 | 337 | if (reset_ != NULL) reset_->DoIfTouched(); |
nhancap98 | 0:415638154129 | 338 | Modefy(); // ?ng d?ng thay d?i tham s? c? th? (ch?c nang ?o) |
nhancap98 | 0:415638154129 | 339 | } |
nhancap98 | 0:415638154129 | 340 | |
nhancap98 | 0:415638154129 | 341 | //Ð?i trong khi th?c hi?n Do IfHandled () cho d?n khi b?t k? nút nào trên menu du?c ch?m vào |
nhancap98 | 0:415638154129 | 342 | int SD_PlayerSkeleton::WaitTouched() |
nhancap98 | 0:415638154129 | 343 | { |
nhancap98 | 0:415638154129 | 344 | int touchNum; |
nhancap98 | 0:415638154129 | 345 | while (!menu_.GetTouchedNumber(touchNum)) DoIfHandled(); |
nhancap98 | 0:415638154129 | 346 | return touchNum; |
nhancap98 | 0:415638154129 | 347 | } |
nhancap98 | 0:415638154129 | 348 | } |
nhancap98 | 0:415638154129 | 349 | //------------------------------------------------- |
nhancap98 | 0:415638154129 | 350 | //chuong trình con d?c file WAV-PCM-16bit-44.1KHz |
nhancap98 | 0:415638154129 | 351 | |
nhancap98 | 0:415638154129 | 352 | namespace Mikami |
nhancap98 | 0:415638154129 | 353 | { |
nhancap98 | 0:415638154129 | 354 | SD_WavReader::SD_WavReader(int32_t bufferSize) |
nhancap98 | 0:415638154129 | 355 | : STR_("sd"), ok_(false) |
nhancap98 | 0:415638154129 | 356 | { |
nhancap98 | 0:415638154129 | 357 | sd_ = new SDFileSystem(STR_.c_str()); |
nhancap98 | 0:415638154129 | 358 | sd_->mount(); |
nhancap98 | 0:415638154129 | 359 | buffer.SetSize(bufferSize*2); |
nhancap98 | 0:415638154129 | 360 | } |
nhancap98 | 0:415638154129 | 361 | |
nhancap98 | 0:415638154129 | 362 | SD_WavReader::~SD_WavReader() |
nhancap98 | 0:415638154129 | 363 | { |
nhancap98 | 0:415638154129 | 364 | sd_->unmount(); |
nhancap98 | 0:415638154129 | 365 | delete sd_; |
nhancap98 | 0:415638154129 | 366 | } |
nhancap98 | 0:415638154129 | 367 | |
nhancap98 | 0:415638154129 | 368 | void SD_WavReader::Open(const string fileName) |
nhancap98 | 0:415638154129 | 369 | { |
nhancap98 | 0:415638154129 | 370 | string name = (string)"/" + STR_ + "/" + fileName; |
nhancap98 | 0:415638154129 | 371 | fp_ = fopen(name.c_str(), "rb"); |
nhancap98 | 0:415638154129 | 372 | if (fp_ == NULL) ErrorMsg("Loi The SD!!!"); |
nhancap98 | 0:415638154129 | 373 | } |
nhancap98 | 0:415638154129 | 374 | |
nhancap98 | 0:415638154129 | 375 | |
nhancap98 | 0:415638154129 | 376 | // Ð?c m?t ph?n c?a tiêu d? t?p "RIFFxxxxWAVEfmt" |
nhancap98 | 0:415638154129 | 377 | // Giá tr? tr? v?: true n?u âm thanh n?i 16 bit, t?n s? l?y m?u là 44,1 kHz |
nhancap98 | 0:415638154129 | 378 | bool SD_WavReader::IsWavFile() |
nhancap98 | 0:415638154129 | 379 | { |
nhancap98 | 0:415638154129 | 380 | char data[17]; |
nhancap98 | 0:415638154129 | 381 | fread(data, 1, 16, fp_); // Ð?c 16 byte |
nhancap98 | 0:415638154129 | 382 | string strRead = ""; |
nhancap98 | 0:415638154129 | 383 | for (int n=0; n<4; n++) strRead += data[n]; |
nhancap98 | 0:415638154129 | 384 | // Không ki?m tra 4 ký t? gi?a |
nhancap98 | 0:415638154129 | 385 | for (int n=8; n<16; n++) strRead += data[n]; |
nhancap98 | 0:415638154129 | 386 | |
nhancap98 | 0:415638154129 | 387 | // Ki?m tra xem "RIFF", "WAVE", "fmt" có t?n t?i không |
nhancap98 | 0:415638154129 | 388 | if (strRead != "RIFFWAVEfmt ") return false; |
nhancap98 | 0:415638154129 | 389 | |
nhancap98 | 0:415638154129 | 390 | // có du?c kích thu?c c?a fmt chunck |
nhancap98 | 0:415638154129 | 391 | uint32_t fmtChunkSize; |
nhancap98 | 0:415638154129 | 392 | fread(&fmtChunkSize, sizeof(uint32_t), 1, fp_); |
nhancap98 | 0:415638154129 | 393 | |
nhancap98 | 0:415638154129 | 394 | // Xác nh?n r?ng dó là PCM, Stereo, 44.1 kHz, 16 bit |
nhancap98 | 0:415638154129 | 395 | WaveFormatEx fmtData; |
nhancap98 | 0:415638154129 | 396 | fread(&fmtData, fmtChunkSize, 1, fp_); |
nhancap98 | 0:415638154129 | 397 | if ((fmtData.wFormatTag != 1) || |
nhancap98 | 0:415638154129 | 398 | (fmtData.nChannels != 2) || |
nhancap98 | 0:415638154129 | 399 | (fmtData.nSamplesPerSec != AUDIO_FREQUENCY_44K) || |
nhancap98 | 0:415638154129 | 400 | (fmtData.wBitsPerSample != 16) |
nhancap98 | 0:415638154129 | 401 | ) return false; |
nhancap98 | 0:415638154129 | 402 | |
nhancap98 | 0:415638154129 | 403 | // Tìm d? li?u |
nhancap98 | 0:415638154129 | 404 | char dataId[5]; |
nhancap98 | 0:415638154129 | 405 | dataId[4] = 0; |
nhancap98 | 0:415638154129 | 406 | fread(dataId, 1, 4, fp_); |
nhancap98 | 0:415638154129 | 407 | if ("data" != (string)dataId) |
nhancap98 | 0:415638154129 | 408 | for (int n=0; n<100; n++) |
nhancap98 | 0:415638154129 | 409 | { |
nhancap98 | 0:415638154129 | 410 | char oneByte; |
nhancap98 | 0:415638154129 | 411 | fread(&oneByte, 1, 1, fp_); |
nhancap98 | 0:415638154129 | 412 | for (int k=0; k<3; k++) |
nhancap98 | 0:415638154129 | 413 | dataId[k] = dataId[k+1]; |
nhancap98 | 0:415638154129 | 414 | dataId[3] = oneByte; |
nhancap98 | 0:415638154129 | 415 | if ("data" == (string)dataId) break; |
nhancap98 | 0:415638154129 | 416 | |
nhancap98 | 0:415638154129 | 417 | if (n == 99) return false; |
nhancap98 | 0:415638154129 | 418 | } |
nhancap98 | 0:415638154129 | 419 | |
nhancap98 | 0:415638154129 | 420 | // Nh?n kích thu?c d? li?u (byte) |
nhancap98 | 0:415638154129 | 421 | int32_t sizeByte; |
nhancap98 | 0:415638154129 | 422 | fread(&sizeByte, sizeof(int32_t), 1, fp_); |
nhancap98 | 0:415638154129 | 423 | size_ = sizeByte/4; |
nhancap98 | 0:415638154129 | 424 | |
nhancap98 | 0:415638154129 | 425 | ok_ = true; |
nhancap98 | 0:415638154129 | 426 | return true; |
nhancap98 | 0:415638154129 | 427 | } |
nhancap98 | 0:415638154129 | 428 | |
nhancap98 | 0:415638154129 | 429 | // Nh?n d? li?u âm thanh n?i t? t?p tin |
nhancap98 | 0:415638154129 | 430 | void SD_WavReader::ReadStereo(Array<int16_t>& dataL, |
nhancap98 | 0:415638154129 | 431 | Array<int16_t>& dataR) |
nhancap98 | 0:415638154129 | 432 | { |
nhancap98 | 0:415638154129 | 433 | if (!ok_) ErrorMsg("Get data FAILED"); |
nhancap98 | 0:415638154129 | 434 | uint32_t size = dataL.Length(); |
nhancap98 | 0:415638154129 | 435 | fread(buffer, sizeof(int16_t), size*2, fp_); |
nhancap98 | 0:415638154129 | 436 | for (int n=0; n<size; n++) |
nhancap98 | 0:415638154129 | 437 | { |
nhancap98 | 0:415638154129 | 438 | dataL[n] = buffer[2*n]; |
nhancap98 | 0:415638154129 | 439 | dataR[n] = buffer[2*n+1]; |
nhancap98 | 0:415638154129 | 440 | } |
nhancap98 | 0:415638154129 | 441 | } |
nhancap98 | 0:415638154129 | 442 | |
nhancap98 | 0:415638154129 | 443 | // Chuy?n d?i d? li?u t? t?p tin sang don âm |
nhancap98 | 0:415638154129 | 444 | void SD_WavReader::ReadAndToMono(Array<int16_t>& data) |
nhancap98 | 0:415638154129 | 445 | { |
nhancap98 | 0:415638154129 | 446 | if (!ok_) ErrorMsg("Get data FAILED"); |
nhancap98 | 0:415638154129 | 447 | uint32_t size = data.Length(); |
nhancap98 | 0:415638154129 | 448 | fread(buffer, sizeof(int16_t), size*2, fp_); |
nhancap98 | 0:415638154129 | 449 | for (int n=0; n<size; n++) |
nhancap98 | 0:415638154129 | 450 | data[n] = (buffer[2*n] + buffer[2*n+1])/2; |
nhancap98 | 0:415638154129 | 451 | } |
nhancap98 | 0:415638154129 | 452 | |
nhancap98 | 0:415638154129 | 453 | // Thu th?p kích thu?c d? li?u (s? di?m l?y m?u) |
nhancap98 | 0:415638154129 | 454 | int32_t SD_WavReader::GetSize() |
nhancap98 | 0:415638154129 | 455 | { |
nhancap98 | 0:415638154129 | 456 | if (!ok_) ErrorMsg("Get data size FAILED"); |
nhancap98 | 0:415638154129 | 457 | return size_; |
nhancap98 | 0:415638154129 | 458 | } |
nhancap98 | 0:415638154129 | 459 | } |