Name = flag.String("name", "test", "username")
Room = flag.String("room", "/", "room name")
Muted bool
+ Ctrl = make(chan []byte)
)
func incr(data []byte) {
panic("overflow")
}
+func muteToggle() (muted bool) {
+ Muted = !Muted
+ if Ctrl != nil {
+ var cmd string
+ if Muted {
+ cmd = vors.CmdMuted
+ } else {
+ cmd = vors.CmdUnmuted
+ }
+ Ctrl <- vors.ArgsEncode([]byte(cmd))
+ }
+ return Muted
+}
+
func main() {
srvAddr := flag.String("srv", "vors.home.arpa:"+strconv.Itoa(vors.DefaultPort),
"host:TCP/UDP port to connect to")
playCmd := flag.String("play", "play "+vors.SoxParams, "play command")
vadRaw := flag.Uint("vad", 0, "VAD threshold")
passwd := flag.String("passwd", "", "protected room's password")
- muteToggle := flag.String("mute-toggle", "", "path to FIFO to toggle mute")
+ muteTogglePth := flag.String("mute-toggle", "",
+ "path to FIFO to toggle mute")
prefer4 := flag.Bool("4", false,
"Prefer obsolete legacy IPv4 address during name resolution")
version := flag.Bool("version", false, "print version")
*Name = strings.ReplaceAll(*Name, " ", "-")
go func() {
- if *muteToggle == "" {
+ if *muteTogglePth == "" {
return
}
for {
- fd, err := os.OpenFile(*muteToggle, os.O_WRONLY, os.FileMode(0666))
+ fd, err := os.OpenFile(*muteTogglePth, os.O_WRONLY, os.FileMode(0666))
if err != nil {
log.Fatalln(err)
}
- Muted = !Muted
var reply string
- if Muted {
+ if muteToggle() {
reply = "muted"
} else {
reply = "unmuted"
}()
go func() {
- for {
- time.Sleep(vors.PingTime)
- buf, err := txCS.Encrypt(nil, nil, vors.ArgsEncode(
- []byte(vors.CmdPing),
- ))
+ for buf := range Ctrl {
+ buf, err = txCS.Encrypt(nil, nil, buf)
if err != nil {
log.Fatalln("tx encrypt:", err)
}
}
}()
+ go func() {
+ for {
+ time.Sleep(vors.PingTime)
+ Ctrl <- vors.ArgsEncode([]byte(vors.CmdPing))
+ }
+ }()
+
go func(seen *time.Time) {
var now time.Time
for buf := range rx {
delete(Streams, sid)
close(s.in)
close(s.stats.dead)
+ case vors.CmdMuted:
+ sid := args[1][0]
+ s := Streams[sid]
+ if s == nil {
+ log.Println("unknown sid:", sid)
+ continue
+ }
+ s.stats.muted = true
+ case vors.CmdUnmuted:
+ sid := args[1][0]
+ s := Streams[sid]
+ if s == nil {
+ log.Println("unknown sid:", sid)
+ continue
+ }
+ s.stats.muted = false
default:
log.Fatal("unexpected cmd:", cmd)
}
logger.Error("empty args")
break
}
+ seen = time.Now()
switch cmd := string(args[0]); cmd {
case vors.CmdPing:
- seen = time.Now()
peer.tx <- vors.ArgsEncode([]byte(vors.CmdPong))
+ case vors.CmdMuted:
+ peer.muted = true
+ s := vors.ArgsEncode([]byte(vors.CmdMuted), []byte{peer.sid})
+ for _, p := range room.peers {
+ if p.sid == peer.sid {
+ continue
+ }
+ go func(tx chan []byte) { tx <- s }(p.tx)
+ }
+ case vors.CmdUnmuted:
+ peer.muted = false
+ s := vors.ArgsEncode([]byte(vors.CmdUnmuted), []byte{peer.sid})
+ for _, p := range room.peers {
+ if p.sid == peer.sid {
+ continue
+ }
+ go func(tx chan []byte) { tx <- s }(p.tx)
+ }
default:
logger.Error("unknown", "cmd", cmd)
}