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); } }
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); }
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); } }
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"])); } }
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); }