This CL is a followup of CL/11315 where it is suggested to remove Context pointer types from the signatures. Change-Id: Ice68bfabad0e345f7d93102257a99402be8760b5 Reviewed-on: https://go-review.googlesource.com/11560 Reviewed-by: Nigel Tao <nigeltao@golang.org>
90 lines
2.1 KiB
Go
90 lines
2.1 KiB
Go
// Copyright 2015 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
// +build darwin linux
|
|
|
|
package al
|
|
|
|
import (
|
|
"errors"
|
|
"sync"
|
|
"unsafe"
|
|
)
|
|
|
|
var (
|
|
mu sync.Mutex // mu protects device.
|
|
|
|
// device is the currently open audio device or nil.
|
|
device unsafe.Pointer
|
|
)
|
|
|
|
// DeviceError returns the last known error from the current device.
|
|
func DeviceError() int32 {
|
|
return alcGetError(device)
|
|
}
|
|
|
|
// Context represents an OpenAL context. The listener always
|
|
// operates on the current context. In order to make a context
|
|
// current, use MakeContextCurrent.
|
|
type Context struct {
|
|
ptr unsafe.Pointer
|
|
}
|
|
|
|
// TODO(jbd): Investigate the cases where multiple audio output
|
|
// devices might be needed.
|
|
|
|
// OpenDevice opens the default audio device.
|
|
// Calls to OpenDevice are safe for concurrent use.
|
|
func OpenDevice() error {
|
|
mu.Lock()
|
|
defer mu.Unlock()
|
|
|
|
// already opened
|
|
if device != nil {
|
|
return nil
|
|
}
|
|
|
|
ptr := alcOpenDevice("")
|
|
if ptr == nil {
|
|
return errors.New("al: cannot open the default audio device")
|
|
}
|
|
device = ptr
|
|
return nil
|
|
}
|
|
|
|
// CreateContext creates a new context.
|
|
func CreateContext() (Context, error) {
|
|
ctx := alcCreateContext(device, nil)
|
|
if ctx == nil {
|
|
return Context{}, errors.New("al: cannot create a new context")
|
|
}
|
|
return Context{ptr: ctx}, nil
|
|
}
|
|
|
|
// Destroy destroys the context and frees the underlying resources.
|
|
// The current context cannot be destroyed. Use MakeContextCurrent
|
|
// to make a new context current or use nil.
|
|
func (c Context) Destroy() {
|
|
alcDestroyContext(c.ptr)
|
|
}
|
|
|
|
// MakeContextCurrent makes the given context current. Calls to
|
|
// MakeContextCurrent can accept a zero value Context to allow
|
|
// a program not to have an active current context.
|
|
func MakeContextCurrent(c Context) bool {
|
|
return alcMakeContextCurrent(c.ptr)
|
|
}
|
|
|
|
// CloseDevice closes the device and frees related resources.
|
|
// Calls to CloseDevice are safe for concurrent use.
|
|
func CloseDevice() {
|
|
mu.Lock()
|
|
defer mu.Unlock()
|
|
|
|
if device != nil {
|
|
alcCloseDevice(device)
|
|
device = nil
|
|
}
|
|
}
|