Beispiel #1
0
        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;
            }
        }
Beispiel #2
0
 private static void ProcessOutput(IBassEncoder encoder, Stream output)
 {
     WriteOutput(output, encoder.EncoderItems);
 }
Beispiel #3
0
        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;
 }