public static IEnumerable <ConfigurationSection> GetConfigurationSections(IBassEncoderSettings settings)
 {
     yield return(new ConfigurationSection(SECTION, "Converter")
                  .WithElement(new SelectionConfigurationElement(DEPTH_ELEMENT, "Depth", path: settings.Name)
                               .WithOptions(GetDepthOptions())
                               ));
 }
 public static IEnumerable <ConfigurationSection> GetConfigurationSections(IBassEncoderSettings settings)
 {
     yield return(new ConfigurationSection(SECTION, "Converter")
                  .WithElement(new SelectionConfigurationElement(DEPTH_ELEMENT, "Depth", path: settings.Name)
                               .WithOptions(GetDepthOptions())
                               .DependsOn(SECTION, ENABLED_ELEMENT))
                  .WithElement(new IntegerConfigurationElement(COMPRESSION_ELEMENT, "Compression Level", path: settings.Name)
                               .WithValue(DEFAULT_COMPRESSION)
                               .WithValidationRule(new IntegerValidationRule(MIN_COMPRESSION, MAX_COMPRESSION))
                               .DependsOn(SECTION, ENABLED_ELEMENT))
                  .WithElement(new IntegerConfigurationElement(PROCESSING_ELEMENT, "Additional Processing", path: settings.Name)
                               .WithValue(DEFAULT_PROCESSING)
                               .WithValidationRule(new IntegerValidationRule(MIN_PROCESSING, MAX_PROCESSING))
                               .DependsOn(SECTION, ENABLED_ELEMENT))
                  .WithElement(new BooleanConfigurationElement(HYBRID_ELEMENT, "Hybrid Lossy", path: settings.Name)
                               .WithValue(false)
                               .DependsOn(SECTION, ENABLED_ELEMENT))
                  .WithElement(new BooleanConfigurationElement(CORRECTION_ELEMENT, "Correction File", path: settings.Name)
                               .WithValue(false).DependsOn(SECTION, HYBRID_ELEMENT)
                               .DependsOn(SECTION, ENABLED_ELEMENT))
                  .WithElement(new IntegerConfigurationElement(BITRATE_ELEMENT, "Bitrate", path: settings.Name)
                               .WithValue(DEFAULT_BITRATE).DependsOn(SECTION, HYBRID_ELEMENT)
                               .WithValidationRule(new IntegerValidationRule(MIN_BITRATE, MAX_BITRATE))
                               .DependsOn(SECTION, ENABLED_ELEMENT)
                               ));
 }
 public static IEnumerable <ConfigurationSection> GetConfigurationSections(IBassEncoderSettings settings)
 {
     yield return(new ConfigurationSection(SECTION, "Converter")
                  .WithElement(new IntegerConfigurationElement(BITRATE_ELEMENT, "Bitrate", path: settings.Name)
                               .WithValue(DEFAULT_BITRATE)
                               .WithValidationRule(new IntegerValidationRule(MIN_BITRATE, MAX_BITRATE))
                               ));
 }
 public static IEnumerable <ConfigurationSection> GetConfigurationSections(IBassEncoderSettings settings)
 {
     yield return(new ConfigurationSection(SECTION, "Converter")
                  .WithElement(new SelectionConfigurationElement(BITRATE_ELEMENT, "Bitrate", path: settings.Name)
                               .WithOptions(GetBitrateOptions())
                               .DependsOn(SECTION, ENABLED_ELEMENT)
                               ));
 }
 public static IEnumerable <ConfigurationSection> GetConfigurationSections(IBassEncoderSettings settings)
 {
     yield return(new ConfigurationSection(SECTION, "Converter")
                  .WithElement(new IntegerConfigurationElement(QUALITY_ELEMENT, "Quality", path: settings.Name)
                               .WithValue(DEFAULT_QUALITY)
                               .WithValidationRule(new IntegerValidationRule(MIN_QUALITY, MAX_QUALITY))
                               ));
 }
 public static IEnumerable <ConfigurationSection> GetConfigurationSections(IBassEncoderSettings settings)
 {
     yield return(new ConfigurationSection(SECTION, "Converter")
                  .WithElement(new SelectionConfigurationElement(DEPTH_ELEMENT, "Depth", path: settings.Name)
                               .WithOptions(GetDepthOptions()))
                  .WithElement(new IntegerConfigurationElement(COMPRESSION_ELEMENT, "Compression Level", path: settings.Name)
                               .WithValue(DEFAULT_COMPRESSION)
                               .WithValidationRule(new IntegerValidationRule(MIN_COMPRESSION, MAX_COMPRESSION))
                               ));
 }
