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