1
0
mirror of https://github.com/stryan/mumble-discord-bridge.git synced 2024-11-16 20:15:40 -05:00
mumble-discord-bridge/mumble.go

118 lines
2.4 KiB
Go
Raw Normal View History

2020-10-29 02:21:07 -04:00
package main
import (
2021-02-01 16:03:38 -05:00
"context"
2020-10-29 02:21:07 -04:00
"log"
"sync"
"time"
"layeh.com/gumble/gumble"
_ "layeh.com/gumble/opus"
)
var mutex sync.Mutex
var fromMumbleArr []chan gumble.AudioBuffer
var mumbleStreamingArr []bool
// MumbleDuplex - listenera and outgoing
2021-02-01 16:03:38 -05:00
type MumbleDuplex struct{}
2020-10-29 02:21:07 -04:00
// OnAudioStream - Spawn routines to handle incoming packets
func (m MumbleDuplex) OnAudioStream(e *gumble.AudioStreamEvent) {
// hold a reference ot the channel in the closure
localMumbleArray := make(chan gumble.AudioBuffer, 100)
mutex.Lock()
fromMumbleArr = append(fromMumbleArr, localMumbleArray)
mumbleStreamingArr = append(mumbleStreamingArr, false)
mutex.Unlock()
go func() {
2021-04-06 22:34:38 -04:00
name := e.User.Name
log.Println("new mumble audio stream", name)
for p := range e.C {
// log.Println("audio packet", p.Sender.Name, len(p.AudioBuffer))
// 480 per 10ms
for i := 0; i < len(p.AudioBuffer)/480; i++ {
localMumbleArray <- p.AudioBuffer[480*i : 480*(i+1)]
2020-10-29 02:21:07 -04:00
}
}
2021-04-06 22:34:38 -04:00
log.Println("mumble audio stream ended", name)
}()
2020-10-29 02:21:07 -04:00
}
2021-02-01 16:03:38 -05:00
func (m MumbleDuplex) fromMumbleMixer(ctx context.Context, wg *sync.WaitGroup, toDiscord chan []int16) {
2021-04-15 00:43:12 -04:00
ticker := NewTickerCT(10 * time.Millisecond)
2020-10-29 02:21:07 -04:00
sendAudio := false
2021-04-15 00:43:12 -04:00
bufferWarning := false
2021-02-01 16:03:38 -05:00
wg.Add(1)
2020-10-29 02:21:07 -04:00
for {
select {
2021-02-01 16:03:38 -05:00
case <-ctx.Done():
wg.Done()
return
default:
}
2021-02-01 16:03:38 -05:00
2020-10-29 02:21:07 -04:00
<-ticker.C
mutex.Lock()
sendAudio = false
internalMixerArr := make([]gumble.AudioBuffer, 0)
// Work through each channel
for i := 0; i < len(fromMumbleArr); i++ {
if len(fromMumbleArr[i]) > 0 {
sendAudio = true
2021-04-06 22:34:38 -04:00
if !mumbleStreamingArr[i] {
2020-10-29 02:21:07 -04:00
mumbleStreamingArr[i] = true
// log.Println("mumble starting", i)
}
x1 := (<-fromMumbleArr[i])
internalMixerArr = append(internalMixerArr, x1)
} else {
2021-04-06 22:34:38 -04:00
if mumbleStreamingArr[i] {
2020-10-29 02:21:07 -04:00
mumbleStreamingArr[i] = false
// log.Println("mumble stopping", i)
}
}
}
mutex.Unlock()
outBuf := make([]int16, 480)
for i := 0; i < len(outBuf); i++ {
for j := 0; j < len(internalMixerArr); j++ {
outBuf[i] += (internalMixerArr[j])[i]
}
}
2021-04-08 01:14:24 -04:00
if len(toDiscord) > 20 {
2021-04-15 00:43:12 -04:00
if !bufferWarning {
log.Println("Warning: toDiscord buffer size")
bufferWarning = true
}
} else {
if bufferWarning {
log.Println("Resolved: toDiscord buffer size")
bufferWarning = false
}
2021-04-08 01:14:24 -04:00
}
2020-10-29 02:21:07 -04:00
if sendAudio {
select {
case toDiscord <- outBuf:
default:
2021-04-15 00:43:12 -04:00
log.Println("Error: toDiscord buffer full. Dropping packet")
}
2020-10-29 02:21:07 -04:00
}
}
}