classify audio open source errors
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user