static void UpdateMetadata(NativeMetadataIterator iterator, NativeVorbisCommentBlock newComments, NativePictureBlock newPicture) { Contract.Requires(iterator != null); Contract.Requires(newComments != null); var metadataInserted = false; var pictureInserted = false; do { switch ((MetadataType)Marshal.ReadInt32(iterator.GetBlock())) { // Replace the existing Vorbis comment: case MetadataType.VorbisComment: if (!iterator.DeleteBlock(false)) { throw new IOException(Resources.MetadataEncoderDeleteError); } if (!iterator.InsertBlockAfter(newComments.Handle)) { throw new IOException(Resources.MetadataEncoderInsertBlockError); } metadataInserted = true; break; // Replace the existing Picture block: case MetadataType.Picture: if (!iterator.DeleteBlock(false)) { throw new IOException(Resources.MetadataEncoderDeleteError); } if (newPicture != null && !iterator.InsertBlockAfter(newPicture.Handle)) { throw new IOException(Resources.MetadataEncoderInsertBlockError); } pictureInserted = true; break; // Delete any padding: case MetadataType.Padding: if (!iterator.DeleteBlock(false)) { throw new IOException(Resources.MetadataEncoderDeleteError); } break; } } while (iterator.Next()); // If there was no existing metadata block to replace, insert it now: if (!metadataInserted && !iterator.InsertBlockAfter(newComments.Handle)) { throw new IOException(Resources.MetadataEncoderInsertBlockError); } // If there was no existing picture block to replace, and a new one is available, insert it now: if (newPicture != null && !pictureInserted && !iterator.InsertBlockAfter(newPicture.Handle)) { throw new IOException(Resources.MetadataEncoderInsertBlockError); } newComments.ReleaseHandleOwnership(); newPicture?.ReleaseHandleOwnership(); }