Пример #1
0
        private static void write(Chunk chunk, StreamAccessor accessor)
        {
            accessor.Write(chunk.name, EncodingType.CC4);
            StreamAccessor ac2  = new StreamAccessor(accessor.WriteSubStream(4));
            long           pos0 = accessor.Position;

            // 内容
            if (chunk.content != null)
            {
                if (chunk.content is byte[])
                {
                    accessor.Write((byte[])chunk.content);
                }
                else if (chunk.content is System.IO.Stream)
                {
                    accessor.WriteStream((System.IO.Stream)chunk.content);
                }
                else
                {
                    RiffChunkReadWriteAttribute.Write(chunk.content, accessor);
                }
            }
            else if (chunk._data != null)
            {
                accessor.Write(chunk._data);
            }
            else if (chunk._stream != null)
            {
                accessor.WriteStream(chunk.Stream);
            }

            ac2.Write(checked ((uint)(accessor.Position - pos0)), EncodingType.U4);
            ac2.Stream.Close();
        }
Пример #2
0
        public static void WriteToStream(Tag value, StreamAccessor accessor, out System.Action <long> SetSize)
        {
            long           pos_size;
            Stream         stream    = new MemoryStream();
            StreamAccessor accessor2 = new StreamAccessor(stream);
            StreamAccessor accessor3 = null;
            long           start     = 0L;

            if (value.has_ext)
            {
                value.WriteExtHeader(accessor2, out accessor3);
                start = stream.Position;
            }
            foreach (Frame frame in value.frames.Values)
            {
                accessor2.WriteAs <Frame>(frame);
            }
            if (value.has_ext)
            {
                long length = stream.Position - start;
                accessor3.Write(ID3Utils.CalculateCRC32(stream, start, length), EncodingType.U4BE);
                accessor3.Stream.Close();
            }
            bool unsync = ID3Utils.ID3RequiredUnsync(stream);

            if (unsync)
            {
                Stream stream2 = ID3Utils.ID3Unsynchronize(stream);
                stream.Close();
                stream = stream2;
            }
            value.WriteTagHeader(accessor, unsync, out pos_size);
            SetSize = delegate(long size){
                if (size > StreamAccessor.MaxUInt28)
                {
                    throw new System.ArgumentOutOfRangeException("Tag の情報量が多すぎて保存できません。Tag の内容は 256MB より小さくなる様にして下さい");
                }
                accessor.PushPosition(pos_size);
                accessor.Write((uint)size, EncodingType.UInt28BE);
                accessor.PopPosition();
            };
            accessor.WriteStream(stream);
        }