Browse Source

Improved BufferedAudioTarget loop

tags/1.0-rc
RogueException 8 years ago
parent
commit
9cca612468
1 changed files with 9 additions and 15 deletions
  1. +9
    -15
      src/Discord.Net.WebSocket/Audio/Targets/BufferedAudioTarget.cs

+ 9
- 15
src/Discord.Net.WebSocket/Audio/Targets/BufferedAudioTarget.cs View File

@@ -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);
}
});
}


Loading…
Cancel
Save