Try reading more from ffmpeg

This commit is contained in:
Master Kwoth 2017-07-02 10:44:30 +02:00
parent 4d52566250
commit bbe3ac66e3

View File

@ -9,7 +9,7 @@ namespace NadekoBot.Services.Music
{ {
public class SongBuffer : IDisposable public class SongBuffer : IDisposable
{ {
const int maxReadSize = 3840; const int readSize = 38400;
private Process p; private Process p;
private PoopyRingBuffer _outStream = new PoopyRingBuffer(); private PoopyRingBuffer _outStream = new PoopyRingBuffer();
@ -39,38 +39,33 @@ namespace NadekoBot.Services.Music
{ {
try try
{ {
byte[] buffer = new byte[3840]; byte[] buffer = new byte[readSize];
while (!cancelToken.IsCancellationRequested) while (!cancelToken.IsCancellationRequested)
{ {
var toRead = buffer.Length; var toRead = buffer.Length;
var remCap = _outStream.RemainingCapacity; var remCap = _outStream.RemainingCapacity;
if (remCap < 3840) if (remCap < readSize)
{ {
if (_outStream.RemainingCapacity == 0) if (_outStream.RemainingCapacity == 0)
{ {
Console.WriteLine("Buffer full, not gonnna read from ffmpeg"); Console.WriteLine("Buffer full, not gonnna read from ffmpeg");
await Task.Delay(10); await Task.Delay(20);
continue; continue;
} }
toRead = remCap; toRead = remCap;
} }
do
{
if(p.HasExited)
Console.WriteLine("FFMPEG has exited, I'm in the read/write loop");
int bytesRead = await p.StandardOutput.BaseStream.ReadAsync(buffer, 0, toRead, cancelToken).ConfigureAwait(false); int bytesRead = await p.StandardOutput.BaseStream.ReadAsync(buffer, 0, toRead, cancelToken).ConfigureAwait(false);
if (bytesRead == 0) if (bytesRead == 0)
{ {
Console.WriteLine("I'm not reading anything from ffmpeg"); Console.WriteLine("I'm not reading anything from ffmpeg");
await Task.Delay(20); await Task.Delay(20);
continue;
} }
await _outStream.WriteAsync(buffer, 0, bytesRead, cancelToken); await _outStream.WriteAsync(buffer, 0, bytesRead, cancelToken);
} while (p.HasExited && !cancelToken.IsCancellationRequested);
if (_outStream.RemainingCapacity < _outStream.Capacity * 0.9f) if (_outStream.RemainingCapacity < _outStream.Capacity * 0.9f)
if(toReturn.TrySetResult(true)) if (toReturn.TrySetResult(true))
Console.WriteLine("Prebuffering finished"); Console.WriteLine("Prebuffering finished");
} }
Console.WriteLine("FFMPEG killed or song canceled"); Console.WriteLine("FFMPEG killed or song canceled");