
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
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 }
Generated on Wed Jul 13 2022 09:35:21 by
