Tested on Win64 with mingw-w64 and http://kcat.strangesoft.net/openal-binaries/openal-soft-1.18.2-bin.zip Change-Id: Iec1bf3c0898310878133dc6d9ecfb8781b410347 GitHub-Last-Rev: a71e8eb2b9046b499e1a1911e55cc2534aff8e71 GitHub-Pull-Request: golang/mobile#18 Reviewed-on: https://go-review.googlesource.com/114003 Reviewed-by: Elias Naur <elias.naur@gmail.com>
75 lines
1.4 KiB
Go
75 lines
1.4 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 windows
|
|
|
|
package al
|
|
|
|
import (
|
|
"errors"
|
|
"sync"
|
|
"unsafe"
|
|
)
|
|
|
|
var (
|
|
mu sync.Mutex
|
|
device unsafe.Pointer
|
|
context unsafe.Pointer
|
|
)
|
|
|
|
// DeviceError returns the last known error from the current device.
|
|
func DeviceError() int32 {
|
|
return alcGetError(device)
|
|
}
|
|
|
|
// 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
|
|
}
|
|
|
|
dev := alcOpenDevice("")
|
|
if dev == nil {
|
|
return errors.New("al: cannot open the default audio device")
|
|
}
|
|
ctx := alcCreateContext(dev, nil)
|
|
if ctx == nil {
|
|
alcCloseDevice(dev)
|
|
return errors.New("al: cannot create a new context")
|
|
}
|
|
if !alcMakeContextCurrent(ctx) {
|
|
alcCloseDevice(dev)
|
|
return errors.New("al: cannot make context current")
|
|
}
|
|
device = dev
|
|
context = ctx
|
|
return nil
|
|
}
|
|
|
|
// 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 {
|
|
return
|
|
}
|
|
|
|
alcCloseDevice(device)
|
|
if context != nil {
|
|
alcDestroyContext(context)
|
|
}
|
|
device = nil
|
|
context = nil
|
|
}
|