revised version of F746_SD_GraphicEqualizer
Dependencies: BSP_DISCO_F746NG F746_GUI F746_SAI_IO FrequencyResponseDrawer LCD_DISCO_F746NG SDFileSystem_Warning_Fixed TS_DISCO_F746NG mbed
Fork of F746_SD_GraphicEqualizer by
MyClasses_Functions/SD_WavReader.cpp@12:87f6955b5a80, 2016-07-07 (annotated)
- Committer:
- edamame22
- Date:
- Thu Jul 07 05:58:52 2016 +0000
- Revision:
- 12:87f6955b5a80
- Parent:
- 10:fc6367c2ffcf
added highlighted line for track selection
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MikamiUitOpen | 0:e953eb392151 | 1 | //-------------------------------------------------------------- |
MikamiUitOpen | 0:e953eb392151 | 2 | // SD_WavReader class |
MikamiUitOpen | 0:e953eb392151 | 3 | // SD カードの *.wav ファイルの内容を読み出す |
MikamiUitOpen | 0:e953eb392151 | 4 | // 以下のフォーマット以外は扱わない |
MikamiUitOpen | 0:e953eb392151 | 5 | // PCM,16 ビットステレオ,標本化周波数 44.1 kHz |
MikamiUitOpen | 0:e953eb392151 | 6 | // |
MikamiUitOpen | 0:e953eb392151 | 7 | // 2016/04/19, Copyright (c) 2016 MIKAMI, Naoki |
MikamiUitOpen | 0:e953eb392151 | 8 | //-------------------------------------------------------------- |
MikamiUitOpen | 0:e953eb392151 | 9 | |
MikamiUitOpen | 0:e953eb392151 | 10 | #include "SD_WavReader.hpp" |
MikamiUitOpen | 0:e953eb392151 | 11 | |
MikamiUitOpen | 0:e953eb392151 | 12 | namespace Mikami |
MikamiUitOpen | 0:e953eb392151 | 13 | { |
MikamiUitOpen | 0:e953eb392151 | 14 | SD_WavReader::SD_WavReader(int32_t bufferSize) |
MikamiUitOpen | 0:e953eb392151 | 15 | : STR_("sd"), ok_(false) |
MikamiUitOpen | 0:e953eb392151 | 16 | { |
MikamiUitOpen | 0:e953eb392151 | 17 | sd_ = new SDFileSystem(STR_.c_str()); |
MikamiUitOpen | 0:e953eb392151 | 18 | sd_->mount(); |
MikamiUitOpen | 0:e953eb392151 | 19 | |
MikamiUitOpen | 0:e953eb392151 | 20 | buffer = new int16_t[bufferSize*2]; |
MikamiUitOpen | 0:e953eb392151 | 21 | } |
MikamiUitOpen | 0:e953eb392151 | 22 | |
MikamiUitOpen | 0:e953eb392151 | 23 | SD_WavReader::~SD_WavReader() |
MikamiUitOpen | 0:e953eb392151 | 24 | { |
MikamiUitOpen | 0:e953eb392151 | 25 | delete[] buffer; |
MikamiUitOpen | 0:e953eb392151 | 26 | sd_->unmount(); |
MikamiUitOpen | 0:e953eb392151 | 27 | delete sd_; |
MikamiUitOpen | 0:e953eb392151 | 28 | } |
MikamiUitOpen | 0:e953eb392151 | 29 | |
MikamiUitOpen | 0:e953eb392151 | 30 | void SD_WavReader::Open(const string fileName) |
MikamiUitOpen | 0:e953eb392151 | 31 | { |
MikamiUitOpen | 0:e953eb392151 | 32 | string name = (string)"/" + STR_ + "/" + fileName; |
MikamiUitOpen | 0:e953eb392151 | 33 | fp_ = fopen(name.c_str(), "rb"); |
MikamiUitOpen | 0:e953eb392151 | 34 | if (fp_ == NULL) ErrorMsg("open error!!"); |
MikamiUitOpen | 0:e953eb392151 | 35 | } |
MikamiUitOpen | 0:e953eb392151 | 36 | |
MikamiUitOpen | 0:e953eb392151 | 37 | |
MikamiUitOpen | 0:e953eb392151 | 38 | // ファイルのヘッダ (RIFFxxxxWAVEfm ) 読み込み |
MikamiUitOpen | 0:e953eb392151 | 39 | // 戻り値: *.wav で,16 ビットステレオ, |
MikamiUitOpen | 0:e953eb392151 | 40 | // 標本化周波数:44.1 kHz の場合 true |
MikamiUitOpen | 0:e953eb392151 | 41 | bool SD_WavReader::IsWavFile() |
MikamiUitOpen | 0:e953eb392151 | 42 | { |
MikamiUitOpen | 0:e953eb392151 | 43 | char data[17]; |
MikamiUitOpen | 0:e953eb392151 | 44 | fread(data, 1, 16, fp_); |
MikamiUitOpen | 0:e953eb392151 | 45 | string strRead = ""; |
MikamiUitOpen | 0:e953eb392151 | 46 | for (int n=0; n<4; n++) strRead += data[n]; |
MikamiUitOpen | 0:e953eb392151 | 47 | for (int n=8; n<16; n++) strRead += data[n]; |
MikamiUitOpen | 0:e953eb392151 | 48 | |
MikamiUitOpen | 0:e953eb392151 | 49 | // "RIFF", "WAVE", "fmt " が存在することを確認 |
MikamiUitOpen | 0:e953eb392151 | 50 | if (strRead != "RIFFWAVEfmt ") return false; |
edamame22 | 10:fc6367c2ffcf | 51 | /**{ |
edamame22 | 10:fc6367c2ffcf | 52 | char dump[500]; strcpy(dump, strRead.c_str()); |
edamame22 | 10:fc6367c2ffcf | 53 | ren_Msg1(4, dump); |
edamame22 | 10:fc6367c2ffcf | 54 | }**/ |
MikamiUitOpen | 0:e953eb392151 | 55 | // fmt chunck のサイズを取得 |
MikamiUitOpen | 0:e953eb392151 | 56 | uint32_t fmtChunkSize; |
MikamiUitOpen | 0:e953eb392151 | 57 | fread(&fmtChunkSize, sizeof(uint32_t), 1, fp_); |
MikamiUitOpen | 0:e953eb392151 | 58 | |
MikamiUitOpen | 0:e953eb392151 | 59 | // PCM, Stereo, 44.1 kHz, 16 bit であることを確認 |
MikamiUitOpen | 0:e953eb392151 | 60 | WaveFormatEx fmtData; |
MikamiUitOpen | 0:e953eb392151 | 61 | fread(&fmtData, fmtChunkSize, 1, fp_); |
edamame22 | 10:fc6367c2ffcf | 62 | |
MikamiUitOpen | 0:e953eb392151 | 63 | if ((fmtData.wFormatTag != 1) || |
MikamiUitOpen | 0:e953eb392151 | 64 | (fmtData.nChannels != 2) || |
MikamiUitOpen | 0:e953eb392151 | 65 | (fmtData.nSamplesPerSec != 44100) || |
MikamiUitOpen | 0:e953eb392151 | 66 | (fmtData.wBitsPerSample != 16) |
edamame22 | 10:fc6367c2ffcf | 67 | ) |
edamame22 | 10:fc6367c2ffcf | 68 | return false; |
edamame22 | 10:fc6367c2ffcf | 69 | /**{ |
edamame22 | 10:fc6367c2ffcf | 70 | char dump[500]; |
edamame22 | 10:fc6367c2ffcf | 71 | sprintf(dump, "wFormatTag: %d", fmtData.wFormatTag); |
edamame22 | 10:fc6367c2ffcf | 72 | ren_Msg1(1, dump); |
edamame22 | 10:fc6367c2ffcf | 73 | sprintf(dump, "nChannels: %d", fmtData.nChannels); |
edamame22 | 10:fc6367c2ffcf | 74 | ren_Msg1(2, dump); |
edamame22 | 10:fc6367c2ffcf | 75 | sprintf(dump, "nSamplesPerSec: %d", fmtData.nSamplesPerSec); |
edamame22 | 10:fc6367c2ffcf | 76 | ren_Msg1(3, dump); |
edamame22 | 10:fc6367c2ffcf | 77 | sprintf(dump, "wBitsPerSample: %d", fmtData.wBitsPerSample); |
edamame22 | 10:fc6367c2ffcf | 78 | ren_Msg1(4, dump); |
edamame22 | 10:fc6367c2ffcf | 79 | }**/ |
MikamiUitOpen | 0:e953eb392151 | 80 | // data chunk を探す |
MikamiUitOpen | 0:e953eb392151 | 81 | char dataId[5]; |
MikamiUitOpen | 0:e953eb392151 | 82 | dataId[4] = 0; |
MikamiUitOpen | 0:e953eb392151 | 83 | fread(dataId, 1, 4, fp_); |
edamame22 | 10:fc6367c2ffcf | 84 | /**{ |
edamame22 | 10:fc6367c2ffcf | 85 | char dump[500]; |
edamame22 | 10:fc6367c2ffcf | 86 | sprintf(dump, "dataId: %s", dataId); |
edamame22 | 10:fc6367c2ffcf | 87 | ren_Msg1(5, dump); wait(20.0f); |
edamame22 | 10:fc6367c2ffcf | 88 | }**/ |
MikamiUitOpen | 0:e953eb392151 | 89 | if ("data" != (string)dataId) |
edamame22 | 10:fc6367c2ffcf | 90 | for (int n=0; n<1000; n++) |
MikamiUitOpen | 0:e953eb392151 | 91 | { |
MikamiUitOpen | 0:e953eb392151 | 92 | char oneByte; |
MikamiUitOpen | 0:e953eb392151 | 93 | fread(&oneByte, 1, 1, fp_); |
MikamiUitOpen | 0:e953eb392151 | 94 | for (int k=0; k<3; k++) |
MikamiUitOpen | 0:e953eb392151 | 95 | dataId[k] = dataId[k+1]; |
MikamiUitOpen | 0:e953eb392151 | 96 | dataId[3] = oneByte; |
MikamiUitOpen | 0:e953eb392151 | 97 | if ("data" == (string)dataId) break; |
MikamiUitOpen | 0:e953eb392151 | 98 | |
edamame22 | 10:fc6367c2ffcf | 99 | if (n == 999) return false; |
MikamiUitOpen | 0:e953eb392151 | 100 | } |
MikamiUitOpen | 0:e953eb392151 | 101 | |
MikamiUitOpen | 0:e953eb392151 | 102 | // データサイズ (byte) を取得 |
MikamiUitOpen | 0:e953eb392151 | 103 | int32_t sizeByte; |
MikamiUitOpen | 0:e953eb392151 | 104 | fread(&sizeByte, sizeof(int32_t), 1, fp_); |
MikamiUitOpen | 0:e953eb392151 | 105 | size_ = sizeByte/4; |
MikamiUitOpen | 0:e953eb392151 | 106 | |
MikamiUitOpen | 0:e953eb392151 | 107 | ok_ = true; |
MikamiUitOpen | 0:e953eb392151 | 108 | return true; |
MikamiUitOpen | 0:e953eb392151 | 109 | } |
MikamiUitOpen | 0:e953eb392151 | 110 | |
MikamiUitOpen | 0:e953eb392151 | 111 | // ファイルからデータの取得 |
MikamiUitOpen | 0:e953eb392151 | 112 | void SD_WavReader::Read(int16_t data[], uint32_t size) |
MikamiUitOpen | 0:e953eb392151 | 113 | { |
MikamiUitOpen | 0:e953eb392151 | 114 | if (!ok_) ErrorMsg("Get data FAILED"); |
MikamiUitOpen | 0:e953eb392151 | 115 | fread(data, sizeof(int16_t), size, fp_); |
MikamiUitOpen | 0:e953eb392151 | 116 | } |
MikamiUitOpen | 0:e953eb392151 | 117 | |
MikamiUitOpen | 0:e953eb392151 | 118 | // ファイルからデータをモノラルに変換しての取得 |
MikamiUitOpen | 0:e953eb392151 | 119 | void SD_WavReader::ReadAndToMono(int16_t data[], uint32_t size) |
MikamiUitOpen | 0:e953eb392151 | 120 | { |
MikamiUitOpen | 0:e953eb392151 | 121 | if (!ok_) ErrorMsg("Get data FAILED"); |
MikamiUitOpen | 0:e953eb392151 | 122 | fread(buffer, sizeof(int16_t), size*2, fp_); |
MikamiUitOpen | 0:e953eb392151 | 123 | for (int n=0; n<size; n++) |
MikamiUitOpen | 0:e953eb392151 | 124 | data[n] = (buffer[2*n] + buffer[2*n+1])/2; |
MikamiUitOpen | 0:e953eb392151 | 125 | } |
MikamiUitOpen | 0:e953eb392151 | 126 | |
MikamiUitOpen | 0:e953eb392151 | 127 | // データサイズ(標本化点の数)の取得 |
MikamiUitOpen | 0:e953eb392151 | 128 | int32_t SD_WavReader::GetSize() |
MikamiUitOpen | 0:e953eb392151 | 129 | { |
MikamiUitOpen | 0:e953eb392151 | 130 | if (!ok_) ErrorMsg("Get data size FAILED"); |
MikamiUitOpen | 0:e953eb392151 | 131 | return size_; |
MikamiUitOpen | 0:e953eb392151 | 132 | } |
MikamiUitOpen | 0:e953eb392151 | 133 | } |