2
0
mirror of synced 2025-02-24 07:18:15 +00:00
mobile/exp/audio/al/alc.go
Jean-André Santoni 269a7ef90d exp/audio/al: add windows support
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>
2018-05-22 19:29:39 +00:00

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
}