SPKT
Dependencies: SDFileSystem_Warning_Fixed
Dependents: DISCO-F746_WAV_PLAYER WAV
Revision 20:84ca69a520f9, committed 2019-06-07
- Comitter:
- phungductung
- Date:
- Fri Jun 07 05:39:43 2019 +0000
- Parent:
- 19:9f34d9b4a6a7
- Commit message:
- 12
Changed in this revision
diff -r 9f34d9b4a6a7 -r 84ca69a520f9 FileSelectorWav.cpp --- a/FileSelectorWav.cpp Fri Jun 07 05:26:05 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,153 +0,0 @@ - -//-------------------------------------------------------------- - -#include "FileSelectorWav.hpp" - -namespace Mikami -{ - FileSelector::FileSelector(uint8_t x0, uint8_t y0, int maxFiles, - int maxNameLength, SD_WavReader &reader) - : X_(x0), Y_(y0), - MAX_FILES_(maxFiles), MAX_NAME_LENGTH_(maxNameLength), - fileNames_(maxFiles), fileNameLabels_(MAX_LIST_PAGE_), - next_(50, 238, 64, 36, 2, (string[]){"<", ">"}, 10, 0, 2, -1, Font24), - pageLabel_(210, 250, Label::LEFT, Font16), - lcd_(GuiBase::GetLcd()), sdReader_(reader), page_(1), - nOld_(-1), kOld_(-1) - { - Array<string> nonString(MAX_LIST_PAGE_, ""); - rect_ = new ButtonGroup(X_, Y_, W_H_, W_H_, MAX_LIST_PAGE_, - nonString, 0, V_L_-W_H_, 1, - -1, Font12, 0, GuiBase::ENUM_BACK, - BASE_COLOR_, TOUCHED_COLOR_); - rect_->EraseAll(); - next_.EraseAll(); - - // Tạo Label - for (int n=0; n<MAX_LIST_PAGE_; n++) - fileNameLabels_[n] = new Label(X_+30, Y_+5+V_L_*n, "", - Label::LEFT, Font16, BASE_COLOR_); - } - - FileSelector::~FileSelector() - { - delete rect_; - for (int n=0; n<MAX_LIST_PAGE_; n++) delete fileNameLabels_[n]; - } - - // Lập danh sách các tập tin. Trả về false nếu tệp WAV không tồn tại - bool FileSelector::CreateTable() - { - DIR* dp = opendir("/sd"); - fileCount_ = 0; - if (dp != NULL) - { - dirent* entry; - for (int n=0; n<256; n++) - { - entry = readdir(dp); - if (entry == NULL) break; - - string strName = entry->d_name; - if ( (strName.find(".wav") != string::npos) || - (strName.find(".WAV") != string::npos) ) - { - sdReader_.Open(strName); // mở tập tin - - // 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 - if (sdReader_.IsWavFile()) - fileNames_[fileCount_++] = strName; - sdReader_.Close(); - } - if (fileCount_ >= MAX_FILES_) break; - } - closedir(dp); - } - else - return false; // nếu thẻ SD không được cài đặt - if (fileCount_ == 0) return false; //Nếu tệp WAV tương ứng không tồn tại - - div_t m = div(fileCount_, MAX_LIST_PAGE_); - maxPage_ = (m.rem == 0) ? m.quot : m.quot+1; - return true; //Khi tệp WAV tương ứng tồn tại - } - - // chọn tập tin - bool FileSelector::Select(string &fileName) - { - int m; - if (next_.GetTouchedNumber(m)) - { - if (m==0) page_--; - else page_++; - DisplayFileList(false); - nOld_ = -1; - wait_ms(300); - } - - int n; - if (rect_->GetTouchedNumber(n)) - { - int k = (page_ - 1)*MAX_LIST_PAGE_ + n; - fileNameLabels_[n]->Draw(GetFileNameNoExt(k), - TOUCHED_COLOR_); - fileName = fileNames_[k]; - // Trả về màu của tên tệp đã chọn trước đó trên cùng một trang - if (nOld_ != -1) - fileNameLabels_[nOld_]->Draw(GetFileNameNoExt(kOld_), - BASE_COLOR_); - if (page_ == maxPage_) // xóa hình chữ nhật phụ trên trang cuối - for (int j=fileCount_ % MAX_LIST_PAGE_ + 1; - j < MAX_LIST_PAGE_; j++) rect_->Erase(j); - nOld_ = n; - kOld_ = k; - wait_ms(300); - return true; - } - else - return false; - } - - // Hiển thị danh sách các tập tin - void FileSelector::DisplayFileList(bool sortEnable) - { - if (sortEnable) - std::sort((string *)fileNames_, - (string *)fileNames_+fileCount_); - - Erase(X_, Y_, MAX_NAME_LENGTH_*((sFONT *)(&Font16))->Width, 272-Y_); - - div_t m = div(fileCount_, MAX_LIST_PAGE_); - int count = (m.quot >= page_) ? MAX_LIST_PAGE_ : m.rem; - for (int n=0; n<count; n++) rect_->Draw(n); - for (int n=0; n<count; n++) - fileNameLabels_[n]->Draw(GetFileNameNoExt(n+(page_-1)*MAX_LIST_PAGE_)); -// Hiển thị trang trước, nút chọn trang tiếp theo, v.v. - next_.InactivateAll(); - if (page_ > 1) next_.Activate(0); // "<" hợp lệ - if (page_ < maxPage_) next_.Activate(1); // ">" hợp lệ - char page[6]; - sprintf(page, "%d/%d", page_, maxPage_); - pageLabel_.Draw(page); - } - - // xóa danh sách các tập tin - void FileSelector::Erase(uint16_t x, uint16_t y, uint16_t width, uint16_t height, - uint32_t color) - { - lcd_.SetTextColor(color); - lcd_.FillRect(x, y, width, height); - } - - // Lấy tên tệp với phần mở rộng bị xóa - string FileSelector::GetFileNameNoExt(int n) - { - string name = fileNames_[n]; - int k = name.rfind("."); - if (k != string::npos) - return name.erase(k); - else - return name; - } -} -
diff -r 9f34d9b4a6a7 -r 84ca69a520f9 SD_PlayerSkeleton.cpp --- a/SD_PlayerSkeleton.cpp Fri Jun 07 05:26:05 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,152 +0,0 @@ - -//-------------------------------------------------------------- - -#include "SD_PlayerSkeleton.hpp" - -namespace Mikami -{ - SD_PlayerSkeleton::SD_PlayerSkeleton(string str, bool resetButton) - : BUFF_SIZE_(2048), sn_(BUFF_SIZE_), - mySai_(SaiIO::OUTPUT, BUFF_SIZE_, AUDIO_FREQUENCY_44K), - sdReader_(BUFF_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[]){"SELECT", "PLAY", "PAUSE", "RESUME", "STOP"}, - 0, 2, 1) - { - menu_.InactivateAll(); - menu_.Activate(0); - - if (!selector_.CreateTable()) - BlinkLabel errLabel(240, 100, "SD CARD ERROR", Label::CENTER); - - if (resetButton) reset_ = new ResetButton(); - else reset_ = NULL; - } - - // thực thi xử lý trình phát SD - void SD_PlayerSkeleton::Execute() - { - bool playOk = false; - int32_t loopCount; - - while (true) - { - if (playOk) // Trong trường hợp PLAY sau PAUSE - loopCount = SD_Open(); - else // Nếu không PLAY sau PAUSE - { - if (0 == WaitTouched()) SelectFile(); - loopCount = SD_Open(); - while (1 != WaitTouched()) {} // Đợi cho đến khi PLAY được chạm - } - - Display(); // Xử lý hiển thị dành riêng cho ứng dụng (chức năng ảo) - if (reset_ != NULL) reset_->Draw(); - - menu_.Inactivate(0); // SELECT bị vô hiệu hóa - menu_.Activate(2); // PAUSE bị vô hiệu hóa - menu_.Activate(4); // STOP bị vô hiệu hóa - - playOk = false; - bool stopOk = false; - - Clear(); // Quá trình xóa ứng dụng cụ thể (chức năng ảo) - - mySai_.PlayOut(); // Play - - // Lặp lại cho đến khi hết dữ liệu tệp - for (int k=0; k<loopCount; k++) - { - int touch42 = -1; - menu_.GetTouchedNumber(touch42); - if (touch42 == 4) break; // STOP - if (touch42 == 2) // PAUSE Xử lý khi chạm vào nút - { - menu_.Inactivate(2); // PAUSE Nút không hợp lệ - menu_.Activate(3); // RESUME Đã bật nút - mySai_.PauseOut(); - - // PLAY Đợi cho đến khi 'RESUME' hoặc 'STOP' được chạm vào - switch (WaitTouched()) - { - case 1: playOk = true; // PLAY từ đầu - break; - case 3: mySai_.ResumeOut(); // Tiếp tục PLAY từ điểm PAUSE - menu_.Activate(2); - menu_.Inactivate(3); - menu_.TouchedColor(1); - break; - case 4: stopOk = true; // STOP - break; - } - } - if (playOk || stopOk) break; - - DoIfHandled(); - // 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) - SignalProcessing(); - } - mySai_.StopOut(); - if (!playOk) menu_.Activate(0); // SELECT hợp lệ - menu_.Draw(1); // Khởi tạo màu của nút PLAY - for (int n=2; n<5; n++) // Các nút khác bị vô hiệu hóa - menu_.Inactivate(n); - - sdReader_.Close(); // Đóng tệp SD - } - } - - // Lấy tên tệp đã chọn mà không cần phần mở rộng - string SD_PlayerSkeleton::GetFileNameNoExt() - { - string fName = fileName_; - int k = fName.rfind("."); - if (k != string::npos) - return fName.erase(k); - else - return fName; - } - - // Mở tệp thẻ SD - int32_t SD_PlayerSkeleton::SD_Open() - { - if (fileName_.empty()) SelectFile(); - sdReader_.Open(fileName_); - sdReader_.IsWavFile(); - return sdReader_.GetSize()/BUFF_SIZE_; - } - - // Lựa chọn tập tin - void SD_PlayerSkeleton::SelectFile() - { - selector_.DisplayFileList(); - title_.Draw("Select file"); - menu_.Inactivate(0); // SELECT vô hiệu hóa - menu_.Inactivate(1); // PLAY vô hiệu hóa - do - if (selector_.Select(fileName_)) - menu_.Activate(1); // PLAY đã bật - while (!menu_.Touched(1)); // PLAY Lặp lại cho đến khi nút được chạm - - selector_.Erase(0, 0, BG_LEFT_-4, 272); - title_.Draw(); - } - - // Xử lý khi bảng điều khiển được vận hành - void SD_PlayerSkeleton::DoIfHandled() - { - if (reset_ != NULL) reset_->DoIfTouched(); - Modefy(); // Ứng dụng thay đổi tham số cụ thể (chức năng ảo) - } - - //Đợ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 - int SD_PlayerSkeleton::WaitTouched() - { - int touchNum; - while (!menu_.GetTouchedNumber(touchNum)) DoIfHandled(); - return touchNum; - } -}
diff -r 9f34d9b4a6a7 -r 84ca69a520f9 SD_WavReader.cpp --- a/SD_WavReader.cpp Fri Jun 07 05:26:05 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,111 +0,0 @@ - -#include "SD_WavReader.hpp" - -namespace Mikami -{ - SD_WavReader::SD_WavReader(int32_t bufferSize) - : STR_("sd"), ok_(false) - { - sd_ = new SDFileSystem(STR_.c_str()); - sd_->mount(); - buffer.SetSize(bufferSize*2); - } - - SD_WavReader::~SD_WavReader() - { - sd_->unmount(); - delete sd_; - } - - void SD_WavReader::Open(const string fileName) - { - string name = (string)"/" + STR_ + "/" + fileName; - fp_ = fopen(name.c_str(), "rb"); - if (fp_ == NULL) ErrorMsg("Loi The SD!!!"); - } - - - // Đọc một phần của tiêu đề tệp "RIFFxxxxWAVEfmt" - // Giá trị trả về: true nếu âm thanh nổi 16 bit, tần số lấy mẫu là 44,1 kHz - bool SD_WavReader::IsWavFile() - { - char data[17]; - fread(data, 1, 16, fp_); // Đọc 16 byte - string strRead = ""; - for (int n=0; n<4; n++) strRead += data[n]; - // Không kiểm tra 4 ký tự giữa - for (int n=8; n<16; n++) strRead += data[n]; - - // Kiểm tra xem "RIFF", "WAVE", "fmt" có tồn tại không - if (strRead != "RIFFWAVEfmt ") return false; - - // có được kích thước của fmt chunck - uint32_t fmtChunkSize; - fread(&fmtChunkSize, sizeof(uint32_t), 1, fp_); - - // Xác nhận rằng đó là PCM, Stereo, 44.1 kHz, 16 bit - WaveFormatEx fmtData; - fread(&fmtData, fmtChunkSize, 1, fp_); - if ((fmtData.wFormatTag != 1) || - (fmtData.nChannels != 2) || - (fmtData.nSamplesPerSec != AUDIO_FREQUENCY_44K) || - (fmtData.wBitsPerSample != 16) - ) return false; - - // Tìm dữ liệu - char dataId[5]; - dataId[4] = 0; - fread(dataId, 1, 4, fp_); - if ("data" != (string)dataId) - for (int n=0; n<100; n++) - { - char oneByte; - fread(&oneByte, 1, 1, fp_); - for (int k=0; k<3; k++) - dataId[k] = dataId[k+1]; - dataId[3] = oneByte; - if ("data" == (string)dataId) break; - - if (n == 99) return false; - } - - // Nhận kích thước dữ liệu (byte) - int32_t sizeByte; - fread(&sizeByte, sizeof(int32_t), 1, fp_); - size_ = sizeByte/4; - - ok_ = true; - return true; - } - - // Nhận dữ liệu âm thanh nổi từ tập tin - void SD_WavReader::ReadStereo(Array<int16_t>& dataL, - Array<int16_t>& dataR) - { - if (!ok_) ErrorMsg("Get data FAILED"); - uint32_t size = dataL.Length(); - fread(buffer, sizeof(int16_t), size*2, fp_); - for (int n=0; n<size; n++) - { - dataL[n] = buffer[2*n]; - dataR[n] = buffer[2*n+1]; - } - } - - // Chuyển đổi dữ liệu từ tập tin sang đơn âm - void SD_WavReader::ReadAndToMono(Array<int16_t>& data) - { - if (!ok_) ErrorMsg("Get data FAILED"); - uint32_t size = data.Length(); - fread(buffer, sizeof(int16_t), size*2, fp_); - for (int n=0; n<size; n++) - data[n] = (buffer[2*n] + buffer[2*n+1])/2; - } - - // Thu thập kích thước dữ liệu (số điểm lấy mẫu) - int32_t SD_WavReader::GetSize() - { - if (!ok_) ErrorMsg("Get data size FAILED"); - return size_; - } -}