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)); }
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(); } } }