Library for Skeleton of SD card player. SD カードプレーヤのための骨組みとして使うためのライブラリ.このライブラリを登録した際のプログラム:「F746_SD_Player_Demo」
Dependencies: SDFileSystem_Warning_Fixed
Dependents: F746_SD_Player_Demo F746_SD_VarableFilter F746_SD_GraphicEqualizer F746_MySoundMachine ... more
Diff: SD_WavReader.cpp
- Revision:
- 0:d310bb78455d
- Child:
- 11:c33c711a5712
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SD_WavReader.cpp Mon Aug 15 04:38:45 2016 +0000 @@ -0,0 +1,119 @@ +//-------------------------------------------------------------- +// SD_WavReader class +// SD カードの *.wav ファイルの内容を読み出す +// 以下のフォーマット以外は扱わない +// PCM,16 ビットステレオ,標本化周波数 44.1 kHz +// +// 2016/06/17, Copyright (c) 2016 MIKAMI, Naoki +//-------------------------------------------------------------- + +#include "SD_WavReader.hpp" + +namespace Mikami +{ + SD_WavReader::SD_WavReader(int32_t bufferSize) + : STR_("sd"), ok_(false) + { + sd_ = new SDFileSystem(STR_.c_str()); + sd_->mount(); + buffer.SetSize(bufferSize*2); + } + + SD_WavReader::~SD_WavReader() + { + sd_->unmount(); + delete sd_; + } + + void SD_WavReader::Open(const string fileName) + { + string name = (string)"/" + STR_ + "/" + fileName; + fp_ = fopen(name.c_str(), "rb"); + if (fp_ == NULL) ErrorMsg("open error!!"); + } + + + // ファイルのヘッダ (RIFFxxxxWAVEfm ) 読み込み + // 戻り値: *.wav で,16 ビットステレオ, + // 標本化周波数:44.1 kHz の場合 true + bool SD_WavReader::IsWavFile() + { + char data[17]; + fread(data, 1, 16, fp_); + string strRead = ""; + for (int n=0; n<4; n++) strRead += data[n]; + for (int n=8; n<16; n++) strRead += data[n]; + + // "RIFF", "WAVE", "fmt " が存在することを確認 + if (strRead != "RIFFWAVEfmt ") return false; + + // fmt chunck のサイズを取得 + uint32_t fmtChunkSize; + fread(&fmtChunkSize, sizeof(uint32_t), 1, fp_); + + // PCM, Stereo, 44.1 kHz, 16 bit であることを確認 + WaveFormatEx fmtData; + fread(&fmtData, fmtChunkSize, 1, fp_); + if ((fmtData.wFormatTag != 1) || + (fmtData.nChannels != 2) || + (fmtData.nSamplesPerSec != 44100) || + (fmtData.wBitsPerSample != 16) + ) return false; + + // data chunk を探す + char dataId[5]; + dataId[4] = 0; + fread(dataId, 1, 4, fp_); + if ("data" != (string)dataId) + for (int n=0; n<100; n++) + { + char oneByte; + fread(&oneByte, 1, 1, fp_); + for (int k=0; k<3; k++) + dataId[k] = dataId[k+1]; + dataId[3] = oneByte; + if ("data" == (string)dataId) break; + + if (n == 99) return false; + } + + // データサイズ (byte) を取得 + int32_t sizeByte; + fread(&sizeByte, sizeof(int32_t), 1, fp_); + size_ = sizeByte/4; + + ok_ = true; + return true; + } + + // ファイルからステレオデータの取得 + void SD_WavReader::ReadStereo(Array<int16_t>& dataL, + Array<int16_t>& dataR) + { + if (!ok_) ErrorMsg("Get data FAILED"); + uint32_t size = dataL.Length(); + fread(buffer, sizeof(int16_t), size*2, fp_); + for (int n=0; n<size; n++) + { + dataL[n] = buffer[2*n]; + dataR[n] = buffer[2*n+1]; + } + } + + // ファイルからデータをモノラルに変換しての取得 + void SD_WavReader::ReadAndToMono(Array<int16_t>& data) + { + if (!ok_) ErrorMsg("Get data FAILED"); + uint32_t size = data.Length(); + fread(buffer, sizeof(int16_t), size*2, fp_); + for (int n=0; n<size; n++) + data[n] = (buffer[2*n] + buffer[2*n+1])/2; + } + + // データサイズ(標本化点の数)の取得 + int32_t SD_WavReader::GetSize() + { + if (!ok_) ErrorMsg("Get data size FAILED"); + return size_; + } +}