broadcast/broadcast/main.go

105 lines
2.4 KiB
Go

package main
import (
"io"
"os"
"time"
"crypto/tls"
"fmt"
"github.com/sunicy/go-lame"
"net"
"layeh.com/gumble/gumble"
"layeh.com/gumble/gumbleutil"
_ "layeh.com/gumble/opus" // it's a good idea to load this: botamusique crashes because of a CodecNotSupportedError EXception
)
func audiolistener(e *gumble.AudioStreamEvent) {
}
type AudioListener struct {
name string
}
func (audiolistener AudioListener) OnAudioStream(e *gumble.AudioStreamEvent) {
fmt.Printf("Received AudioStreamEvent from %s\n", e.User.Name)
// fmt.Printf("%+v\n", e.User.Name)
// fmt.Printf(audio.Sender.Name)
go ReadPacket(e.C)
}
func PcmToMp3(pcmFileName, mp3FileName string) {
pcmFile, _ := os.OpenFile(pcmFileName, os.O_RDONLY, 0555)
mp3File, _ := os.OpenFile(mp3FileName, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0755)
defer mp3File.Close()
wr, err := lame.NewWriter(mp3File)
if err != nil {
panic("cannot create lame writer, err: " + err.Error())
}
io.Copy(wr, pcmFile)
wr.Close()
}
type AudioEncoder struct {
}
// func (e AudioEncoder) Encode(pcm []int16, mframeSize, maxDataBytes int) ([]byte, error) {
// TODO: WRITE THIS ENCODER AND WRITE THE OUTPUTS TO SOME FILE (RECORDING)
// return []byte, nil
// }
func (e AudioEncoder) ID() {
}
func (e AudioEncoder) Reset() {
}
func ReadPacket(ch <-chan *gumble.AudioPacket) { // receive-only channel
pcm_out, _ := os.OpenFile("pcm_out.raw", os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0755)
defer pcm_out.Close()
//func (f *File) Write(b []byte) (n int, err error)
for packet := range ch {
fmt.Println(packet.Sender.Name)
// fmt.Printf("%:+v\n", packet)
// pkt := <-ch
// buf := pkt.AudioBuffer
// pcm_out.Write(UnsafeCastInt16sToBytes(buf))
}
}
func main() {
config := gumble.NewConfig()
config.Username = "bon-bot"
config.Attach(gumbleutil.Listener{
TextMessage: func(e *gumble.TextMessageEvent) {
fmt.Printf("Received text message: %s\n", e.Message)
},
})
l := AudioListener{name: "Eventprinter"}
config.AttachAudio(l)
client, err := gumble.DialWithDialer(&net.Dialer{}, "mumble:64738", config, &tls.Config{InsecureSkipVerify: true}) // TODO: fix cert or make it an option
if err != nil {
panic(err)
}
// var message TextMessage
//gumble.AudioListener
fmt.Printf("Channels:\n")
for idx, channel := range client.Channels {
fmt.Printf("\t%d - %s\n", idx, channel.Name)
}
for {
time.Sleep(1 * time.Second)
}
}