protected override int write(TagData tag, BinaryWriter w, string zone) { long counterPos; uint counter = 0; string vendor; if (AdditionalFields.ContainsKey(VENDOR_METADATA_ID)) { vendor = AdditionalFields[VENDOR_METADATA_ID]; } else { // Even when no existing field, vendor field is mandatory in OGG structure // => a file with no vendor is a FLAC file vendor = VENDOR_DEFAULT_FLAC; } w.Write((uint)vendor.Length); w.Write(Encoding.UTF8.GetBytes(vendor)); counterPos = w.BaseStream.Position; w.Write((uint)0); // Tag counter placeholder to be rewritten in a few lines counter = writeFrames(tag, w); if (writeMetadataFramingBit) { w.Write((byte)1); // Framing bit (mandatory for OGG container) } // PADDING MANAGEMENT // Write the remaining padding bytes, if any detected during initial reading if (managePadding) { long paddingSizeToWrite; if (tag.PaddingSize > -1) { paddingSizeToWrite = tag.PaddingSize; } else { paddingSizeToWrite = TrackUtils.ComputePaddingSize(initialPaddingOffset, initialPaddingSize, initialPaddingOffset, w.BaseStream.Position); } if (paddingSizeToWrite > 0) { for (int i = 0; i < paddingSizeToWrite; i++) { w.Write((byte)0); } } } long finalPos = w.BaseStream.Position; w.BaseStream.Seek(counterPos, SeekOrigin.Begin); w.Write(counter); w.BaseStream.Seek(finalPos, SeekOrigin.Begin); return((int)counter); }
private WriteResult writePaddingBlock(BinaryWriter w, long cumulativeDelta) { long paddingSizeToWrite = TrackUtils.ComputePaddingSize(initialPaddingOffset, initialPaddingSize, -cumulativeDelta); if (paddingSizeToWrite > 0) { w.Write(META_PADDING); w.Write(StreamUtils.EncodeBEUInt24((uint)paddingSizeToWrite)); for (int i = 0; i < paddingSizeToWrite; i++) { w.Write((byte)0); } return(new WriteResult(WriteMode.REPLACE, 1)); } else { return(new WriteResult(WriteMode.REPLACE, 0)); } }