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 不韋 呂

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?

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