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;
}