public static ReadHeader ( |
||
reader | 読み出し元のストリーム | |
리턴 |
public static FormatHeader ReadHeader(BinaryReader reader)
{
byte[] buf;
buf= reader.ReadBytes(4);
if(!Util.Equal(buf, Util.RIFF))
{
throw new WaveException("このファイルはRIFF形式ではありません。");
}
reader.ReadBytes(4); //ファイルサイズ読み飛ばし。
buf= reader.ReadBytes(4);
if(!Util.Equal(buf, Util.WAVE))
{
throw new WaveException("このファイルはwave形式ではありません。");
}
// fmt chunk 読み出し
FormatHeader header;
while(true)
{
buf = reader.ReadBytes(4);
int length = reader.ReadInt32();
byte[] data = reader.ReadBytes(length);
if(length < 16)
{
throw new WaveException("ヘッダ長が短すぎます。");
}
if(Util.Equal(buf, Util.FMT))
{
unsafe
{
fixed(byte* p= data)
{
header = *(FormatHeader*)p;
}
}
break;
}
}
return header;
}
/// <summary> /// Wave ファイルを開く。 /// </summary> /// <param name="reader">Wave ファイルを格納したストリーム</param> public void Open(BinaryReader reader) { if (this.reader != null) { this.reader.Close(); } this.reader = reader; // ヘッダ読み出し this.header = WaveReader.ReadHeader(reader); if (this.header.id != 0x0001) { throw new WaveException("対応していないフォーマットです。"); } // data chunk 読み出し int length = ReadDataChunk(reader); this.dataLength = (uint)(length / this.header.blockSize); } //Open