Improved BufferedAudioTarget loop
This commit is contained in:
@@ -18,8 +18,7 @@ namespace Discord.Audio
|
||||
internal BufferedAudioTarget(DiscordVoiceAPIClient client, int samplesPerFrame, CancellationToken cancelToken)
|
||||
{
|
||||
_client = client;
|
||||
double milliseconds = samplesPerFrame / 48.0;
|
||||
double ticksPerFrame = Stopwatch.Frequency / 1000.0 * milliseconds;
|
||||
long ticksPerFrame = samplesPerFrame / 48;
|
||||
|
||||
_cancelTokenSource = new CancellationTokenSource();
|
||||
cancelToken = CancellationTokenSource.CreateLinkedTokenSource(_cancelTokenSource.Token, cancelToken).Token;
|
||||
@@ -28,31 +27,26 @@ namespace Discord.Audio
|
||||
_task = Run(ticksPerFrame, cancelToken);
|
||||
}
|
||||
|
||||
private Task Run(double ticksPerFrame, CancellationToken cancelToken)
|
||||
private Task Run(long ticksPerFrame, CancellationToken cancelToken)
|
||||
{
|
||||
return Task.Run(async () =>
|
||||
{
|
||||
var stopwatch = Stopwatch.StartNew();
|
||||
long lastTick = stopwatch.ElapsedTicks;
|
||||
double ticksPerMilli = Stopwatch.Frequency / 1000.0;
|
||||
long nextTick = Environment.TickCount;
|
||||
while (!cancelToken.IsCancellationRequested)
|
||||
{
|
||||
long thisTick = stopwatch.ElapsedTicks;
|
||||
double remaining = ticksPerFrame - (thisTick - lastTick);
|
||||
if (remaining <= 0)
|
||||
long tick = Environment.TickCount;
|
||||
long dist = nextTick - tick;
|
||||
if (dist <= 0)
|
||||
{
|
||||
byte[] buffer;
|
||||
if (_queue.TryDequeue(out buffer))
|
||||
await _client.SendAsync(buffer, buffer.Length).ConfigureAwait(false);
|
||||
else
|
||||
await _client.SendAsync(_silencePacket, _silencePacket.Length).ConfigureAwait(false);
|
||||
lastTick = thisTick;
|
||||
}
|
||||
else if (remaining > 1)
|
||||
{
|
||||
int millis = (int)Math.Floor(remaining / ticksPerMilli);
|
||||
await Task.Delay(millis).ConfigureAwait(false);
|
||||
nextTick += ticksPerFrame;
|
||||
}
|
||||
else if (dist > 1)
|
||||
await Task.Delay((int)dist).ConfigureAwait(false);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user