package aoiprxkit import ( "errors" "fmt" "net" "time" ) // Config defines a pragmatic RX-only subset for statically configured AES67-style RTP audio. // It is intentionally narrower than full AES67. type Config struct { MulticastGroup string Port int InterfaceName string PayloadType uint8 SampleRateHz int Channels int Encoding string PacketTime time.Duration JitterDepthPackets int ReadBufferBytes int } func DefaultConfig() Config { return Config{ MulticastGroup: "239.69.0.1", Port: 5004, PayloadType: 97, SampleRateHz: 48000, Channels: 2, Encoding: "L24", PacketTime: time.Millisecond, JitterDepthPackets: 8, ReadBufferBytes: 1 << 20, } } func (c Config) Validate() error { if ip := net.ParseIP(c.MulticastGroup); ip == nil || ip.To4() == nil { return fmt.Errorf("invalid IPv4 multicast group: %q", c.MulticastGroup) } ip := net.ParseIP(c.MulticastGroup).To4() if ip[0] < 224 || ip[0] > 239 { return fmt.Errorf("multicast group must be IPv4 multicast: %q", c.MulticastGroup) } if c.Port < 1 || c.Port > 65535 { return errors.New("port must be 1..65535") } if c.SampleRateHz <= 0 { return errors.New("sample rate must be > 0") } if c.Channels < 1 || c.Channels > 2 { return errors.New("channels must be 1 or 2") } if c.Encoding != "L24" { return fmt.Errorf("unsupported encoding %q: only L24 is currently supported", c.Encoding) } if c.PacketTime <= 0 { return errors.New("packet time must be > 0") } if c.JitterDepthPackets < 1 { return errors.New("jitter depth must be >= 1") } return nil }