示例#1
0
        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();
        }