Nam

Dependencies:   SRC_STM32F7 F746-GUI SD_PlayerSkeleton F746-SAI-IO

Committer:
nhancap98
Date:
Mon Jun 10 11:21:41 2019 +0000
Revision:
1:1e9ab332e036
Parent:
0:415638154129
SPKT

Who changed what in which revision?

UserRevisionLine numberNew 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 }