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-12-29 18:19:44 -05:00
|
|
|
|
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()
|
|
|
|
|
2021-01-19 01:06:08 -05:00
|
|
|
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)
|
2021-01-19 01:06:08 -05:00
|
|
|
}()
|
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) {
|
2020-10-29 02:21:07 -04:00
|
|
|
ticker := time.NewTicker(10 * time.Millisecond)
|
|
|
|
sendAudio := false
|
2021-02-01 16:03:38 -05:00
|
|
|
wg.Add(1)
|
2020-10-29 02:21:07 -04:00
|
|
|
|
|
|
|
for {
|
2020-12-29 18:19:44 -05:00
|
|
|
select {
|
2021-02-01 16:03:38 -05:00
|
|
|
case <-ctx.Done():
|
|
|
|
wg.Done()
|
2020-12-29 18:19:44 -05:00
|
|
|
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]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if sendAudio {
|
2020-11-04 01:12:43 -05:00
|
|
|
select {
|
|
|
|
case toDiscord <- outBuf:
|
|
|
|
default:
|
|
|
|
log.Println("toDiscord buffer full. Dropping packet")
|
|
|
|
}
|
2020-10-29 02:21:07 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|