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//go:build darwin || (linux && !android) || windows 6// +build darwin linux,!android windows 7 8package al 9 10/* 11#cgo darwin CFLAGS: -DGOOS_darwin 12#cgo linux CFLAGS: -DGOOS_linux 13#cgo windows CFLAGS: -DGOOS_windows 14#cgo darwin LDFLAGS: -framework OpenAL 15#cgo linux LDFLAGS: -lopenal 16#cgo windows LDFLAGS: -lOpenAL32 17 18#ifdef GOOS_darwin 19#include <stdlib.h> 20#include <OpenAL/al.h> 21#endif 22 23#ifdef GOOS_linux 24#include <stdlib.h> 25#include <AL/al.h> // install on Ubuntu with: sudo apt-get install libopenal-dev 26#endif 27 28#ifdef GOOS_windows 29#include <windows.h> 30#include <stdlib.h> 31#include <AL/al.h> 32#endif 33*/ 34import "C" 35import "unsafe" 36 37func alEnable(capability int32) { 38 C.alEnable(C.ALenum(capability)) 39} 40 41func alDisable(capability int32) { 42 C.alDisable(C.ALenum(capability)) 43} 44 45func alIsEnabled(capability int32) bool { 46 return C.alIsEnabled(C.ALenum(capability)) == C.AL_TRUE 47} 48 49func alGetInteger(k int) int32 { 50 return int32(C.alGetInteger(C.ALenum(k))) 51} 52 53func alGetIntegerv(k int, v []int32) { 54 C.alGetIntegerv(C.ALenum(k), (*C.ALint)(unsafe.Pointer(&v[0]))) 55} 56 57func alGetFloat(k int) float32 { 58 return float32(C.alGetFloat(C.ALenum(k))) 59} 60 61func alGetFloatv(k int, v []float32) { 62 C.alGetFloatv(C.ALenum(k), (*C.ALfloat)(unsafe.Pointer(&v[0]))) 63} 64 65func alGetBoolean(k int) bool { 66 return C.alGetBoolean(C.ALenum(k)) == C.AL_TRUE 67} 68 69func alGetBooleanv(k int, v []bool) { 70 val := make([]C.ALboolean, len(v)) 71 for i, bv := range v { 72 if bv { 73 val[i] = C.AL_TRUE 74 } else { 75 val[i] = C.AL_FALSE 76 } 77 } 78 C.alGetBooleanv(C.ALenum(k), &val[0]) 79} 80 81func alGetString(v int) string { 82 value := C.alGetString(C.ALenum(v)) 83 return C.GoString((*C.char)(value)) 84} 85 86func alDistanceModel(v int32) { 87 C.alDistanceModel(C.ALenum(v)) 88} 89 90func alDopplerFactor(v float32) { 91 C.alDopplerFactor(C.ALfloat(v)) 92} 93 94func alDopplerVelocity(v float32) { 95 C.alDopplerVelocity(C.ALfloat(v)) 96} 97 98func alSpeedOfSound(v float32) { 99 C.alSpeedOfSound(C.ALfloat(v)) 100} 101 102func alGetError() int32 { 103 return int32(C.alGetError()) 104} 105 106func alGenSources(n int) []Source { 107 s := make([]Source, n) 108 C.alGenSources(C.ALsizei(n), (*C.ALuint)(unsafe.Pointer(&s[0]))) 109 return s 110} 111 112func alSourcePlayv(s []Source) { 113 C.alSourcePlayv(C.ALsizei(len(s)), (*C.ALuint)(unsafe.Pointer(&s[0]))) 114} 115 116func alSourcePausev(s []Source) { 117 C.alSourcePausev(C.ALsizei(len(s)), (*C.ALuint)(unsafe.Pointer(&s[0]))) 118 119} 120 121func alSourceStopv(s []Source) { 122 C.alSourceStopv(C.ALsizei(len(s)), (*C.ALuint)(unsafe.Pointer(&s[0]))) 123} 124 125func alSourceRewindv(s []Source) { 126 C.alSourceRewindv(C.ALsizei(len(s)), (*C.ALuint)(unsafe.Pointer(&s[0]))) 127} 128 129func alDeleteSources(s []Source) { 130 C.alDeleteSources(C.ALsizei(len(s)), (*C.ALuint)(unsafe.Pointer(&s[0]))) 131} 132 133func alGetSourcei(s Source, k int) int32 { 134 var v C.ALint 135 C.alGetSourcei(C.ALuint(s), C.ALenum(k), &v) 136 return int32(v) 137} 138 139func alGetSourcef(s Source, k int) float32 { 140 var v C.ALfloat 141 C.alGetSourcef(C.ALuint(s), C.ALenum(k), &v) 142 return float32(v) 143} 144 145func alGetSourcefv(s Source, k int, v []float32) { 146 C.alGetSourcefv(C.ALuint(s), C.ALenum(k), (*C.ALfloat)(unsafe.Pointer(&v[0]))) 147} 148 149func alSourcei(s Source, k int, v int32) { 150 C.alSourcei(C.ALuint(s), C.ALenum(k), C.ALint(v)) 151} 152 153func alSourcef(s Source, k int, v float32) { 154 C.alSourcef(C.ALuint(s), C.ALenum(k), C.ALfloat(v)) 155} 156 157func alSourcefv(s Source, k int, v []float32) { 158 C.alSourcefv(C.ALuint(s), C.ALenum(k), (*C.ALfloat)(unsafe.Pointer(&v[0]))) 159} 160 161func alSourceQueueBuffers(s Source, b []Buffer) { 162 C.alSourceQueueBuffers(C.ALuint(s), C.ALsizei(len(b)), (*C.ALuint)(unsafe.Pointer(&b[0]))) 163} 164 165func alSourceUnqueueBuffers(s Source, b []Buffer) { 166 C.alSourceUnqueueBuffers(C.ALuint(s), C.ALsizei(len(b)), (*C.ALuint)(unsafe.Pointer(&b[0]))) 167} 168 169func alGetListenerf(k int) float32 { 170 var v C.ALfloat 171 C.alGetListenerf(C.ALenum(k), &v) 172 return float32(v) 173} 174 175func alGetListenerfv(k int, v []float32) { 176 C.alGetListenerfv(C.ALenum(k), (*C.ALfloat)(unsafe.Pointer(&v[0]))) 177} 178 179func alListenerf(k int, v float32) { 180 C.alListenerf(C.ALenum(k), C.ALfloat(v)) 181} 182 183func alListenerfv(k int, v []float32) { 184 C.alListenerfv(C.ALenum(k), (*C.ALfloat)(unsafe.Pointer(&v[0]))) 185} 186 187func alGenBuffers(n int) []Buffer { 188 s := make([]Buffer, n) 189 C.alGenBuffers(C.ALsizei(n), (*C.ALuint)(unsafe.Pointer(&s[0]))) 190 return s 191} 192 193func alDeleteBuffers(b []Buffer) { 194 C.alDeleteBuffers(C.ALsizei(len(b)), (*C.ALuint)(unsafe.Pointer(&b[0]))) 195} 196 197func alGetBufferi(b Buffer, k int) int32 { 198 var v C.ALint 199 C.alGetBufferi(C.ALuint(b), C.ALenum(k), &v) 200 return int32(v) 201} 202 203func alBufferData(b Buffer, format uint32, data []byte, freq int32) { 204 C.alBufferData(C.ALuint(b), C.ALenum(format), unsafe.Pointer(&data[0]), C.ALsizei(len(data)), C.ALsizei(freq)) 205} 206 207func alIsBuffer(b Buffer) bool { 208 return C.alIsBuffer(C.ALuint(b)) == C.AL_TRUE 209} 210