private static void ProcessInput(IBassEncoder encoder, Stream input, Stream output, out bool exit) { Logger.Write(typeof(BassEncoderHost), LogLevel.Debug, "Begin reading command."); var command = ReadInput <EncoderCommand>(input); Logger.Write(typeof(BassEncoderHost), LogLevel.Debug, "Read command: {0}", Enum.GetName(typeof(EncoderCommandType), command.Type)); switch (command.Type) { case EncoderCommandType.Cancel: Logger.Write(typeof(BassEncoderHost), LogLevel.Debug, "Sending cancellation signal to encoder."); encoder.Cancel(); Logger.Write(typeof(BassEncoderHost), LogLevel.Debug, "Closing stdin."); input.Close(); exit = true; break; case EncoderCommandType.Quit: Logger.Write(typeof(BassEncoderHost), LogLevel.Debug, "Closing stdin/stdout."); input.Close(); output.Close(); exit = true; break; default: exit = false; break; } }
private static void ProcessOutput(IBassEncoder encoder, Stream output) { WriteOutput(output, encoder.EncoderItems); }
private static void Encode(IBassEncoder encoder, Stream input, Stream output, Stream error) { var thread1 = new Thread(() => { try { Logger.Write(typeof(BassEncoderHost), LogLevel.Debug, "Starting encoder main thread."); encoder.Encode(); Logger.Write(typeof(BassEncoderHost), LogLevel.Debug, "Finished encoder main thread."); WriteOutput(output, new EncoderStatus(EncoderStatusType.Complete)); error.Flush(); } catch (Exception e) { Logger.Write(typeof(BassEncoderHost), LogLevel.Error, "Error on encoder main thread: {0}", e.Message); WriteOutput(output, new EncoderStatus(EncoderStatusType.Error)); new StreamWriter(error).Write(e.Message); error.Flush(); } }) { IsBackground = true }; var thread2 = new Thread(() => { try { Logger.Write(typeof(BassEncoderHost), LogLevel.Debug, "Starting encoder output thread."); while (thread1.IsAlive) { ProcessOutput(encoder, output); Thread.Sleep(INTERVAL); } ProcessOutput(encoder, output); Logger.Write(typeof(BassEncoderHost), LogLevel.Debug, "Finished encoder output thread."); } catch (Exception e) { Logger.Write(typeof(BassEncoderHost), LogLevel.Error, "Error on encoder output thread: {0}", e.Message); } }) { IsBackground = true }; var thread3 = new Thread(() => { try { Logger.Write(typeof(BassEncoderHost), LogLevel.Debug, "Starting encoder input thread."); while (thread1.IsAlive) { ProcessInput(encoder, input, output); Thread.Sleep(INTERVAL); } ProcessInput(encoder, input, output); Logger.Write(typeof(BassEncoderHost), LogLevel.Debug, "Finished encoder input thread."); } catch (Exception e) { Logger.Write(typeof(BassEncoderHost), LogLevel.Error, "Error on encoder input thread: {0}", e.Message); } }) { IsBackground = true }; thread1.Start(); thread2.Start(); thread3.Start(); thread1.Join(); if (!thread2.Join(TIMEOUT)) { Logger.Write(typeof(BassEncoderHost), LogLevel.Warn, "Encoder output thread did not complete gracefully, aborting."); thread2.Abort(); } if (!thread3.Join(TIMEOUT)) { Logger.Write(typeof(BassEncoderHost), LogLevel.Warn, "Encoder input thread did not complete gracefully, aborting."); thread3.Abort(); } }
public BassEncoderMonitor(IBassEncoder encoder, bool reportProgress, CancellationToken cancellationToken) : base(reportProgress) { this.EncoderItems = new Dictionary <Guid, EncoderItem>(); this.Encoder = encoder; this.CancellationToken = cancellationToken; }