diff options
Diffstat (limited to 'Emby.Server.Implementations/LiveTv/TunerHosts/QueueStream.cs')
| -rw-r--r-- | Emby.Server.Implementations/LiveTv/TunerHosts/QueueStream.cs | 82 |
1 files changed, 5 insertions, 77 deletions
diff --git a/Emby.Server.Implementations/LiveTv/TunerHosts/QueueStream.cs b/Emby.Server.Implementations/LiveTv/TunerHosts/QueueStream.cs index 61bc390b4..07a4daa87 100644 --- a/Emby.Server.Implementations/LiveTv/TunerHosts/QueueStream.cs +++ b/Emby.Server.Implementations/LiveTv/TunerHosts/QueueStream.cs @@ -13,10 +13,8 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts public class QueueStream { private readonly Stream _outputStream; - private readonly ConcurrentQueue<Tuple<byte[], int, int>> _queue = new ConcurrentQueue<Tuple<byte[], int, int>>(); - public TaskCompletionSource<bool> TaskCompletion { get; private set; } + private readonly BlockingCollection<Tuple<byte[], int, int>> _queue = new BlockingCollection<Tuple<byte[], int, int>>(); - public Action<QueueStream> OnFinished { get; set; } private readonly ILogger _logger; public Guid Id = Guid.NewGuid(); @@ -24,94 +22,24 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts { _outputStream = outputStream; _logger = logger; - TaskCompletion = new TaskCompletionSource<bool>(); } public void Queue(byte[] bytes, int offset, int count) { - _queue.Enqueue(new Tuple<byte[], int, int>(bytes, offset, count)); + _queue.Add(new Tuple<byte[], int, int>(bytes, offset, count)); } public void Start(CancellationToken cancellationToken) { - Task.Run(() => StartInternal(cancellationToken)); - } - - private Tuple<byte[], int, int> Dequeue() - { - Tuple<byte[], int, int> result; - if (_queue.TryDequeue(out result)) - { - return result; - } - - return null; - } - - private void OnClosed() - { - GC.Collect(); - if (OnFinished != null) - { - OnFinished(this); - } - } - - public void Write(byte[] bytes, int offset, int count) - { - //return _outputStream.WriteAsync(bytes, offset, count, cancellationToken); - - try + while (true) { - _outputStream.Write(bytes, offset, count); - } - catch (OperationCanceledException) - { - _logger.Debug("QueueStream cancelled"); - TaskCompletion.TrySetCanceled(); - OnClosed(); - } - catch (Exception ex) - { - _logger.ErrorException("Error in QueueStream", ex); - TaskCompletion.TrySetException(ex); - OnClosed(); - } - } - - private async Task StartInternal(CancellationToken cancellationToken) - { - try - { - while (true) + foreach (var result in _queue.GetConsumingEnumerable()) { cancellationToken.ThrowIfCancellationRequested(); - var result = Dequeue(); - if (result != null) - { - _outputStream.Write(result.Item1, result.Item2, result.Item3); - } - else - { - await Task.Delay(50, cancellationToken).ConfigureAwait(false); - } + _outputStream.Write(result.Item1, result.Item2, result.Item3); } } - catch (OperationCanceledException) - { - _logger.Debug("QueueStream cancelled"); - TaskCompletion.TrySetCanceled(); - } - catch (Exception ex) - { - _logger.ErrorException("Error in QueueStream", ex); - TaskCompletion.TrySetException(ex); - } - finally - { - OnClosed(); - } } } } |
