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