nguyen nam / SD_PlayerSkeleton

Dependencies:   SDFileSystem_Warning_Fixed

Committer:
phungductung
Date:
Tue Jun 04 21:35:59 2019 +0000
Revision:
18:6631cd0fbbcd
Parent:
16:299cc1052baa
WAV

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 0:d310bb78455d 1
MikamiUitOpen 0:d310bb78455d 2 #include "SD_WavReader.hpp"
MikamiUitOpen 0:d310bb78455d 3
MikamiUitOpen 0:d310bb78455d 4 namespace Mikami
MikamiUitOpen 0:d310bb78455d 5 {
MikamiUitOpen 0:d310bb78455d 6 SD_WavReader::SD_WavReader(int32_t bufferSize)
MikamiUitOpen 0:d310bb78455d 7 : STR_("sd"), ok_(false)
MikamiUitOpen 0:d310bb78455d 8 {
MikamiUitOpen 0:d310bb78455d 9 sd_ = new SDFileSystem(STR_.c_str());
MikamiUitOpen 0:d310bb78455d 10 sd_->mount();
MikamiUitOpen 0:d310bb78455d 11 buffer.SetSize(bufferSize*2);
MikamiUitOpen 0:d310bb78455d 12 }
MikamiUitOpen 0:d310bb78455d 13
MikamiUitOpen 0:d310bb78455d 14 SD_WavReader::~SD_WavReader()
MikamiUitOpen 0:d310bb78455d 15 {
MikamiUitOpen 0:d310bb78455d 16 sd_->unmount();
MikamiUitOpen 0:d310bb78455d 17 delete sd_;
MikamiUitOpen 0:d310bb78455d 18 }
MikamiUitOpen 0:d310bb78455d 19
MikamiUitOpen 0:d310bb78455d 20 void SD_WavReader::Open(const string fileName)
MikamiUitOpen 0:d310bb78455d 21 {
MikamiUitOpen 0:d310bb78455d 22 string name = (string)"/" + STR_ + "/" + fileName;
MikamiUitOpen 0:d310bb78455d 23 fp_ = fopen(name.c_str(), "rb");
phungductung 18:6631cd0fbbcd 24 if (fp_ == NULL) ErrorMsg("Loi The SD!!!");
MikamiUitOpen 0:d310bb78455d 25 }
MikamiUitOpen 0:d310bb78455d 26
MikamiUitOpen 0:d310bb78455d 27
phungductung 18:6631cd0fbbcd 28 // Đọc một phần của tiêu đề tệp "RIFFxxxxWAVEfmt"
phungductung 18:6631cd0fbbcd 29 // Giá trị trả về: true nếu âm thanh nổi 16 bit, tần số lấy mẫu là 44,1 kHz
MikamiUitOpen 0:d310bb78455d 30 bool SD_WavReader::IsWavFile()
MikamiUitOpen 0:d310bb78455d 31 {
MikamiUitOpen 0:d310bb78455d 32 char data[17];
phungductung 18:6631cd0fbbcd 33 fread(data, 1, 16, fp_); // Đọc 16 byte
MikamiUitOpen 0:d310bb78455d 34 string strRead = "";
MikamiUitOpen 0:d310bb78455d 35 for (int n=0; n<4; n++) strRead += data[n];
phungductung 18:6631cd0fbbcd 36 // Không kiểm tra 4 ký tự giữa
MikamiUitOpen 0:d310bb78455d 37 for (int n=8; n<16; n++) strRead += data[n];
MikamiUitOpen 0:d310bb78455d 38
phungductung 18:6631cd0fbbcd 39 // Kiểm tra xem "RIFF", "WAVE", "fmt" có tồn tại không
MikamiUitOpen 0:d310bb78455d 40 if (strRead != "RIFFWAVEfmt ") return false;
MikamiUitOpen 0:d310bb78455d 41
phungductung 18:6631cd0fbbcd 42 // có được kích thước của fmt chunck
MikamiUitOpen 0:d310bb78455d 43 uint32_t fmtChunkSize;
MikamiUitOpen 0:d310bb78455d 44 fread(&fmtChunkSize, sizeof(uint32_t), 1, fp_);
MikamiUitOpen 0:d310bb78455d 45
phungductung 18:6631cd0fbbcd 46 // Xác nhận rằng đó là PCM, Stereo, 44.1 kHz, 16 bit
MikamiUitOpen 0:d310bb78455d 47 WaveFormatEx fmtData;
MikamiUitOpen 0:d310bb78455d 48 fread(&fmtData, fmtChunkSize, 1, fp_);
MikamiUitOpen 16:299cc1052baa 49 if ((fmtData.wFormatTag != 1) ||
MikamiUitOpen 16:299cc1052baa 50 (fmtData.nChannels != 2) ||
MikamiUitOpen 16:299cc1052baa 51 (fmtData.nSamplesPerSec != AUDIO_FREQUENCY_44K) ||
MikamiUitOpen 0:d310bb78455d 52 (fmtData.wBitsPerSample != 16)
MikamiUitOpen 0:d310bb78455d 53 ) return false;
MikamiUitOpen 0:d310bb78455d 54
phungductung 18:6631cd0fbbcd 55 // Tìm dữ liệu
MikamiUitOpen 0:d310bb78455d 56 char dataId[5];
MikamiUitOpen 0:d310bb78455d 57 dataId[4] = 0;
MikamiUitOpen 0:d310bb78455d 58 fread(dataId, 1, 4, fp_);
MikamiUitOpen 0:d310bb78455d 59 if ("data" != (string)dataId)
MikamiUitOpen 0:d310bb78455d 60 for (int n=0; n<100; n++)
MikamiUitOpen 0:d310bb78455d 61 {
MikamiUitOpen 0:d310bb78455d 62 char oneByte;
MikamiUitOpen 0:d310bb78455d 63 fread(&oneByte, 1, 1, fp_);
MikamiUitOpen 0:d310bb78455d 64 for (int k=0; k<3; k++)
MikamiUitOpen 0:d310bb78455d 65 dataId[k] = dataId[k+1];
MikamiUitOpen 0:d310bb78455d 66 dataId[3] = oneByte;
MikamiUitOpen 0:d310bb78455d 67 if ("data" == (string)dataId) break;
MikamiUitOpen 0:d310bb78455d 68
MikamiUitOpen 0:d310bb78455d 69 if (n == 99) return false;
MikamiUitOpen 0:d310bb78455d 70 }
MikamiUitOpen 0:d310bb78455d 71
phungductung 18:6631cd0fbbcd 72 // Nhận kích thước dữ liệu (byte)
MikamiUitOpen 0:d310bb78455d 73 int32_t sizeByte;
MikamiUitOpen 0:d310bb78455d 74 fread(&sizeByte, sizeof(int32_t), 1, fp_);
MikamiUitOpen 0:d310bb78455d 75 size_ = sizeByte/4;
MikamiUitOpen 0:d310bb78455d 76
MikamiUitOpen 0:d310bb78455d 77 ok_ = true;
MikamiUitOpen 0:d310bb78455d 78 return true;
MikamiUitOpen 0:d310bb78455d 79 }
MikamiUitOpen 0:d310bb78455d 80
phungductung 18:6631cd0fbbcd 81 // Nhận dữ liệu âm thanh nổi từ tập tin
MikamiUitOpen 0:d310bb78455d 82 void SD_WavReader::ReadStereo(Array<int16_t>& dataL,
MikamiUitOpen 0:d310bb78455d 83 Array<int16_t>& dataR)
MikamiUitOpen 0:d310bb78455d 84 {
MikamiUitOpen 0:d310bb78455d 85 if (!ok_) ErrorMsg("Get data FAILED");
MikamiUitOpen 0:d310bb78455d 86 uint32_t size = dataL.Length();
MikamiUitOpen 0:d310bb78455d 87 fread(buffer, sizeof(int16_t), size*2, fp_);
MikamiUitOpen 0:d310bb78455d 88 for (int n=0; n<size; n++)
MikamiUitOpen 0:d310bb78455d 89 {
MikamiUitOpen 0:d310bb78455d 90 dataL[n] = buffer[2*n];
MikamiUitOpen 0:d310bb78455d 91 dataR[n] = buffer[2*n+1];
MikamiUitOpen 0:d310bb78455d 92 }
MikamiUitOpen 0:d310bb78455d 93 }
MikamiUitOpen 0:d310bb78455d 94
phungductung 18:6631cd0fbbcd 95 // Chuyển đổi dữ liệu từ tập tin sang đơn âm
MikamiUitOpen 0:d310bb78455d 96 void SD_WavReader::ReadAndToMono(Array<int16_t>& data)
MikamiUitOpen 0:d310bb78455d 97 {
MikamiUitOpen 0:d310bb78455d 98 if (!ok_) ErrorMsg("Get data FAILED");
MikamiUitOpen 0:d310bb78455d 99 uint32_t size = data.Length();
MikamiUitOpen 0:d310bb78455d 100 fread(buffer, sizeof(int16_t), size*2, fp_);
MikamiUitOpen 0:d310bb78455d 101 for (int n=0; n<size; n++)
MikamiUitOpen 0:d310bb78455d 102 data[n] = (buffer[2*n] + buffer[2*n+1])/2;
MikamiUitOpen 0:d310bb78455d 103 }
MikamiUitOpen 0:d310bb78455d 104
phungductung 18:6631cd0fbbcd 105 // Thu thập kích thước dữ liệu (số điểm lấy mẫu)
MikamiUitOpen 0:d310bb78455d 106 int32_t SD_WavReader::GetSize()
MikamiUitOpen 0:d310bb78455d 107 {
MikamiUitOpen 0:d310bb78455d 108 if (!ok_) ErrorMsg("Get data size FAILED");
MikamiUitOpen 0:d310bb78455d 109 return size_;
MikamiUitOpen 0:d310bb78455d 110 }
MikamiUitOpen 0:d310bb78455d 111 }