示例#7
0
        protected virtual void Encode(EncoderItem encoderItem, IBassEncoderSettings settings)
        {
            var flags = BassFlags.Decode;

            if (this.ShouldDecodeFloat(encoderItem, settings))
            {
                Logger.Write(this, LogLevel.Debug, "Decoding file \"{0}\" in high quality mode (32 bit floating point).", encoderItem.InputFileName);
                flags |= BassFlags.Float;
            }
            else
            {
                Logger.Write(this, LogLevel.Debug, "Decoding file \"{0}\" in standaed quality mode (16 bit integer).", encoderItem.InputFileName);
            }
            var stream = this.CreateStream(encoderItem.InputFileName, flags);

            if (stream.IsEmpty)
            {
                Logger.Write(this, LogLevel.Debug, "Failed to create stream for file \"{0}\": Unknown error.", encoderItem.InputFileName);
                return;
            }
            Logger.Write(this, LogLevel.Debug, "Created stream for file \"{0}\": {1}", encoderItem.InputFileName, stream.ChannelHandle);
            try
            {
                if (flags.HasFlag(BassFlags.Float))
                {
                    this.EncodeWithResampler(encoderItem, stream, settings);
                }
                else
                {
                    this.Encode(encoderItem, stream, settings);
                }
            }
            finally
            {
                Logger.Write(this, LogLevel.Debug, "Releasing stream for file \"{0}\": {1}", encoderItem.InputFileName, stream.ChannelHandle);
                Bass.StreamFree(stream.ChannelHandle); //Not checking result code as it contains an error if the application is shutting down.
            }
            if (this.CancellationToken.IsCancellationRequested)
            {
                encoderItem.Status = EncoderItemStatus.Cancelled;
                if (File.Exists(encoderItem.OutputFileName))
                {
                    Logger.Write(this, LogLevel.Debug, "Deleting incomplete output \"{0}\": Cancelled.", encoderItem.OutputFileName);
                    File.Delete(encoderItem.OutputFileName);
                }
            }
            else
            {
                encoderItem.Status = EncoderItemStatus.Complete;
            }
        }
示例#8
0
 protected virtual void Encode(EncoderItem encoderItem, IBassStream stream, IBassEncoderSettings settings)
 {
     using (var encoderProcess = this.CreateEncoderProcess(encoderItem, stream, settings))
     {
         this.Encode(encoderItem, stream, encoderProcess);
         if (this.WaitForExit(encoderProcess))
         {
             if (encoderProcess.ExitCode != 0)
             {
                 throw new InvalidOperationException("Process does not indicate success.");
             }
         }
     }
 }
示例#9
0
 protected virtual bool ShouldDecodeFloat(EncoderItem encoderItem, IBassEncoderSettings settings)
 {
     if (encoderItem.BitsPerSample == 1)
     {
         Logger.Write(this, LogLevel.Debug, "Suggesting high quality mode for file \"{0}\": dsd.", encoderItem.InputFileName);
         return(true);
     }
     if (encoderItem.BitsPerSample > 16 || settings.Format.Depth > 16)
     {
         Logger.Write(this, LogLevel.Debug, "Suggesting high quality mode for file \"{0}\": >16 bit.", encoderItem.InputFileName);
         return(true);
     }
     Logger.Write(this, LogLevel.Debug, "Suggesting standard quality mode for file \"{0}\": <=16 bit.", encoderItem.InputFileName);
     return(false);
 }
示例#10
0
 public static IEnumerable <ConfigurationSection> GetConfigurationSections(IBassEncoderSettings settings)
 {
     yield return(new ConfigurationSection(SECTION)
                  .WithElement(new SelectionConfigurationElement(DEPTH_ELEMENT, "Depth", path: settings.Name)
                               .WithOptions(GetDepthOptions())
                               .DependsOn(SECTION, ENABLED_ELEMENT))
                  .WithElement(new IntegerConfigurationElement(COMPRESSION_ELEMENT, "Compression Level", path: settings.Name)
                               .WithValue(DEFAULT_COMPRESSION)
                               .WithValidationRule(new IntegerValidationRule(MIN_COMPRESSION, MAX_COMPRESSION))
                               .DependsOn(SECTION, ENABLED_ELEMENT))
                  .WithElement(new BooleanConfigurationElement(IGNORE_ERRORS_ELEMENT, "Ignore Errors", path: settings.Name)
                               .WithValue(true)
                               .DependsOn(SECTION, ENABLED_ELEMENT)
                               ));
 }
示例#11
0
        protected virtual Process CreateEncoderProcess(EncoderItem encoderItem, IBassStream stream, IBassEncoderSettings settings)
        {
            Logger.Write(this, LogLevel.Debug, "Creating encoder process for file \"{0}\".", encoderItem.InputFileName);
            var arguments = settings.GetArguments(encoderItem, stream);
            var process   = this.CreateProcess(
                encoderItem,
                stream,
                settings.Executable,
                settings.Directory,
                arguments,
                true,
                false,
                true
                );

            Logger.Write(this, LogLevel.Debug, "Created encoder process for file \"{0}\": \"{1}\" {2}", encoderItem.InputFileName, settings.Executable, arguments);
            return(process);
        }
