package main import ( "context" "flag" "fmt" "log" "os/signal" "syscall" "time" "aoiprxkit" ) func main() { mode := flag.String("mode", "rtp", "rtp|sap") group := flag.String("group", "239.69.0.1", "IPv4 multicast group") port := flag.Int("port", 5004, "UDP port") iface := flag.String("iface", "", "network interface name") pt := flag.Int("pt", 97, "expected RTP payload type") rate := flag.Int("rate", 48000, "sample rate") ch := flag.Int("ch", 2, "channels") flag.Parse() ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM) defer stop() switch *mode { case "sap": listener, err := aoiprxkit.NewSAPListener(aoiprxkit.SAPListenerConfig{ Group: aoiprxkit.DefaultSAPGroup, Port: aoiprxkit.DefaultSAPPort, InterfaceName: *iface, ReadBuffer: 1 << 20, }, func(a aoiprxkit.SAPAnnouncement) { fmt.Printf("SAP session: name=%q group=%s port=%d pt=%d encoding=%s rate=%d ch=%d delete=%v\n", a.ParsedSDP.SessionName, a.ParsedSDP.MulticastGroup, a.ParsedSDP.Port, a.ParsedSDP.PayloadType, a.ParsedSDP.Encoding, a.ParsedSDP.SampleRateHz, a.ParsedSDP.Channels, a.Delete, ) }) if err != nil { log.Fatal(err) } if err := listener.Start(ctx); err != nil { log.Fatal(err) } defer listener.Stop() <-ctx.Done() default: cfg := aoiprxkit.DefaultConfig() cfg.MulticastGroup = *group cfg.Port = *port cfg.InterfaceName = *iface cfg.PayloadType = uint8(*pt) cfg.SampleRateHz = *rate cfg.Channels = *ch var packets uint64 rx, err := aoiprxkit.NewReceiver(cfg, func(frame aoiprxkit.PCMFrame) { packets++ if packets%100 == 0 { fmt.Printf("delivered packet seq=%d ts=%d samples=%d source=%s\n", frame.SequenceNumber, frame.Timestamp, len(frame.Samples), frame.Source) } }) if err != nil { log.Fatal(err) } if err := rx.Start(ctx); err != nil { log.Fatal(err) } defer rx.Stop() ticker := time.NewTicker(2 * time.Second) defer ticker.Stop() for { select { case <-ctx.Done(): fmt.Println("stopping") return case <-ticker.C: fmt.Printf("stats: %+v\n", rx.Stats()) } } } }