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_WavReader.cpp@18:6631cd0fbbcd, 2019-06-04 (annotated)
- Committer:
- phungductung
- Date:
- Tue Jun 04 21:35:59 2019 +0000
- Revision:
- 18:6631cd0fbbcd
- Parent:
- 16:299cc1052baa
WAV
Who changed what in which revision?
| User | Revision | Line number | New 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 | } |