Example #1
0
        /// <summary>
        /// Saves the metadata, using an available <see cref="IMetadataEncoder"/>. If no extensions are able to write
        /// to this file extension, an <see cref="UnsupportedAudioException"/>
        /// </summary>
        /// <param name="settings">The settings.</param>
        /// <exception cref="UnsupportedAudioException">
        /// No metadata encoders are able to save metadata in the required format.
        /// </exception>
        public void SaveMetadata(SettingsDictionary settings = null)
        {
            if (settings == null)
            {
                settings = new SettingsDictionary();
            }

            using (FileStream fileStream = FileInfo.Open(FileMode.Open, FileAccess.ReadWrite))
            {
                // Ensure the existing metadata has been loaded:
                if (_metadata == null)
                {
                    LoadMetadata(fileStream);
                    fileStream.Position = 0;
                }

                // Try each encoder that supports the file extension:
                foreach (ExportFactory <IMetadataEncoder> encoderFactory in
                         ExtensionProvider.GetFactories <IMetadataEncoder>("Extension", FileInfo.Extension))
                {
                    using (ExportLifetimeContext <IMetadataEncoder> lifetimeContext = encoderFactory.CreateExport())
                    {
                        IMetadataEncoder encoder = lifetimeContext.Value;
                        ValidateSettings(settings, encoder);
                        encoder.WriteMetadata(fileStream, Metadata, settings);

                        return;
                    }
                }
            }

            throw new UnsupportedAudioException(Resources.TaggedAudioFileUnsupportedError);
        }
Example #2
0
        public static void WriteMetadata(this IMetadataEncoder encoder, IBufferWriter <byte> writer, Frame frame)
        {
            var metaLength = encoder.GetLength(frame.Metadata);
            var metaSpan   = writer.GetSpan(metaLength);

            encoder.Write(metaSpan, frame.Metadata);
            writer.Advance(metaLength);
        }
Example #3
0
        static void ValidateSettings(SettingsDictionary settings, IMetadataEncoder encoder)
        {
            Contract.Requires(settings != null);
            Contract.Requires(encoder != null);

            foreach (string unsupportedKey in settings.Keys.Where(setting =>
                                                                  !encoder.EncoderInfo.AvailableSettings.Contains(setting, StringComparer.OrdinalIgnoreCase)))
            {
                throw new ArgumentException(string.Format(CultureInfo.CurrentCulture,
                                                          Resources.TaggedAudioFileSettingsError, unsupportedKey));
            }
        }
Example #4
0
 public PooledFrameEncoderPolicy(IMetadataEncoder metaEncoder) => _metaEncoder = metaEncoder;
 public PooledMessageEncoderPolicy(IMetadataEncoder metaEncoder, IMessageWriter writer)
 {
     _metaEncoder = metaEncoder;
     _writer      = writer;
 }
 protected MessageAsFrameWriter(IMetadataEncoder metaEncoder) =>
Example #7
0
 public MessageEncoderFactory(IMetadataEncoder metaEncoder, IMessageWriter msgWriter)
 {
     _metaEncoder = metaEncoder;
     _msgWriter   = msgWriter;
 }
 public MessageWriter(IMetadataEncoder metaEncoder) : base(metaEncoder)
 {
 }
Example #9
0
 public PooledMessageEncoder(IMessageWriter messageWriter, IMetadataEncoder metadataEncoder)
     : base(messageWriter, metadataEncoder, default)
 {
 }
Example #10
0
 public static ValueTask <FlushResult> WriteFrameAsync(this IMetadataEncoder encoder, PipeWriter writer, Frame frame, CancellationToken token = default)
 {
     encoder.WriteMetadata(writer, frame);
     return(writer.WriteByChunkAsync(frame.Payload, token));
 }
Example #11
0
 public static IFrameEncoder AsFrameEncoder(this IMetadataEncoder encoder, PipeWriter writer,
                                            CancellationToken token = default) => new PipeFrameEncoder(encoder, writer, token);
Example #12
0
 public PipeMessageEncoder(IMessageWriter messageWriter, IMetadataEncoder metadataEncoder, PipeWriter writer,
                           CancellationToken token = default) : base(metadataEncoder, writer, token) =>
Example #13
0
 public DefaultEncoderFactory(IMetadataEncoder encoder) => _encoder = encoder;
Example #14
0
 public PooledFrameEncoder(IMetadataEncoder metadataEncoder)
     : base(metadataEncoder, default)
 {
 }