private static new RiffFile read(StreamAccessor accessor) { if ("RIFF" != accessor.ReadString(EncodingType.CC4)) { throw new System.ApplicationException("指定したデータは RIFF データではありません。"); } RiffFile ret = new RiffFile(); uint size = accessor.ReadUInt32(EncodingType.U4); ret.type = accessor.ReadString(EncodingType.CC4); ret.chunks = new Gen::List <Chunk>(); StreamAccessor acChunks = new StreamAccessor(accessor.ReadSubStream(size - 4)); try{ while (acChunks.RestLength > 0) { ret.chunks.Add(acChunks.Read <Chunk>()); } }finally{ acChunks.Stream.Close(); } return(ret); }
/// <summary> /// Stream から RIFF データを読み取る為の RiffFile を作成します。 /// </summary> /// <param name="stream">RIFF データの読み取り元となる Stream を指定します。</param> /// <param name="closestream"> /// ここで作成した RiffFile が閉じられた時 (Close を呼び出された時) に、 /// 元になった Stream <paramref name="stream"/> を閉じる場合に true を指定します。 /// Stream を共有している場合など勝手に閉じない場合には false を指定します。</param> /// <returns>作成した RiffFile インスタンスを返します。</returns> public static RiffFile FromStream(System.IO.Stream stream, bool closestream) { RiffFile r = read(new StreamAccessor(stream)); if (closestream) { r.filestream = stream; } return(r); }
private static void write(RiffFile value, StreamAccessor accessor) { accessor.Write("RIFF", EncodingType.CC4); StreamAccessor acSize = new StreamAccessor(accessor.WriteSubStream(4)); long pos0 = accessor.Position; accessor.Write(value.type, EncodingType.CC4); foreach (Chunk chunk in value.chunks) { accessor.Write(chunk, EncodingType.NoSpecified); } uint size = checked ((uint)(accessor.Position - pos0)); acSize.Write(size, EncodingType.U4); acSize.Stream.Close(); }
public RiffWriter(string filetype) { this.file = new RiffFile(filetype); }