コード例 #1
0
        private static CompressionLevelService BuildComponents(FileInfo flacExe)
        {
            var processRunner = new ExternalProcess.ProcessRunner(processTimeoutSec);

            IAudioFileEncoder encoder_MetadataPreserved = new FileRecoder(flacExe, processRunner);

            IAudioFileEncoder encoder_MetadataDiscarded = new AudioFileEncoder(
                new FileDecoder(flacExe, processRunner),
                new StreamEncoder(flacExe, processRunner));

            IFileInfoSizeGetter fileSize = new FileInfoSizeGetter();

            var service_MetadataPreserved = new CompressionLevelInferrer(
                new CompressedSizeService(encoder_MetadataPreserved),
                fileSize,
                minCompressionLevel,
                maxCompressionLevel);

            var service_MetadataDiscarded = new CompressionLevelInferrer(
                new CompressedSizeService(encoder_MetadataDiscarded),
                fileSize,
                minCompressionLevel,
                maxCompressionLevel);

            return(new CompressionLevelService(service_MetadataPreserved, service_MetadataDiscarded));
        }
コード例 #2
0
        protected override void EndProcessing()
        {
            // ReSharper disable once AssignNullToNotNullAttribute
            var encoder = new AudioFileEncoder(
                Encoder,
                SessionState.Path.GetUnresolvedProviderPathFromPSPath(Path),
                Name,
                SettingAdapter.ParametersToSettings(_parameters))
            {
                Overwrite = Replace,
                MaxDegreeOfParallelism = MaxDegreeOfParallelism
            };

            var activity                = $"Encoding {_sourceAudioFiles.Count} audio files in {Encoder} format";
            var totalFrames             = (double)_sourceAudioFiles.Sum(audioFile => audioFile.Info.FrameCount);
            var lastAudioFilesCompleted = 0;
            var lastPercentComplete     = 0;

            using (var messageQueue = new BlockingCollection <object>())
            {
                var progress = new SimpleProgress <ProgressToken>(token =>
                {
                    var percentComplete = (int)Math.Round(token.FramesCompleted / totalFrames * 100);

                    // Only report progress if something has changed
                    if (percentComplete <= lastPercentComplete && token.AudioFilesCompleted <= lastAudioFilesCompleted)
                    {
                        return;
                    }

                    lastAudioFilesCompleted = token.AudioFilesCompleted;
                    lastPercentComplete     = percentComplete;

                    // ReSharper disable once AccessToDisposedClosure
                    messageQueue.Add(new ProgressRecord(0, activity,
                                                        $"{token.AudioFilesCompleted} of {_sourceAudioFiles.Count} audio files encoded")
                    {
                        // If the audio files have estimated frame counts, make sure this doesn't go over 100%
                        PercentComplete = Math.Min(percentComplete, 100)
                    });

                    // Send any new log messages to the output queue
                    while (LoggerProvider.TryDequeueMessage(out var logMessage))
                    {
                        // ReSharper disable once AccessToDisposedClosure
                        messageQueue.Add(logMessage);
                    }
                });

                var encodeTask = encoder.EncodeAsync(_sourceAudioFiles, _cancellationSource.Token, progress);
                // ReSharper disable once AccessToDisposedClosure
                encodeTask.ContinueWith(task => messageQueue.CompleteAdding(), TaskScheduler.Current);

                this.OutputMessages(messageQueue, _cancellationSource.Token);

                try
                {
                    WriteObject(encodeTask.Result, true);
                }
                catch (AggregateException e)
                {
                    throw e.GetBaseException();
                }
            }
        }