From 078f866234eb952fec4ad76e0fe16a4dcc221c49 Mon Sep 17 00:00:00 2001 From: Dmitry Sergeev Date: Wed, 26 Aug 2026 23:47:57 +0300 Subject: [PATCH] classify audio open source errors --- internal/source/source.go | 42 ++++++++++++++++++++++++++++++++------- 1 file changed, 35 insertions(+), 7 deletions(-) diff --git a/internal/source/source.go b/internal/source/source.go index 28784d4..5f34696 100644 --- a/internal/source/source.go +++ b/internal/source/source.go @@ -178,36 +178,64 @@ type AudioFrame struct { func OpenAudio(domain, flowID string) (*AudioSource, error) { inst, err := mxl.NewInstance(domain, "") if err != nil { - return nil, fmt.Errorf("NewInstance: %w", err) + return nil, wrapError("new MXL instance", ErrorKindUnavailable, err) } r, err := inst.NewReader(flowID) if err != nil { inst.Close() - return nil, fmt.Errorf("NewReader: %w", err) + return nil, wrapError("open audio reader", ErrorKindUnavailable, err) } info, err := r.Info() if err != nil { r.Close() inst.Close() - return nil, fmt.Errorf("Info: %w", err) + return nil, wrapError("get audio info", ErrorKindUnavailable, err) } if info.Config.Common.Format.IsDiscrete() { r.Close() inst.Close() - return nil, fmt.Errorf("flow is discrete (not audio)") + return nil, wrapError( + "validate audio flow", + ErrorKindInvalidConfig, + errors.New("audio flow is discrete"), + ) + } + channels := uint64(info.Config.Continuous.ChannelCount) + if channels == 0 { + r.Close() + inst.Close() + return nil, wrapError( + "validate audio flow", + ErrorKindInvalidConfig, + errors.New("audio flow has no channels"), + ) + } + rate := info.Config.Common.GrainRate + if rate.Num <= 0 || rate.Den <= 0 { + r.Close() + inst.Close() + return nil, wrapError( + "validate audio flow", + ErrorKindInvalidConfig, + fmt.Errorf("invalid audio rate: %d/%d", rate.Num, rate.Den), + ) } idx := info.Runtime.HeadIndex if idx == 0 { r.Close() inst.Close() - return nil, fmt.Errorf("flow has no head yet (no producer?)") + return nil, wrapError( + "open audio reader", + ErrorKindUnavailable, + errors.New("audio flow has no producer data"), + ) } return &AudioSource{ inst: inst, r: r, info: info, - rate: info.Config.Common.GrainRate, - chans: uint64(info.Config.Continuous.ChannelCount), + rate: rate, + chans: channels, idx: idx, }, nil }