Пример #1
0
        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);
        }
Пример #2
0
        /// <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);
        }
Пример #3
0
        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();
        }
Пример #4
0
 public RiffWriter(string filetype)
 {
     this.file = new RiffFile(filetype);
 }