package main import ( "flag" "fmt" "log" "mxl-player/internal/source" "os" "os/signal" "syscall" "time" ) func main() { domain := flag.String("domain", "/dev/shm/mxl", "MXL domain") flowID := flag.String("flow", "5fbec3b1-1b0f-417d-9059-8b94a47197ed", "Flow UUID") timeout := flag.Duration("timeout", 200*time.Millisecond, "Per-grain read timeout") count := flag.Int("count", 10, "Stop after N grains (0 = run forever)") flag.Parse() src, err := source.Open(*domain, *flowID) if err != nil { log.Fatal(err) } defer src.Close() fmt.Printf("format=%s rate=%d/%d stride=%d grainCount=%d\n", src.Format(), src.Rate().Num, src.Rate().Den, src.Stride(), src.GrainCount()) stop := make(chan os.Signal, 1) signal.Notify(stop, os.Interrupt, syscall.SIGTERM) grains := 0 for { select { case <-stop: fmt.Printf("\nstopping: %d grains read\n", grains) return default: } f, err := src.Next(*timeout) if err != nil { fmt.Fprintln(os.Stderr, err) return } lines := uint32(0) if src.Stride() > 0 { lines = f.Size / src.Stride() } fmt.Printf("idx=%d size=%d (%dx%d, %d lines) invalid=%v\n", f.Index, f.Size, f.Width, f.Height, lines, f.Invalid) grains++ if *count > 0 && grains >= *count { fmt.Printf("done: %d grains read\n", grains) return } } }