removed buffering completely from music, sending ffmpeg stream directly

This commit is contained in:
Master Kwoth 2016-02-08 00:44:45 +01:00
parent 2d52d18847
commit a644a5857c
2 changed files with 18 additions and 59 deletions

View File

@ -32,12 +32,8 @@ namespace NadekoBot.Classes {
} }
internal void InsertMany<T>(T objects) where T : IEnumerable<IDataModel> { internal void InsertMany<T>(T objects) where T : IEnumerable<IDataModel> {
try { using (var _conn = new SQLiteConnection(_filePath)) {
using (var _conn = new SQLiteConnection(_filePath)) { _conn.InsertAll(objects);
_conn.InsertAll(objects);
}
} catch (Exception ex) {
Console.WriteLine(ex);
} }
} }

View File

@ -155,6 +155,8 @@ namespace NadekoBot.Classes.Music {
private readonly object _bufferLock = new object(); private readonly object _bufferLock = new object();
private bool prebufferingComplete = false; private bool prebufferingComplete = false;
private Process ffmpegProcess;
public MusicStreamer(StreamRequest parent, string directUrl) { public MusicStreamer(StreamRequest parent, string directUrl) {
this.parent = parent; this.parent = parent;
this.buffer = new DualStream(); this.buffer = new DualStream();
@ -180,59 +182,18 @@ namespace NadekoBot.Classes.Music {
CreateNoWindow = true, CreateNoWindow = true,
WindowStyle = ProcessWindowStyle.Hidden, WindowStyle = ProcessWindowStyle.Hidden,
}); });
int attempt = 0;
while (true) {
while (buffer.writePos - buffer.readPos > 5.MB() && State != StreamState.Completed) {
prebufferingComplete = true;
await Task.Delay(200);
}
if (State == StreamState.Completed) { ffmpegProcess = p;
try { await Task.Delay(1000);
p.CancelOutputRead(); prebufferingComplete = true;
p.Close();
} catch (Exception) { }
Console.WriteLine("Buffering canceled, stream is completed.");
return;
}
if (buffer.readPos > 5.MiB() && buffer.writePos > 5.MiB()) { // if buffer is over 5 MiB, create new one while (State != StreamState.Completed) {
var skip = 5.MB(); //remove only 5 MB, just in case await Task.Delay(500);
var newBuffer = new DualStream();
lock (_bufferLock) {
byte[] data = buffer.ToArray().Skip(skip).ToArray();
var newReadPos = buffer.readPos - skip;
var newPos = buffer.Position - skip;
buffer = newBuffer;
buffer.Write(data, 0, data.Length);
buffer.readPos = newReadPos;
buffer.Position = newPos;
}
}
var buf = new byte[2048];
int read = 0;
read = await p.StandardOutput.BaseStream.ReadAsync(buf, 0, 2048);
//Console.WriteLine($"Read: {read}");
if (read == 0) {
if (attempt == 5) {
try {
p.CancelOutputRead();
p.Close();
} catch (Exception) { }
Console.WriteLine($"Didn't read anything from the stream for {attempt} attempts. {buffer.Length/1.MB()}MB length");
return;
} else {
++attempt;
await Task.Delay(20);
}
} else {
attempt = 0;
await buffer.WriteAsync(buf, 0, read);
}
} }
try {
p.CancelOutputRead();
p.Close();
} catch (Exception) { }
} }
internal async Task StartPlayback() { internal async Task StartPlayback() {
@ -256,13 +217,13 @@ namespace NadekoBot.Classes.Music {
Console.WriteLine($"Prebuffering finished in {bufferAttempts*500}"); Console.WriteLine($"Prebuffering finished in {bufferAttempts*500}");
} }
// prebuffering wait stuff end // prebuffering wait stuff end
/*
if (buffer.Length > 0) { if (buffer.Length > 0) {
Console.WriteLine("Prebuffering complete."); Console.WriteLine("Prebuffering complete.");
} else { } else {
Console.WriteLine("Didn't buffer jack shit."); Console.WriteLine("Didn't buffer jack shit.");
} }
*/
int blockSize = 1920 * NadekoBot.client.Audio().Config.Channels; int blockSize = 1920 * NadekoBot.client.Audio().Config.Channels;
byte[] voiceBuffer = new byte[blockSize]; byte[] voiceBuffer = new byte[blockSize];
@ -275,7 +236,9 @@ namespace NadekoBot.Classes.Music {
//adjust volume //adjust volume
lock (_bufferLock) { lock (_bufferLock) {
readCount = buffer.Read(voiceBuffer, 0, voiceBuffer.Length); readCount = ffmpegProcess.StandardOutput.BaseStream.Read(voiceBuffer, 0, voiceBuffer.Length);
if(readCount!=3840)
Console.WriteLine("Read: "+ readCount);
} }
if (readCount == 0) { if (readCount == 0) {