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

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers SD_WavReader.cpp Source File

SD_WavReader.cpp

00001 //--------------------------------------------------------------
00002 //  SD_WavReader class
00003 //      SD カードの *.wav ファイルの内容を読み出す
00004 //      以下のフォーマット以外は扱わない
00005 //          PCM,16 ビットステレオ,標本化周波数 44.1 kHz
00006 //
00007 //  2016/04/19, Copyright (c) 2016 MIKAMI, Naoki
00008 //--------------------------------------------------------------
00009 
00010 #include "SD_WavReader.hpp"
00011 
00012 namespace Mikami
00013 {
00014     SD_WavReader::SD_WavReader(int32_t bufferSize)
00015         : STR_("sd"), ok_(false)
00016     {
00017         sd_ = new SDFileSystem(STR_.c_str());
00018         sd_->mount();
00019         
00020         buffer = new int16_t[bufferSize*2];
00021     }
00022 
00023     SD_WavReader::~SD_WavReader()
00024     {
00025         delete[] buffer;
00026         sd_->unmount();
00027         delete sd_;
00028     }
00029     
00030     void SD_WavReader::Open(const string fileName)
00031     {
00032         string name = (string)"/" + STR_ + "/" + fileName;
00033         fp_ = fopen(name.c_str(), "rb");
00034         if (fp_ == NULL) ErrorMsg("open error!!");
00035     }
00036     
00037     
00038     // ファイルのヘッダ (RIFFxxxxWAVEfm ) 読み込み
00039     //      戻り値: *.wav で,16 ビットステレオ,
00040     //             標本化周波数:44.1 kHz の場合 true
00041     bool SD_WavReader::IsWavFile()
00042     {
00043         char data[17];
00044         fread(data, 1, 16, fp_);
00045         string strRead = "";
00046         for (int n=0; n<4; n++) strRead += data[n];
00047         for (int n=8; n<16; n++) strRead += data[n];
00048 
00049         // "RIFF", "WAVE", "fmt " が存在することを確認
00050         if (strRead != "RIFFWAVEfmt ") return false;
00051 /**{
00052  char dump[500]; strcpy(dump, strRead.c_str());
00053 ren_Msg1(4, dump);
00054 }**/
00055         // fmt chunck のサイズを取得
00056         uint32_t fmtChunkSize;
00057         fread(&fmtChunkSize, sizeof(uint32_t), 1, fp_);
00058 
00059         // PCM, Stereo, 44.1 kHz, 16 bit であることを確認
00060         WaveFormatEx fmtData;
00061         fread(&fmtData, fmtChunkSize, 1, fp_);
00062 
00063         if ((fmtData.wFormatTag     != 1)     ||
00064             (fmtData.nChannels      != 2)     ||
00065             (fmtData.nSamplesPerSec != 44100) ||
00066             (fmtData.wBitsPerSample != 16)
00067            )
00068            return false;
00069 /**{
00070     char dump[500];
00071 sprintf(dump, "wFormatTag: %d", fmtData.wFormatTag);
00072 ren_Msg1(1, dump);
00073 sprintf(dump, "nChannels: %d", fmtData.nChannels);
00074 ren_Msg1(2, dump);
00075 sprintf(dump, "nSamplesPerSec: %d", fmtData.nSamplesPerSec);
00076 ren_Msg1(3, dump);
00077 sprintf(dump, "wBitsPerSample: %d", fmtData.wBitsPerSample);
00078 ren_Msg1(4, dump); 
00079 }**/
00080         // data chunk を探す
00081         char dataId[5];
00082         dataId[4] = 0;
00083         fread(dataId, 1, 4, fp_);
00084 /**{
00085     char dump[500];
00086 sprintf(dump, "dataId: %s", dataId);
00087 ren_Msg1(5, dump); wait(20.0f);
00088 }**/
00089         if ("data" != (string)dataId)
00090             for (int n=0; n<1000; n++)
00091             {
00092                 char oneByte;
00093                 fread(&oneByte, 1, 1, fp_);
00094                 for (int k=0; k<3; k++)
00095                     dataId[k] = dataId[k+1];
00096                 dataId[3] = oneByte;
00097                 if ("data" == (string)dataId) break;
00098                 
00099                 if (n == 999) return false;
00100             }
00101 
00102         // データサイズ (byte) を取得
00103         int32_t sizeByte;
00104         fread(&sizeByte, sizeof(int32_t), 1, fp_);
00105         size_ = sizeByte/4;
00106 
00107         ok_ = true;
00108         return true;
00109     }
00110 
00111     // ファイルからデータの取得
00112     void SD_WavReader::Read(int16_t data[], uint32_t size)
00113     {
00114         if (!ok_) ErrorMsg("Get data FAILED");
00115         fread(data, sizeof(int16_t), size, fp_);
00116     }        
00117 
00118     // ファイルからデータをモノラルに変換しての取得
00119     void SD_WavReader::ReadAndToMono(int16_t data[], uint32_t size)
00120     {
00121         if (!ok_) ErrorMsg("Get data FAILED");
00122         fread(buffer, sizeof(int16_t), size*2, fp_);
00123         for (int n=0; n<size; n++)
00124             data[n] = (buffer[2*n] + buffer[2*n+1])/2;
00125     }        
00126     
00127     // データサイズ(標本化点の数)の取得
00128     int32_t SD_WavReader::GetSize()
00129     {
00130         if (!ok_) ErrorMsg("Get data size FAILED");
00131         return size_;
00132     }
00133 }