Пример #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);
            }
        }
        public void Initialize(Stream stream, AudioInfo audioInfo, MetadataDictionary metadata, SettingsDictionary settings)
        {
            _encoder = new NativeVorbisEncoder();
            _output  = stream;

            // 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);

            _oggStream = IntializeOggStream(settings);
            _buffer    = new byte[4096];

            if (!string.IsNullOrEmpty(settings["BitRate"]))
            {
                ConfigureEncoderForBitRate(settings, audioInfo, _encoder);
            }
            else
            {
                ConfigureEncoderForQuality(settings, audioInfo, _encoder);
            }

            WriteHeader(metadata, stream);
        }
Пример #3
0
        public void Initialize(Stream stream, AudioInfo info, AudioMetadata metadata, SettingDictionary settings)
        {
            _stream = stream;

            InitializeReplayGainFilter(info, metadata, settings);

            // Call the external ID3 encoder, if available
            var metadataEncoderFactory =
                ExtensionProvider.GetFactories <IAudioMetadataEncoder>("Extension", FileExtension).FirstOrDefault();

            if (metadataEncoderFactory != null)
            {
                using (var export = metadataEncoderFactory.CreateExport())
                    using (var tempStream = new MemoryStream())
                    {
                        // Buffer the tag in memory
                        export.Value.WriteMetadata(tempStream, metadata, settings);

                        // Pre-allocate the whole stream (estimate worst case of 320kbps, plus the tag)
                        stream.SetLength(0xA000 * (long)info.PlayLength.TotalSeconds + tempStream.Length);

                        // Flush the tag to the output stream
                        tempStream.WriteTo(stream);
                    }
            }

            _encoder = new(stream);
            _encoder.SetChannels(info.Channels);
            _encoder.SetSampleRate(info.SampleRate);
            if (info.FrameCount > 0)
            {
                _encoder.SetSampleCount((uint)info.FrameCount);
            }

            if (settings.TryGetValue("BitRate", out int bitRate))
            {
                // Use ABR, unless ForceCBR is set to true
                if (settings.TryGetValue("ForceCBR", out bool forceCbr) && forceCbr)
                {
                    _encoder.SetBitRate(bitRate);
                }
                else
                {
                    _encoder.SetVbrMeanBitRate(bitRate);
                    _encoder.SetVbrMode(VbrMode.Abr);
                }
            }
            else
            {
                // Use VBR quality 3 if nothing else is specified
                _encoder.SetVbrQuality(
                    settings.TryGetValue("VBRQuality", out int vbrQuality)
                        ? vbrQuality
                        : 3);
                _encoder.SetVbrMode(VbrMode.Mtrh);
            }

            _encoder.InitializeParameters();
        }
Пример #4
0
 protected override void ProcessRecord()
 {
     foreach (ExportFactory <ISampleEncoder> encoderFactory in string.IsNullOrEmpty(Name)
         ? ExtensionProvider.GetFactories <ISampleEncoder>()
         : ExtensionProvider.GetFactories <ISampleEncoder>("Name", Name))
     {
         using (ExportLifetimeContext <ISampleEncoder> encoderLifetime = encoderFactory.CreateExport())
             WriteObject(encoderLifetime.Value.EncoderInfo);
     }
 }
Пример #5
0
 protected override void ProcessRecord()
 {
     foreach (ExportFactory <IMetadataEncoder> factory in string.IsNullOrEmpty(Extension)
         ? ExtensionProvider.GetFactories <IMetadataEncoder>()
         : ExtensionProvider.GetFactories <IMetadataEncoder>("Extension", Extension))
     {
         using (ExportLifetimeContext <IMetadataEncoder> encoderLifetime = factory.CreateExport())
             WriteObject(encoderLifetime.Value.EncoderInfo);
     }
 }
Пример #6
0
        void InitializeReplayGainFilter(AudioInfo info, AudioMetadata metadata, SettingDictionary settings)
        {
            var filterFactory =
                ExtensionProvider.GetFactories <IAudioFilter>("Name", "ReplayGain").FirstOrDefault();

            if (filterFactory == null)
            {
                return;
            }

            _replayGainExport = filterFactory.CreateExport();
            _replayGainExport.Value.Initialize(info, metadata, settings);
        }
Пример #7
0
        void InitializeReplayGainFilter(
            [NotNull] AudioInfo info,
            [NotNull] AudioMetadata metadata,
            [NotNull] SettingDictionary settings)
        {
            var filterFactory =
                ExtensionProvider.GetFactories <IAudioFilter>("Name", "ReplayGain").FirstOrDefault();

            if (filterFactory == null)
            {
                return;
            }

            _replayGainExport = filterFactory.CreateExport();
            // ReSharper disable once PossibleNullReferenceException
            _replayGainExport.Value.Initialize(info, metadata, settings);
        }
Пример #8
0
        public void Finish()
        {
            _audioFile !.Dispose();
            _audioFile = null;

            _stream !.Position = 0;

            // Call the external MP4 encoder for writing iTunes-compatible atoms
            var metadataEncoderFactory =
                ExtensionProvider.GetFactories <IAudioMetadataEncoder>("Extension", FileExtension).FirstOrDefault();

            if (metadataEncoderFactory == null)
            {
                return;
            }
            using (var export = metadataEncoderFactory.CreateExport())
                export.Value.WriteMetadata(_stream, _metadata !, _settings !);
        }
