aboutsummaryrefslogtreecommitdiff
path: root/Emby.Server.Implementations/LiveTv/TunerHosts/LiveStream.cs
diff options
context:
space:
mode:
authorLuke Pulverenti <luke.pulverenti@gmail.com>2017-10-14 02:52:56 -0400
committerLuke Pulverenti <luke.pulverenti@gmail.com>2017-10-14 02:52:56 -0400
commit164e7dc896aa71a921f673e2058a2272fc917c4e (patch)
treedcb8bd0bcbef0e7d2f79be851611496c8b4cd6f0 /Emby.Server.Implementations/LiveTv/TunerHosts/LiveStream.cs
parent2d63bdea94751eb1175bc5a2c8ed1a4fafd7e163 (diff)
improve live tv direct play
Diffstat (limited to 'Emby.Server.Implementations/LiveTv/TunerHosts/LiveStream.cs')
-rw-r--r--Emby.Server.Implementations/LiveTv/TunerHosts/LiveStream.cs34
1 files changed, 26 insertions, 8 deletions
diff --git a/Emby.Server.Implementations/LiveTv/TunerHosts/LiveStream.cs b/Emby.Server.Implementations/LiveTv/TunerHosts/LiveStream.cs
index 5be91c6c1b..685f794fde 100644
--- a/Emby.Server.Implementations/LiveTv/TunerHosts/LiveStream.cs
+++ b/Emby.Server.Implementations/LiveTv/TunerHosts/LiveStream.cs
@@ -32,6 +32,7 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts
protected readonly string TempFilePath;
protected readonly ILogger Logger;
+ protected readonly CancellationTokenSource LiveStreamCancellationTokenSource = new CancellationTokenSource();
public LiveStream(MediaSourceInfo mediaSource, IEnvironmentInfo environment, IFileSystem fileSystem, ILogger logger, IServerApplicationPaths appPaths)
{
@@ -80,6 +81,14 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts
FileSystem.DeleteFile(path);
return;
}
+ catch (DirectoryNotFoundException)
+ {
+ return;
+ }
+ catch (FileNotFoundException)
+ {
+ return;
+ }
catch
{
@@ -96,6 +105,8 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts
public async Task CopyToAsync(Stream stream, CancellationToken cancellationToken)
{
+ cancellationToken = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, LiveStreamCancellationTokenSource.Token).Token;
+
var allowAsync = false;//Environment.OperatingSystem != MediaBrowser.Model.System.OperatingSystem.Windows;
// use non-async filestream along with read due to https://github.com/dotnet/corefx/issues/6039
@@ -110,16 +121,27 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts
private static async Task CopyTo(Stream source, Stream destination, int bufferSize, Action onStarted, CancellationToken cancellationToken)
{
byte[] buffer = new byte[bufferSize];
- while (true)
+
+ var eofCount = 0;
+ var emptyReadLimit = 1000;
+
+ while (eofCount < emptyReadLimit)
{
cancellationToken.ThrowIfCancellationRequested();
- var read = source.Read(buffer, 0, buffer.Length);
+ var bytesRead = source.Read(buffer, 0, buffer.Length);
- if (read > 0)
+ if (bytesRead == 0)
+ {
+ eofCount++;
+ await Task.Delay(10, cancellationToken).ConfigureAwait(false);
+ }
+ else
{
+ eofCount = 0;
+
//await destination.WriteAsync(buffer, 0, read).ConfigureAwait(false);
- destination.Write(buffer, 0, read);
+ destination.Write(buffer, 0, bytesRead);
if (onStarted != null)
{
@@ -127,10 +149,6 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts
onStarted = null;
}
}
- else
- {
- await Task.Delay(10).ConfigureAwait(false);
- }
}
}