示例#12
0
 protected virtual void EncodeWithResampler(EncoderItem encoderItem, IBassStream stream, IBassEncoderSettings settings)
 {
     using (var resamplerProcess = this.CreateResamplerProcess(encoderItem, stream, new SoxEncoderSettings(settings)))
     {
         using (var encoderProcess = this.CreateEncoderProcess(encoderItem, stream, settings))
         {
             var success = true;
             this.EncodeWithResampler(encoderItem, stream, resamplerProcess, encoderProcess);
             if (this.WaitForExit(resamplerProcess))
             {
                 if (resamplerProcess.ExitCode != 0)
                 {
                     success = false;
                 }
             }
             if (this.WaitForExit(encoderProcess))
             {
                 if (encoderProcess.ExitCode != 0)
                 {
                     success = false;
                 }
             }
             if (!success)
             {
                 throw new InvalidOperationException("Process does not indicate success.");
             }
         }
     }
 }
示例#13
0
 public SoxEncoderSettings(IBassEncoderSettings settings) : this()
 {
     this.Settings = settings;
 }
示例#14
0
        protected virtual void Encode(IBassEncoderSettings settings)
        {
            if (settings.Threads > 1)
            {
                Logger.Write(this, LogLevel.Debug, "Beginning parallel encoding with {0} threads.", settings.Threads);
            }
            else
            {
                Logger.Write(this, LogLevel.Debug, "Beginning single threaded encoding.");
            }
            var parallelOptions = new ParallelOptions()
            {
                MaxDegreeOfParallelism = settings.Threads
            };

            Parallel.ForEach(this.EncoderItems, parallelOptions, encoderItem =>
            {
                try
                {
                    if (this.CancellationToken.IsCancellationRequested)
                    {
                        Logger.Write(this, LogLevel.Warn, "Skipping file \"{0}\" due to cancellation.", encoderItem.InputFileName);
                        encoderItem.Status = EncoderItemStatus.Cancelled;
                        return;
                    }
                    encoderItem.OutputFileName = settings.GetOutput(encoderItem.InputFileName);
                    if (!this.CheckInput(encoderItem.InputFileName))
                    {
                        Logger.Write(this, LogLevel.Warn, "Skipping file \"{0}\" due to output file \"{1}\" does not exist.", encoderItem.InputFileName, encoderItem.OutputFileName);
                        encoderItem.Status = EncoderItemStatus.Failed;
                        encoderItem.AddError(string.Format("Input file \"{0}\" does not exist.", encoderItem.OutputFileName));
                        return;
                    }
                    if (!this.CheckOutput(encoderItem.OutputFileName))
                    {
                        Logger.Write(this, LogLevel.Warn, "Skipping file \"{0}\" due to output file \"{1}\" already exists or cannot be written.", encoderItem.InputFileName, encoderItem.OutputFileName);
                        encoderItem.Status = EncoderItemStatus.Failed;
                        encoderItem.AddError(string.Format("Output file \"{0}\" already exists or cannot be written.", encoderItem.OutputFileName));
                        return;
                    }
                    Logger.Write(this, LogLevel.Debug, "Beginning encoding file \"{0}\" to output file \"{1}\".", encoderItem.InputFileName, encoderItem.OutputFileName);
                    encoderItem.Progress = EncoderItem.PROGRESS_NONE;
                    encoderItem.Status   = EncoderItemStatus.Processing;
                    this.Encode(encoderItem, settings);
                    if (encoderItem.Status == EncoderItemStatus.Complete)
                    {
                        Logger.Write(this, LogLevel.Debug, "Encoding file \"{0}\" to output file \"{1}\" completed successfully.", encoderItem.InputFileName, encoderItem.OutputFileName);
                    }
                    else
                    {
                        Logger.Write(this, LogLevel.Warn, "Encoding file \"{0}\" failed: Unknown error.", encoderItem.InputFileName);
                    }
                }
                catch (OperationCanceledException)
                {
                    Logger.Write(this, LogLevel.Warn, "Skipping file \"{0}\" due to cancellation.", encoderItem.InputFileName);
                    encoderItem.Status = EncoderItemStatus.Cancelled;
                    return;
                }
                catch (Exception e)
                {
                    Logger.Write(this, LogLevel.Warn, "Encoding file \"{0}\" failed: {1}", encoderItem.InputFileName, e.Message);
                    encoderItem.Status = EncoderItemStatus.Failed;
                    encoderItem.AddError(e.Message);
                }
                finally
                {
                    encoderItem.Progress = EncoderItem.PROGRESS_COMPLETE;
                }
            });
            Logger.Write(this, LogLevel.Debug, "Encoding completed successfully.");
        }