audio/audio.go
func NewPlayer(context *Context, src io.ReadCloser) (*Player, error) {
	p := &Player{
		&playerImpl{
			context:    context,
			src:        src,
			sampleRate: context.sampleRate,
			volume:     1,
		},
	}
	if seeker, ok := p.p.src.(io.Seeker); ok {
		// Get the current position of the source.
		pos, err := seeker.Seek(0, io.SeekCurrent)
		if err != nil {
			return nil, err
		}
		p.p.pos = pos
	}
	runtime.SetFinalizer(p, (*Player).finalize)

	return p, nil
}
func NewPlayer(context *Context, src io.ReadCloser) (*Player, error) {
	p := &Player{
		&playerImpl{
			context:    context,
			src:        src,
			sampleRate: context.sampleRate,
			volume:     1,
		},
	}
	if seeker, ok := p.p.src.(io.Seeker); ok {
		// Get the current position of the source.
		pos, err := seeker.Seek(0, io.SeekCurrent)
		if err != nil {
			return nil, err
		}
		p.p.pos = pos
	}
	runtime.SetFinalizer(p, (*Player).finalize)

	return p, nil
}
// NewPlayer creates a new player with the given stream.
//
// src's format must be linear PCM (16bits little endian, 2 channel stereo)
// without a header (e.g. RIFF header).
// The sample rate must be same as that of the audio context.
//
// The player is seekable when src is io.Seeker.
// Attempt to seek the player that is not io.Seeker causes panic.
//
// Note that the given src can't be shared with other Player objects.
//
// NewPlayer tries to call Seek of src to get the current position.
// NewPlayer returns error when the Seek returns error.
//
// NewPlayer takes the ownership of src. Player's Close calls src's Close.