Ejemplo n.º 1
0
        private static void EncodeV4(Id3TagInfo tagInfo, TagContainer container)
        {
            TagDescriptorV4 descriptor = container.GetId3V24Descriptor();

            tagInfo.Experimental = descriptor.ExperimentalIndicator;
            tagInfo.ExtendedHeaderAvailable = descriptor.ExtendedHeader;
            tagInfo.Unsynchronised = descriptor.Unsynchronisation;
            tagInfo.HasFooter = descriptor.Footer;

            if (descriptor.ExtendedHeader)
            {
                tagInfo.ExtendedHeader = ExtendedTagHeaderV4.Create(descriptor.UpdateTag, descriptor.CrcDataPresent,
                                                                    descriptor.RestrictionPresent,
                                                                    descriptor.Restriction, descriptor.Crc);
            }
        }
Ejemplo n.º 2
0
        private byte[] BuildId3V4Tag(TagContainer tagContainer)
        {
            byte[] tagBytes;
            var tag = tagContainer.GetId3V24Descriptor();

            var frameBytes = GetFrameBytes(tagContainer);
            //TODO: Implement CRC32 code here...

            var extendedHeaderBytes = GetExtendedHeaderV4(tag);
            var tagHeader = GetTagHeader(tagContainer);
            //TODO: Implement Unsync Code...

            tagBytes = BuildFinalTag(tagHeader, extendedHeaderBytes, frameBytes, 0,tag.Footer);
            return tagBytes;
        }
Ejemplo n.º 3
0
        private static byte[] GetTagHeader(TagContainer tagContainer)
        {
            var tagHeader = new byte[10];
            tagHeader[0] = 0x49;
            tagHeader[1] = 0x44;
            tagHeader[2] = 0x33;

            switch (tagContainer.TagVersion)
            {
                case TagVersion.Id3V23:
                    var descriptorV3 = tagContainer.GetId3V23Descriptor();
                    tagHeader[3] = 0x03;
                    tagHeader[4] = 0x00;

                    if (descriptorV3.Unsynchronisation)
                    {
                        tagHeader[5] |= 0x80;
                    }

                    if (descriptorV3.ExtendedHeader)
                    {
                        tagHeader[5] |= 0x40;
                    }

                    if (descriptorV3.ExperimentalIndicator)
                    {
                        tagHeader[5] |= 0x20;
                    }
                    break;

                case TagVersion.Id3V24:
                    var descriptorV4 = tagContainer.GetId3V24Descriptor();
                    tagHeader[3] = 0x04;
                    tagHeader[4] = 0x00;

                    if (descriptorV4.Unsynchronisation)
                    {
                        tagHeader[5] |= 0x80;
                    }

                    if (descriptorV4.ExtendedHeader)
                    {
                        tagHeader[5] |= 0x40;
                    }

                    if (descriptorV4.ExperimentalIndicator)
                    {
                        tagHeader[5] |= 0x20;
                    }

                    if (descriptorV4.Footer)
                    {
                        tagHeader[5] |= 0x10;
                    }

                    break;
                default:
                    throw new ID3TagException("Unknown version!");
            }

            return tagHeader;
        }
Ejemplo n.º 4
0
        public void Write(TagContainer tagContainer, Stream input, Stream output)
        {
            if (input == null)
            {
                throw new ArgumentNullException("input");
            }
            if (output == null)
            {
                throw new ArgumentNullException("output");
            }
            if (tagContainer == null)
            {
                throw new ArgumentNullException("tagContainer");
            }

            //
            //  Validate whether the tag container is in ID3V2.3 formaz
            //
            string message;
            var isTagValid = ValidateTag(tagContainer, out message);
            if (!isTagValid)
            {
                throw new InvalidID3StructureException(message);
            }

            //
            //  OK. ID3Tag is valid. Let's write the tag.
            //
            byte[] tagBytes;
            switch (tagContainer.TagVersion)
            { 
                case TagVersion.Id3V23:
                    tagBytes = BuildId3V3Tag(tagContainer);
                    break;
                case TagVersion.Id3V24:
                    tagBytes = BuildId3V4Tag(tagContainer);
                    break;
                default:
                    throw new ID3TagException("This TagVersion is not supported!");
            }

            //
            //  encode the length
            //
            long length;
            if (tagContainer.TagVersion == TagVersion.Id3V24)
            {
                var descriptor = tagContainer.GetId3V24Descriptor();
                if (descriptor.Footer)
                {
                    length = tagBytes.LongLength - 20;
                }
                else
                {
                    length = tagBytes.LongLength - 10;
                }
            }
            else
            {
                length = tagBytes.LongLength - 10;
            }

            var bits = GetBitCoding(length);
            var lengthBytes = new byte[4];

            EncodeLength(bits, lengthBytes);
            Array.Copy(lengthBytes, 0, tagBytes, 6, 4);

            //
            //  Build the tag bytes and start writing.
            //
            if (!input.CanRead)
            {
                throw new ID3IOException("Cannot read input stream");
            }
            if (!output.CanWrite)
            {
                throw new ID3IOException("Cannot write to output stream");
            }

            WriteToStream(input, output, tagBytes);
        }