github.com/SkycoinProject/gomobile@v0.0.0-20190312151609-d3739f865fa6/exp/audio/al/alc.go (about) 1 // Copyright 2015 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // +build darwin linux windows 6 7 package al 8 9 import ( 10 "errors" 11 "sync" 12 "unsafe" 13 ) 14 15 var ( 16 mu sync.Mutex 17 device unsafe.Pointer 18 context unsafe.Pointer 19 ) 20 21 // DeviceError returns the last known error from the current device. 22 func DeviceError() int32 { 23 return alcGetError(device) 24 } 25 26 // TODO(jbd): Investigate the cases where multiple audio output 27 // devices might be needed. 28 29 // OpenDevice opens the default audio device. 30 // Calls to OpenDevice are safe for concurrent use. 31 func OpenDevice() error { 32 mu.Lock() 33 defer mu.Unlock() 34 35 // already opened 36 if device != nil { 37 return nil 38 } 39 40 dev := alcOpenDevice("") 41 if dev == nil { 42 return errors.New("al: cannot open the default audio device") 43 } 44 ctx := alcCreateContext(dev, nil) 45 if ctx == nil { 46 alcCloseDevice(dev) 47 return errors.New("al: cannot create a new context") 48 } 49 if !alcMakeContextCurrent(ctx) { 50 alcCloseDevice(dev) 51 return errors.New("al: cannot make context current") 52 } 53 device = dev 54 context = ctx 55 return nil 56 } 57 58 // CloseDevice closes the device and frees related resources. 59 // Calls to CloseDevice are safe for concurrent use. 60 func CloseDevice() { 61 mu.Lock() 62 defer mu.Unlock() 63 64 if device == nil { 65 return 66 } 67 68 alcCloseDevice(device) 69 if context != nil { 70 alcDestroyContext(context) 71 } 72 device = nil 73 context = nil 74 }