コード例 #1
0
        public void Initialize(Stream stream, AudioInfo audioInfo, MetadataDictionary metadata, SettingsDictionary settings)
        {
            Contract.Ensures(_encoder != null);

            // Load the external gain filter:
            ExportFactory <ISampleFilter> sampleFilterFactory =
                ExtensionProvider.GetFactories <ISampleFilter>("Name", "ReplayGain").SingleOrDefault();

            if (sampleFilterFactory == null)
            {
                throw new ExtensionInitializationException(Resources.SampleEncoderReplayGainFilterError);
            }
            _replayGainFilterLifetime = sampleFilterFactory.CreateExport();
            _replayGainFilterLifetime.Value.Initialize(metadata, settings);

            // Call the external ID3 encoder:
            ExportFactory <IMetadataEncoder> metadataEncoderFactory =
                ExtensionProvider.GetFactories <IMetadataEncoder>("Extension", EncoderInfo.FileExtension).Single();

            if (metadataEncoderFactory == null)
            {
                throw new ExtensionInitializationException(string.Format(CultureInfo.CurrentCulture,
                                                                         Resources.SampleEncoderMetadataEncoderError, EncoderInfo.FileExtension));
            }
            using (ExportLifetimeContext <IMetadataEncoder> metadataEncoderLifetime = metadataEncoderFactory.CreateExport())
                metadataEncoderLifetime.Value.WriteMetadata(stream, metadata, settings);

            _encoder = InitializeEncoder(audioInfo, stream);
            ConfigureEncoder(settings, _encoder);
            if (_encoder.InitializeParams() != 0)
            {
                throw new IOException(Resources.SampleEncoderFailedToInitialize);
            }
        }
コード例 #2
0
        static void ConfigureEncoderForQuality(SettingsDictionary settings, NativeEncoder encoder)
        {
            Contract.Requires(settings != null);
            Contract.Requires(encoder != null);

            encoder.SetVbr(VbrMode.Mtrh);

            if (!string.IsNullOrEmpty(settings["ForceCBR"]))
            {
                throw new InvalidSettingException(Resources.SampleEncoderUnexpectedForceCBR);
            }

            float vbrQuality;

            if (string.IsNullOrEmpty(settings["VBRQuality"]))
            {
                vbrQuality = 2;
            }
            else if (!float.TryParse(settings["VBRQuality"], out vbrQuality) || vbrQuality < 0 || vbrQuality >= 10)
            {
                throw new InvalidSettingException(string.Format(CultureInfo.CurrentCulture,
                                                                Resources.SampleEncoderBadVBRQuality, settings["VBRQuality"]));
            }

            encoder.SetVbrQuality(vbrQuality);
        }
コード例 #3
0
        static void ConfigureEncoder(SettingsDictionary settings, NativeEncoder encoder)
        {
            Contract.Requires(settings != null);
            Contract.Requires(encoder != null);

            // Set the quality if specified, otherwise select "3":
            uint quality;

            if (string.IsNullOrEmpty(settings["Quality"]))
            {
                quality = 3;
            }
            else if (!uint.TryParse(settings["Quality"], out quality) || quality > 9)
            {
                throw new InvalidSettingException(string.Format(CultureInfo.CurrentCulture,
                                                                Resources.SampleEncoderBadQuality, settings["Quality"]));
            }
            encoder.SetQuality((int)quality);

            // Set a bitrate only if specified. Otherwise, default to a variable bitrate:
            if (!string.IsNullOrEmpty(settings["BitRate"]))
            {
                ConfigureEncoderForBitRate(settings, encoder);
            }
            else
            {
                ConfigureEncoderForQuality(settings, encoder);
            }
        }
コード例 #4
0
        static void ConfigureEncoderForBitRate(SettingsDictionary settings, NativeEncoder encoder)
        {
            Contract.Requires(settings != null);
            Contract.Requires(encoder != null);

            uint bitRate;

            if (!uint.TryParse(settings["BitRate"], out bitRate) || bitRate < 8 || bitRate > 320)
            {
                throw new InvalidSettingException(string.Format(CultureInfo.CurrentCulture,
                                                                Resources.SampleEncoderBadBitRate, settings["BitRate"]));
            }

            // Default to an average bitrate, unless a constant bitrate is specified:
            if (string.IsNullOrEmpty(settings["ForceCBR"]) ||
                string.Compare(settings["ForceCBR"], bool.FalseString, StringComparison.OrdinalIgnoreCase) == 0)
            {
                encoder.SetVbr(VbrMode.Abr);
                encoder.SetMeanBitRate((int)bitRate);
            }
            else if (string.Compare(settings["ForceCBR"], bool.TrueString, StringComparison.OrdinalIgnoreCase) == 0)
            {
                encoder.SetBitRate((int)bitRate);
            }
            else
            {
                throw new InvalidSettingException(string.Format(CultureInfo.CurrentCulture,
                                                                Resources.SampleEncoderBadForceCBR, settings["ForceCBR"]));
            }
        }
コード例 #5
0
        static NativeEncoder InitializeEncoder(AudioInfo audioInfo, Stream output)
        {
            Contract.Requires(audioInfo != null);
            Contract.Requires(output != null);
            Contract.Requires(output.CanWrite);
            Contract.Requires(output.CanSeek);
            Contract.Ensures(Contract.Result <NativeEncoder>() != null);

            var result = new NativeEncoder(output);

            result.SetSampleCount((uint)audioInfo.SampleCount);
            result.SetSampleRate(audioInfo.SampleRate);
            result.SetChannels(audioInfo.Channels);

            return(result);
        }