From 0f57c5d33a86591337662846371853e00e4e92e2 Mon Sep 17 00:00:00 2001 From: Tyler Stiene Date: Thu, 4 Nov 2021 01:21:41 -0400 Subject: [PATCH] improve discord buffer packet drop message kill the bridge if unable to send to discord for 5 seconds --- internal/bridge/bridge.go | 2 +- internal/bridge/mumble.go | 23 +++++++++++++++++++++-- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/internal/bridge/bridge.go b/internal/bridge/bridge.go index f793a48..b36ef6f 100644 --- a/internal/bridge/bridge.go +++ b/internal/bridge/bridge.go @@ -183,7 +183,7 @@ func (b *BridgeState) StartBridge() { // Start Passing Between // From Mumble - go b.MumbleStream.fromMumbleMixer(ctx, &wg, toDiscord) + go b.MumbleStream.fromMumbleMixer(ctx, &wg, cancel, toDiscord) // From Discord b.DiscordStream = &DiscordDuplex{ diff --git a/internal/bridge/mumble.go b/internal/bridge/mumble.go index 609525f..ec4c3a4 100644 --- a/internal/bridge/mumble.go +++ b/internal/bridge/mumble.go @@ -3,6 +3,7 @@ package bridge import ( "context" "log" + "strconv" "sync" "time" @@ -50,12 +51,15 @@ func (m MumbleDuplex) OnAudioStream(e *gumble.AudioStreamEvent) { }() } -func (m MumbleDuplex) fromMumbleMixer(ctx context.Context, wg *sync.WaitGroup, toDiscord chan []int16) { +func (m MumbleDuplex) fromMumbleMixer(ctx context.Context, wg *sync.WaitGroup, cancel context.CancelFunc, toDiscord chan []int16) { mumbleSleepTick.Start(10 * time.Millisecond) sendAudio := false bufferWarning := false + droppingPackets := false + droppingPacketCount := 0 + wg.Add(1) for { @@ -124,9 +128,24 @@ func (m MumbleDuplex) fromMumbleMixer(ctx context.Context, wg *sync.WaitGroup, t promToDiscordBufferSize.Set(float64(len(toDiscord))) select { case toDiscord <- outBuf: + { + if droppingPackets { + log.Println("Discord buffer ok, total packets dropped " + strconv.Itoa(droppingPacketCount)) + droppingPackets = false + } + } default: - log.Println("Error: toDiscord buffer full. Dropping packet") + if !droppingPackets { + log.Println("Error: toDiscord buffer full. Dropping packets") + droppingPackets = true + droppingPacketCount = 0 + } + droppingPacketCount++ promToDiscordDropped.Inc() + if droppingPacketCount > 250 { + log.Println("Discord Timeout") + cancel() + } } discrodSendSleepTick.Notify()