Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: SDFileSystem_Warning_Fixed
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_;
+ }
+}