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