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