// NewPlayer returns a new Player. // It initializes the underlying audio devices and the related resources. // If zero values are provided for format and sample rate values, the player // determines them from the source's WAV header. // An error is returned if the format and sample rate can't be determined. func NewPlayer(src ReadSeekCloser, format Format, samplesPerSecond int64) (*Player, error) { if err := al.OpenDevice(); err != nil { return nil, err } s := al.GenSources(1) if code := al.Error(); code != 0 { return nil, fmt.Errorf("audio: cannot generate an audio source [err=%x]", code) } p := &Player{ t: &track{format: format, src: src, samplesPerSecond: samplesPerSecond}, source: s[0], } if err := p.discoverHeader(); err != nil { return nil, err } if p.t.format == 0 { return nil, errors.New("audio: cannot determine the format") } if p.t.samplesPerSecond == 0 { return nil, errors.New("audio: cannot determine the sample rate") } return p, nil }
// lastErr returns the last error or nil if the last operation // has been succesful. func lastErr() error { if code := al.Error(); code != 0 { return fmt.Errorf("audio: openal failed with %x", code) } return nil }