Пример #9
0
        public void Finish()
        {
            // ReSharper disable once PossibleNullReferenceException
            _audioFile.Dispose();
            _audioFile = null;

            // ReSharper disable once PossibleNullReferenceException
            _stream.Position = 0;

            // Call the external MP4 encoder for writing iTunes-compatible atoms
            var metadataEncoderFactory =
                ExtensionProvider.GetFactories <IAudioMetadataEncoder>("Extension", FileExtension).FirstOrDefault();

            if (metadataEncoderFactory == null)
            {
                return;
            }
            using (var export = metadataEncoderFactory.CreateExport())
                // ReSharper disable twice AssignNullToNotNullAttribute
                export.Value.WriteMetadata(_stream, _metadata, _settings);
        }
Пример #10
0
        public void Submit(SampleCollection samples)
        {
            Contract.Ensures(_buffer != null);

            if (_buffer == null)
            {
                _buffer = new int[samples.SampleCount * samples.Channels];
            }

            if (!samples.IsLast)
            {
                var index = 0;
                for (var sample = 0; sample < samples.SampleCount; sample++)
                {
                    for (var channel = 0; channel < samples.Channels; channel++)
                    {
                        _buffer[index++] = (int)Math.Round(samples[channel][sample] * _multiplier);
                    }
                }

                GCHandle handle = GCHandle.Alloc(_buffer, GCHandleType.Pinned);

                try
                {
                    var bufferList = new AudioBufferList
                    {
                        NumberBuffers = 1,
                        Buffers       = new AudioBuffer[1]
                    };
                    bufferList.Buffers[0].NumberChannels = (uint)samples.Channels;
                    bufferList.Buffers[0].DataByteSize   = (uint)(index * Marshal.SizeOf <int>());
                    bufferList.Buffers[0].Data           = handle.AddrOfPinnedObject();

                    ExtendedAudioFileStatus status = _audioFile.Write(bufferList, (uint)samples.SampleCount);
                    if (status != ExtendedAudioFileStatus.Ok)
                    {
                        throw new IOException(string.Format(CultureInfo.CurrentCulture,
                                                            Resources.SampleEncoderWriteError, status));
                    }
                }
                finally
                {
                    handle.Free();
                }
            }
            else
            {
                _audioFile.Dispose();

                // Call an external MP4 encoder for writing iTunes-compatible atoms:
                _stream.Position = 0;

                ExportFactory <IMetadataEncoder> metadataEncoderFactory =
                    ExtensionProvider.GetFactories <IMetadataEncoder>("Extension", EncoderInfo.FileExtension)
                    .SingleOrDefault();
                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);
            }
        }
Пример #11
0
 internal static IEnumerable <ExportFactory <T> > GetFactories <T>([NotNull] string key, [NotNull] string value)
     where T : class
 {
     return(ExtensionProvider.GetFactories <T>(key, value));
 }
Пример #12
0
 internal static IEnumerable <ExportFactory <T, IDictionary <string, object> > > GetFactories <T>()
     where T : class
 {
     return(ExtensionProvider.GetFactories <T>());
 }
Пример #13
0
 internal static IEnumerable <ExportFactory <T> > GetFactories <T>(string key, string value)
     where T : class =>
 ExtensionProvider.GetFactories <T>(key, value);
Пример #14
0
        public void Initialize(Stream stream, AudioInfo audioInfo, MetadataDictionary metadata, SettingsDictionary settings)
        {
            Contract.Ensures(_stream != null);
            Contract.Ensures(_stream == stream);
            Contract.Ensures(_metadata != null);
            Contract.Ensures(_metadata == metadata);
            Contract.Ensures(_settings != null);
            Contract.Ensures(_settings == settings);
            Contract.Ensures(_audioFile != null);

            _stream   = stream;
            _metadata = metadata;
            _settings = settings;

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

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

            AudioStreamBasicDescription inputDescription  = GetInputDescription(audioInfo);
            AudioStreamBasicDescription outputDescription = GetOutputDescription(inputDescription);

            try
            {
                _audioFile = new NativeExtendedAudioFile(outputDescription, AudioFileType.M4A, stream);

                ExtendedAudioFileStatus status = _audioFile.SetProperty(ExtendedAudioFilePropertyId.ClientDataFormat,
                                                                        inputDescription);
                if (status != ExtendedAudioFileStatus.Ok)
                {
                    throw new IOException(string.Format(CultureInfo.CurrentCulture,
                                                        Resources.SampleEncoderInitializationError, status));
                }

                // Configure the audio converter:
                ConfigureConverter(settings, audioInfo.Channels,
                                   _audioFile.GetProperty <IntPtr>(ExtendedAudioFilePropertyId.AudioConverter));

                // Setting the ConverterConfig property to null resynchronizes the converter settings:
                ExtendedAudioFileStatus fileStatus = _audioFile.SetProperty(
                    ExtendedAudioFilePropertyId.ConverterConfig, IntPtr.Zero);
                if (fileStatus != ExtendedAudioFileStatus.Ok)
                {
                    throw new IOException(string.Format(CultureInfo.CurrentCulture,
                                                        Resources.SampleEncoderConverterError, status));
                }
            }
            catch (TypeInitializationException e)
            {
                if (e.InnerException != null && e.InnerException.GetType() == typeof(ExtensionInitializationException))
                {
                    throw e.InnerException;
                }
                throw;
            }
        }