Refactoring #3

Merged
itten merged 87 commits from refactoring into main 2026-09-01 23:52:36 +03:00
Showing only changes of commit 078f866234 - Show all commits
+35 -7
View File
@@ -178,36 +178,64 @@ type AudioFrame struct {
func OpenAudio(domain, flowID string) (*AudioSource, error) { func OpenAudio(domain, flowID string) (*AudioSource, error) {
inst, err := mxl.NewInstance(domain, "") inst, err := mxl.NewInstance(domain, "")
if err != nil { if err != nil {
return nil, fmt.Errorf("NewInstance: %w", err) return nil, wrapError("new MXL instance", ErrorKindUnavailable, err)
} }
r, err := inst.NewReader(flowID) r, err := inst.NewReader(flowID)
if err != nil { if err != nil {
inst.Close() inst.Close()
return nil, fmt.Errorf("NewReader: %w", err) return nil, wrapError("open audio reader", ErrorKindUnavailable, err)
} }
info, err := r.Info() info, err := r.Info()
if err != nil { if err != nil {
r.Close() r.Close()
inst.Close() inst.Close()
return nil, fmt.Errorf("Info: %w", err) return nil, wrapError("get audio info", ErrorKindUnavailable, err)
} }
if info.Config.Common.Format.IsDiscrete() { if info.Config.Common.Format.IsDiscrete() {
r.Close() r.Close()
inst.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 idx := info.Runtime.HeadIndex
if idx == 0 { if idx == 0 {
r.Close() r.Close()
inst.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{ return &AudioSource{
inst: inst, inst: inst,
r: r, r: r,
info: info, info: info,
rate: info.Config.Common.GrainRate, rate: rate,
chans: uint64(info.Config.Continuous.ChannelCount), chans: channels,
idx: idx, idx: idx,
}, nil }, nil
} }