al.go 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876
  1. // Copyright 2016 The G3N 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. // Package al implements the Go bindings of a subset of the functions of the OpenAL C library.
  5. // The OpenAL documentation can be accessed at https://openal.org/documentation/
  6. package al
  7. // #cgo darwin,amd64 CFLAGS: -DGO_DARWIN -I/usr/local/opt/openal-soft/include/AL -I/usr/include/AL
  8. // #cgo darwin,arm64 CFLAGS: -DGO_DARWIN -I/opt/homebrew/opt/openal-soft/include/AL
  9. // #cgo freebsd CFLAGS: -DGO_FREEBSD -I/usr/local/include/AL
  10. // #cgo linux CFLAGS: -DGO_LINUX -I/usr/include/AL
  11. // #cgo windows CFLAGS: -DGO_WINDOWS -I${SRCDIR}/../windows/openal-soft-1.18.2/include/AL
  12. // #cgo darwin,amd64 LDFLAGS: -L/usr/local/opt/openal-soft/lib -lopenal
  13. // #cgo darwin,arm64 LDFLAGS: -L/opt/homebrew/opt/openal-soft/lib -lopenal
  14. // #cgo freebsd LDFLAGS: -L/usr/local/lib -lopenal
  15. // #cgo linux LDFLAGS: -lopenal
  16. // #cgo windows LDFLAGS: -L${SRCDIR}/../windows/bin -lOpenAL32
  17. // #include <stdlib.h>
  18. // #include "al.h"
  19. // #include "alc.h"
  20. // #include "efx.h"
  21. import "C"
  22. import (
  23. "fmt"
  24. "unsafe"
  25. )
  26. // AL constants
  27. const (
  28. None = C.AL_NONE
  29. False = C.AL_FALSE
  30. True = C.AL_TRUE
  31. SourceRelative = C.AL_SOURCE_RELATIVE
  32. ConeInnerAngle = C.AL_CONE_INNER_ANGLE
  33. ConeOuterAngle = C.AL_CONE_OUTER_ANGLE
  34. Pitch = C.AL_PITCH
  35. Position = C.AL_POSITION
  36. Direction = C.AL_DIRECTION
  37. Velocity = C.AL_VELOCITY
  38. Looping = C.AL_LOOPING
  39. Buffer = C.AL_BUFFER
  40. Gain = C.AL_GAIN
  41. MinGain = C.AL_MIN_GAIN
  42. MaxGain = C.AL_MAX_GAIN
  43. Orientation = C.AL_ORIENTATION
  44. SourceState = C.AL_SOURCE_STATE
  45. Initial = C.AL_INITIAL
  46. Playing = C.AL_PLAYING
  47. Paused = C.AL_PAUSED
  48. Stopped = C.AL_STOPPED
  49. BuffersQueued = C.AL_BUFFERS_QUEUED
  50. BuffersProcessed = C.AL_BUFFERS_PROCESSED
  51. ReferenceDistance = C.AL_REFERENCE_DISTANCE
  52. RolloffFactor = C.AL_ROLLOFF_FACTOR
  53. ConeOuterGain = C.AL_CONE_OUTER_GAIN
  54. MaxDistance = C.AL_MAX_DISTANCE
  55. SecOffset = C.AL_SEC_OFFSET
  56. SampleOffset = C.AL_SAMPLE_OFFSET
  57. ByteOffset = C.AL_BYTE_OFFSET
  58. SourceType = C.AL_SOURCE_TYPE
  59. Static = C.AL_STATIC
  60. Streaming = C.AL_STREAMING
  61. Undetermined = C.AL_UNDETERMINED
  62. FormatMono8 = C.AL_FORMAT_MONO8
  63. FormatMono16 = C.AL_FORMAT_MONO16
  64. FormatStereo8 = C.AL_FORMAT_STEREO8
  65. FormatStereo16 = C.AL_FORMAT_STEREO16
  66. Frequency = C.AL_FREQUENCY
  67. Bits = C.AL_BITS
  68. Channels = C.AL_CHANNELS
  69. Size = C.AL_SIZE
  70. Unused = C.AL_UNUSED
  71. Pending = C.AL_PENDING
  72. Processed = C.AL_PROCESSED
  73. NoError = C.AL_NO_ERROR
  74. InvalidName = C.AL_INVALID_NAME
  75. InvalidEnum = C.AL_INVALID_ENUM
  76. InvalidValue = C.AL_INVALID_VALUE
  77. InvalidOperation = C.AL_INVALID_OPERATION
  78. OutOfMemory = C.AL_OUT_OF_MEMORY
  79. Vendor = C.AL_VENDOR
  80. Version = C.AL_VERSION
  81. Renderer = C.AL_RENDERER
  82. Extensions = C.AL_EXTENSIONS
  83. DopplerFactor = C.AL_DOPPLER_FACTOR
  84. DopplerVelocity = C.AL_DOPPLER_VELOCITY
  85. SpeedOfSound = C.AL_SPEED_OF_SOUND
  86. DistanceModel = C.AL_DISTANCE_MODEL
  87. InverseDistance = C.AL_INVERSE_DISTANCE
  88. InverseDistanceClamped = C.AL_INVERSE_DISTANCE_CLAMPED
  89. LinearDistance = C.AL_LINEAR_DISTANCE
  90. LinearDistanceClamped = C.AL_LINEAR_DISTANCE_CLAMPED
  91. ExponentDistance = C.AL_EXPONENT_DISTANCE
  92. ExponentDistanceClamped = C.AL_EXPONENT_DISTANCE_CLAMPED
  93. )
  94. // ALC constants
  95. const (
  96. AttributesSize = C.ALC_ATTRIBUTES_SIZE
  97. AllAttributes = C.ALC_ALL_ATTRIBUTES
  98. DefaultDeviceSpecifier = C.ALC_DEFAULT_DEVICE_SPECIFIER
  99. DeviceSpecifier = C.ALC_DEVICE_SPECIFIER
  100. CtxExtensions = C.ALC_EXTENSIONS
  101. ExtCapture = C.ALC_EXT_CAPTURE
  102. CaptureDeviceSpecifier = C.ALC_CAPTURE_DEVICE_SPECIFIER
  103. CaptureDefaultDeviceSpecifier = C.ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER
  104. CtxCaptureSamples = C.ALC_CAPTURE_SAMPLES
  105. EnumerateAllExt = C.ALC_ENUMERATE_ALL_EXT
  106. DefaultAllDevicesSpecifier = C.ALC_DEFAULT_ALL_DEVICES_SPECIFIER
  107. AllDevicesSpecifier = C.ALC_ALL_DEVICES_SPECIFIER
  108. )
  109. // AL EFX extension constants
  110. const (
  111. EFX_MAJOR_VERSION = C.ALC_EFX_MAJOR_VERSION
  112. EFX_MINOR_VERSION = C.ALC_EFX_MINOR_VERSION
  113. MAX_AUXILIARY_SENDS = C.ALC_MAX_AUXILIARY_SENDS
  114. METERS_PER_UNIT = C.AL_METERS_PER_UNIT
  115. AL_DIRECT_FILTER = C.AL_DIRECT_FILTER
  116. AL_AUXILIARY_SEND_FILTER = C.AL_AUXILIARY_SEND_FILTER
  117. AL_AIR_ABSORPTION_FACTOR = C.AL_AIR_ABSORPTION_FACTOR
  118. AL_ROOM_ROLLOFF_FACTOR = C.AL_ROOM_ROLLOFF_FACTOR
  119. AL_CONE_OUTER_GAINHF = C.AL_CONE_OUTER_GAINHF
  120. AL_DIRECT_FILTER_GAINHF_AUTO = C.AL_DIRECT_FILTER_GAINHF_AUTO
  121. AL_AUXILIARY_SEND_FILTER_GAIN_AUTO = C.AL_AUXILIARY_SEND_FILTER_GAIN_AUTO
  122. AL_AUXILIARY_SEND_FILTER_GAINHF_AUTO = C.AL_AUXILIARY_SEND_FILTER_GAINHF_AUTO
  123. AL_REVERB_DENSITY = C.AL_REVERB_DENSITY
  124. AL_REVERB_DIFFUSION = C.AL_REVERB_DIFFUSION
  125. AL_REVERB_GAIN = C.AL_REVERB_GAIN
  126. AL_REVERB_GAINHF = C.AL_REVERB_GAINHF
  127. AL_REVERB_DECAY_TIME = C.AL_REVERB_DECAY_TIME
  128. AL_REVERB_DECAY_HFRATIO = C.AL_REVERB_DECAY_HFRATIO
  129. AL_REVERB_REFLECTIONS_GAIN = C.AL_REVERB_REFLECTIONS_GAIN
  130. AL_REVERB_REFLECTIONS_DELAY = C.AL_REVERB_REFLECTIONS_DELAY
  131. AL_REVERB_LATE_REVERB_GAIN = C.AL_REVERB_LATE_REVERB_GAIN
  132. AL_REVERB_LATE_REVERB_DELAY = C.AL_REVERB_LATE_REVERB_DELAY
  133. AL_REVERB_AIR_ABSORPTION_GAINHF = C.AL_REVERB_AIR_ABSORPTION_GAINHF
  134. AL_REVERB_ROOM_ROLLOFF_FACTOR = C.AL_REVERB_ROOM_ROLLOFF_FACTOR
  135. AL_REVERB_DECAY_HFLIMIT = C.AL_REVERB_DECAY_HFLIMIT
  136. AL_EAXREVERB_DENSITY = C.AL_EAXREVERB_DENSITY
  137. AL_EAXREVERB_DIFFUSION = C.AL_EAXREVERB_DIFFUSION
  138. AL_EAXREVERB_GAIN = C.AL_EAXREVERB_GAIN
  139. AL_EAXREVERB_GAINHF = C.AL_EAXREVERB_GAINHF
  140. AL_EAXREVERB_GAINLF = C.AL_EAXREVERB_GAINLF
  141. AL_EAXREVERB_DECAY_TIME = C.AL_EAXREVERB_DECAY_TIME
  142. AL_EAXREVERB_DECAY_HFRATIO = C.AL_EAXREVERB_DECAY_HFRATIO
  143. AL_EAXREVERB_DECAY_LFRATIO = C.AL_EAXREVERB_DECAY_LFRATIO
  144. AL_EAXREVERB_REFLECTIONS_GAIN = C.AL_EAXREVERB_REFLECTIONS_GAIN
  145. AL_EAXREVERB_REFLECTIONS_DELAY = C.AL_EAXREVERB_REFLECTIONS_DELAY
  146. AL_EAXREVERB_REFLECTIONS_PAN = C.AL_EAXREVERB_REFLECTIONS_PAN
  147. AL_EAXREVERB_LATE_REVERB_GAIN = C.AL_EAXREVERB_LATE_REVERB_GAIN
  148. AL_EAXREVERB_LATE_REVERB_DELAY = C.AL_EAXREVERB_LATE_REVERB_DELAY
  149. AL_EAXREVERB_LATE_REVERB_PAN = C.AL_EAXREVERB_LATE_REVERB_PAN
  150. AL_EAXREVERB_ECHO_TIME = C.AL_EAXREVERB_ECHO_TIME
  151. AL_EAXREVERB_ECHO_DEPTH = C.AL_EAXREVERB_ECHO_DEPTH
  152. AL_EAXREVERB_MODULATION_TIME = C.AL_EAXREVERB_MODULATION_TIME
  153. AL_EAXREVERB_MODULATION_DEPTH = C.AL_EAXREVERB_MODULATION_DEPTH
  154. AL_EAXREVERB_AIR_ABSORPTION_GAINHF = C.AL_EAXREVERB_AIR_ABSORPTION_GAINHF
  155. AL_EAXREVERB_HFREFERENCE = C.AL_EAXREVERB_HFREFERENCE
  156. AL_EAXREVERB_LFREFERENCE = C.AL_EAXREVERB_LFREFERENCE
  157. AL_EAXREVERB_ROOM_ROLLOFF_FACTOR = C.AL_EAXREVERB_ROOM_ROLLOFF_FACTOR
  158. AL_EAXREVERB_DECAY_HFLIMIT = C.AL_EAXREVERB_DECAY_HFLIMIT
  159. AL_CHORUS_WAVEFORM = C.AL_CHORUS_WAVEFORM
  160. AL_CHORUS_PHASE = C.AL_CHORUS_PHASE
  161. AL_CHORUS_RATE = C.AL_CHORUS_RATE
  162. AL_CHORUS_DEPTH = C.AL_CHORUS_DEPTH
  163. AL_CHORUS_FEEDBACK = C.AL_CHORUS_FEEDBACK
  164. AL_CHORUS_DELAY = C.AL_CHORUS_DELAY
  165. AL_DISTORTION_EDGE = C.AL_DISTORTION_EDGE
  166. AL_DISTORTION_GAIN = C.AL_DISTORTION_GAIN
  167. AL_DISTORTION_LOWPASS_CUTOFF = C.AL_DISTORTION_LOWPASS_CUTOFF
  168. AL_DISTORTION_EQCENTER = C.AL_DISTORTION_EQCENTER
  169. AL_DISTORTION_EQBANDWIDTH = C.AL_DISTORTION_EQBANDWIDTH
  170. AL_ECHO_DELAY = C.AL_ECHO_DELAY
  171. AL_ECHO_LRDELAY = C.AL_ECHO_LRDELAY
  172. AL_ECHO_DAMPING = C.AL_ECHO_DAMPING
  173. AL_ECHO_FEEDBACK = C.AL_ECHO_FEEDBACK
  174. AL_ECHO_SPREAD = C.AL_ECHO_SPREAD
  175. AL_FLANGER_WAVEFORM = C.AL_FLANGER_WAVEFORM
  176. AL_FLANGER_PHASE = C.AL_FLANGER_PHASE
  177. AL_FLANGER_RATE = C.AL_FLANGER_RATE
  178. AL_FLANGER_DEPTH = C.AL_FLANGER_DEPTH
  179. AL_FLANGER_FEEDBACK = C.AL_FLANGER_FEEDBACK
  180. AL_FLANGER_DELAY = C.AL_FLANGER_DELAY
  181. AL_FREQUENCY_SHIFTER_FREQUENCY = C.AL_FREQUENCY_SHIFTER_FREQUENCY
  182. AL_FREQUENCY_SHIFTER_LEFT_DIRECTION = C.AL_FREQUENCY_SHIFTER_LEFT_DIRECTION
  183. AL_FREQUENCY_SHIFTER_RIGHT_DIRECTION = C.AL_FREQUENCY_SHIFTER_RIGHT_DIRECTION
  184. AL_VOCAL_MORPHER_PHONEMEA = C.AL_VOCAL_MORPHER_PHONEMEA
  185. AL_VOCAL_MORPHER_PHONEMEA_COARSE_TUNING = C.AL_VOCAL_MORPHER_PHONEMEA_COARSE_TUNING
  186. AL_VOCAL_MORPHER_PHONEMEB = C.AL_VOCAL_MORPHER_PHONEMEB
  187. AL_VOCAL_MORPHER_PHONEMEB_COARSE_TUNING = C.AL_VOCAL_MORPHER_PHONEMEB_COARSE_TUNING
  188. AL_VOCAL_MORPHER_WAVEFORM = C.AL_VOCAL_MORPHER_WAVEFORM
  189. AL_VOCAL_MORPHER_RATE = C.AL_VOCAL_MORPHER_RATE
  190. AL_PITCH_SHIFTER_COARSE_TUNE = C.AL_PITCH_SHIFTER_COARSE_TUNE
  191. AL_PITCH_SHIFTER_FINE_TUNE = C.AL_PITCH_SHIFTER_FINE_TUNE
  192. AL_RING_MODULATOR_FREQUENCY = C.AL_RING_MODULATOR_FREQUENCY
  193. AL_RING_MODULATOR_HIGHPASS_CUTOFF = C.AL_RING_MODULATOR_HIGHPASS_CUTOFF
  194. AL_RING_MODULATOR_WAVEFORM = C.AL_RING_MODULATOR_WAVEFORM
  195. AL_AUTOWAH_ATTACK_TIME = C.AL_AUTOWAH_ATTACK_TIME
  196. AL_AUTOWAH_RELEASE_TIME = C.AL_AUTOWAH_RELEASE_TIME
  197. AL_AUTOWAH_RESONANCE = C.AL_AUTOWAH_RESONANCE
  198. AL_AUTOWAH_PEAK_GAIN = C.AL_AUTOWAH_PEAK_GAIN
  199. AL_COMPRESSOR_ONOFF = C.AL_COMPRESSOR_ONOFF
  200. AL_EQUALIZER_LOW_GAIN = C.AL_EQUALIZER_LOW_GAIN
  201. AL_EQUALIZER_LOW_CUTOFF = C.AL_EQUALIZER_LOW_CUTOFF
  202. AL_EQUALIZER_MID1_GAIN = C.AL_EQUALIZER_MID1_GAIN
  203. AL_EQUALIZER_MID1_CENTER = C.AL_EQUALIZER_MID1_CENTER
  204. AL_EQUALIZER_MID1_WIDTH = C.AL_EQUALIZER_MID1_WIDTH
  205. AL_EQUALIZER_MID2_GAIN = C.AL_EQUALIZER_MID2_GAIN
  206. AL_EQUALIZER_MID2_CENTER = C.AL_EQUALIZER_MID2_CENTER
  207. AL_EQUALIZER_MID2_WIDTH = C.AL_EQUALIZER_MID2_WIDTH
  208. AL_EQUALIZER_HIGH_GAIN = C.AL_EQUALIZER_HIGH_GAIN
  209. AL_EQUALIZER_HIGH_CUTOFF = C.AL_EQUALIZER_HIGH_CUTOFF
  210. AL_EFFECT_FIRST_PARAMETER = C.AL_EFFECT_FIRST_PARAMETER
  211. AL_EFFECT_LAST_PARAMETER = C.AL_EFFECT_LAST_PARAMETER
  212. AL_EFFECT_TYPE = C.AL_EFFECT_TYPE
  213. AL_EFFECT_NULL = C.AL_EFFECT_NULL
  214. AL_EFFECT_REVERB = C.AL_EFFECT_REVERB
  215. AL_EFFECT_CHORUS = C.AL_EFFECT_CHORUS
  216. AL_EFFECT_DISTORTION = C.AL_EFFECT_DISTORTION
  217. AL_EFFECT_ECHO = C.AL_EFFECT_ECHO
  218. AL_EFFECT_FLANGER = C.AL_EFFECT_FLANGER
  219. AL_EFFECT_FREQUENCY_SHIFTER = C.AL_EFFECT_FREQUENCY_SHIFTER
  220. AL_EFFECT_VOCAL_MORPHER = C.AL_EFFECT_VOCAL_MORPHER
  221. AL_EFFECT_PITCH_SHIFTER = C.AL_EFFECT_PITCH_SHIFTER
  222. AL_EFFECT_RING_MODULATOR = C.AL_EFFECT_RING_MODULATOR
  223. AL_EFFECT_AUTOWAH = C.AL_EFFECT_AUTOWAH
  224. AL_EFFECT_COMPRESSOR = C.AL_EFFECT_COMPRESSOR
  225. AL_EFFECT_EQUALIZER = C.AL_EFFECT_EQUALIZER
  226. AL_EFFECT_EAXREVERB = C.AL_EFFECT_EAXREVERB
  227. AL_EFFECTSLOT_EFFECT = C.AL_EFFECTSLOT_EFFECT
  228. AL_EFFECTSLOT_GAIN = C.AL_EFFECTSLOT_GAIN
  229. AL_EFFECTSLOT_AUXILIARY_SEND_AUTO = C.AL_EFFECTSLOT_AUXILIARY_SEND_AUTO
  230. AL_EFFECTSLOT_NULL = C.AL_EFFECTSLOT_NULL
  231. AL_LOWPASS_GAIN = C.AL_LOWPASS_GAIN
  232. AL_LOWPASS_GAINHF = C.AL_LOWPASS_GAINHF
  233. AL_HIGHPASS_GAIN = C.AL_HIGHPASS_GAIN
  234. AL_HIGHPASS_GAINLF = C.AL_HIGHPASS_GAINLF
  235. AL_BANDPASS_GAIN = C.AL_BANDPASS_GAIN
  236. AL_BANDPASS_GAINLF = C.AL_BANDPASS_GAINLF
  237. AL_BANDPASS_GAINHF = C.AL_BANDPASS_GAINHF
  238. AL_FILTER_FIRST_PARAMETER = C.AL_FILTER_FIRST_PARAMETER
  239. AL_FILTER_LAST_PARAMETER = C.AL_FILTER_LAST_PARAMETER
  240. AL_FILTER_TYPE = C.AL_FILTER_TYPE
  241. AL_FILTER_NULL = C.AL_FILTER_NULL
  242. AL_FILTER_LOWPASS = C.AL_FILTER_LOWPASS
  243. AL_FILTER_HIGHPASS = C.AL_FILTER_HIGHPASS
  244. AL_FILTER_BANDPASS = C.AL_FILTER_BANDPASS
  245. )
  246. var errCodes = map[uint]string{
  247. C.AL_INVALID_NAME: "AL_INVALID_NAME",
  248. C.AL_INVALID_ENUM: "AL_INVALID_ENUM",
  249. C.AL_INVALID_VALUE: "AL_INVALID_VALUE",
  250. C.AL_INVALID_OPERATION: "AL_INVALID_OPERATION",
  251. C.AL_OUT_OF_MEMORY: "AL_OUT_OF_MEMORY",
  252. }
  253. type Device struct {
  254. cdev *C.ALCdevice
  255. }
  256. type Context struct {
  257. cctx *C.ALCcontext
  258. }
  259. // Statistics
  260. type Stats struct {
  261. Sources int // Current number of sources
  262. Buffers int // Current number of buffers
  263. CgoCalls int64 // Accumulated cgo calls
  264. Callocs int // Current number of C allocations
  265. }
  266. // Maps C pointer to device to Go pointer to Device
  267. var mapDevice = map[*C.ALCdevice]*Device{}
  268. // Global statistics structure
  269. var stats Stats
  270. // GetStats returns copy of the statistics structure
  271. func GetStats() Stats {
  272. return stats
  273. }
  274. func checkCtxError(dev *Device) {
  275. err := CtxGetError(dev)
  276. if err != nil {
  277. panic(err)
  278. }
  279. }
  280. func CreateContext(dev *Device, attrlist []int) (*Context, error) {
  281. var plist unsafe.Pointer
  282. if len(attrlist) != 0 {
  283. plist = (unsafe.Pointer)(&attrlist[0])
  284. }
  285. ctx := C.alcCreateContext(dev.cdev, (*C.ALCint)(plist))
  286. if ctx != nil {
  287. return &Context{ctx}, nil
  288. }
  289. return nil, fmt.Errorf("%s", errCodes[uint(C.alcGetError(dev.cdev))])
  290. }
  291. func MakeContextCurrent(ctx *Context) error {
  292. cres := C.alcMakeContextCurrent(ctx.cctx)
  293. if cres == C.ALC_TRUE {
  294. return nil
  295. }
  296. return fmt.Errorf("%s", errCodes[uint(C.alGetError())])
  297. }
  298. func ProcessContext(ctx *Context) {
  299. C.alcProcessContext(ctx.cctx)
  300. }
  301. func SuspendContext(ctx *Context) {
  302. C.alcSuspendContext(ctx.cctx)
  303. }
  304. func DestroyContext(ctx *Context) {
  305. C.alcDestroyContext(ctx.cctx)
  306. }
  307. func GetContextsDevice(ctx *Context) *Device {
  308. cdev := C.alcGetContextsDevice(ctx.cctx)
  309. if cdev == nil {
  310. return nil
  311. }
  312. return mapDevice[cdev]
  313. }
  314. func OpenDevice(name string) (*Device, error) {
  315. cstr := (*C.ALCchar)(C.CString(name))
  316. defer C.free(unsafe.Pointer(cstr))
  317. cdev := C.alcOpenDevice(cstr)
  318. if cdev != nil {
  319. dev := &Device{cdev}
  320. mapDevice[cdev] = dev
  321. return dev, nil
  322. }
  323. return nil, fmt.Errorf("%s", errCodes[uint(C.alGetError())])
  324. }
  325. func CloseDevice(dev *Device) error {
  326. cres := C.alcCloseDevice(dev.cdev)
  327. if cres == C.ALC_TRUE {
  328. delete(mapDevice, dev.cdev)
  329. return nil
  330. }
  331. return fmt.Errorf("%s", errCodes[uint(C.alGetError())])
  332. }
  333. func CtxGetError(dev *Device) error {
  334. cerr := C.alcGetError(dev.cdev)
  335. if cerr == C.AL_NONE {
  336. return nil
  337. }
  338. return fmt.Errorf("%s", errCodes[uint(cerr)])
  339. }
  340. func CtxIsExtensionPresent(dev *Device, extname string) bool {
  341. cname := (*C.ALCchar)(C.CString(extname))
  342. defer C.free(unsafe.Pointer(cname))
  343. cres := C.alcIsExtensionPresent(dev.cdev, cname)
  344. return cres == C.AL_TRUE
  345. }
  346. func CtxGetEnumValue(dev *Device, enumName string) uint32 {
  347. cname := (*C.ALCchar)(C.CString(enumName))
  348. defer C.free(unsafe.Pointer(cname))
  349. cres := C.alcGetEnumValue(dev.cdev, cname)
  350. return uint32(cres)
  351. }
  352. func CtxGetString(dev *Device, param uint) string {
  353. var cdev *C.ALCdevice = nil
  354. if dev != nil {
  355. cdev = dev.cdev
  356. }
  357. cstr := C.alcGetString(cdev, C.ALCenum(param))
  358. return C.GoString((*C.char)(cstr))
  359. }
  360. func CtxGetIntegerv(dev *Device, param uint32, values []int32) {
  361. C.alcGetIntegerv(dev.cdev, C.ALCenum(param), C.ALCsizei(len(values)), (*C.ALCint)(unsafe.Pointer(&values[0])))
  362. }
  363. func CaptureOpenDevice(devname string, frequency uint32, format uint32, buffersize uint32) (*Device, error) {
  364. cstr := (*C.ALCchar)(C.CString(devname))
  365. defer C.free(unsafe.Pointer(cstr))
  366. cdev := C.alcCaptureOpenDevice(cstr, C.ALCuint(frequency), C.ALCenum(format), C.ALCsizei(buffersize))
  367. if cdev != nil {
  368. dev := &Device{cdev}
  369. mapDevice[cdev] = dev
  370. return dev, nil
  371. }
  372. return nil, fmt.Errorf("%s", errCodes[uint(C.alGetError())])
  373. }
  374. func CaptureCloseDevice(dev *Device) error {
  375. cres := C.alcCaptureCloseDevice(dev.cdev)
  376. if cres == C.AL_TRUE {
  377. return nil
  378. }
  379. return fmt.Errorf("%s", errCodes[uint(C.alGetError())])
  380. }
  381. func CaptureStart(dev *Device) {
  382. C.alcCaptureStart(dev.cdev)
  383. checkCtxError(dev)
  384. }
  385. func CaptureStop(dev *Device) {
  386. C.alcCaptureStop(dev.cdev)
  387. checkCtxError(dev)
  388. }
  389. func CaptureSamples(dev *Device, buffer []byte, nsamples uint) {
  390. C.alcCaptureSamples(dev.cdev, unsafe.Pointer(&buffer[0]), C.ALCsizei(nsamples))
  391. checkCtxError(dev)
  392. }
  393. func Enable(capability uint) {
  394. C.alEnable(C.ALenum(capability))
  395. }
  396. func Disable(capability uint) {
  397. C.alDisable(C.ALenum(capability))
  398. }
  399. func IsEnabled(capability uint) bool {
  400. cres := C.alIsEnabled(C.ALenum(capability))
  401. return cres == C.AL_TRUE
  402. }
  403. func GetString(param uint32) string {
  404. cstr := C.alGetString(C.ALenum(param))
  405. return C.GoString((*C.char)(cstr))
  406. }
  407. func GetBooleanv(param uint32, values []bool) {
  408. cvals := make([]C.ALboolean, len(values))
  409. C.alGetBooleanv(C.ALenum(param), &cvals[0])
  410. for i := 0; i < len(cvals); i++ {
  411. if cvals[i] == C.AL_TRUE {
  412. values[i] = true
  413. } else {
  414. values[i] = false
  415. }
  416. }
  417. }
  418. func GetIntegerv(param uint32, values []int32) {
  419. C.alGetIntegerv(C.ALenum(param), (*C.ALint)(unsafe.Pointer(&values[0])))
  420. }
  421. func GetFloatv(param uint32, values []float32) {
  422. C.alGetFloatv(C.ALenum(param), (*C.ALfloat)(unsafe.Pointer(&values[0])))
  423. }
  424. func GetDoublev(param uint32, values []float64) {
  425. C.alGetDoublev(C.ALenum(param), (*C.ALdouble)(unsafe.Pointer(&values[0])))
  426. }
  427. func GetBoolean(param uint32) bool {
  428. cres := C.alGetBoolean(C.ALenum(param))
  429. return cres == C.AL_TRUE
  430. }
  431. func GetInteger(param uint32) int32 {
  432. cres := C.alGetInteger(C.ALenum(param))
  433. return int32(cres)
  434. }
  435. func GetFloat(param uint32) float32 {
  436. cres := C.alGetFloat(C.ALenum(param))
  437. return float32(cres)
  438. }
  439. func GetDouble(param uint32) float64 {
  440. cres := C.alGetDouble(C.ALenum(param))
  441. return float64(cres)
  442. }
  443. func GetError() error {
  444. cerr := C.alGetError()
  445. if cerr == C.AL_NONE {
  446. return nil
  447. }
  448. return fmt.Errorf("%s", errCodes[uint(cerr)])
  449. }
  450. func IsExtensionPresent(extName string) bool {
  451. cstr := (*C.ALchar)(C.CString(extName))
  452. defer C.free(unsafe.Pointer(cstr))
  453. cres := C.alIsExtensionPresent(cstr)
  454. return cres != 0
  455. }
  456. func GetEnumValue(enam string) uint32 {
  457. cenam := (*C.ALchar)(C.CString(enam))
  458. defer C.free(unsafe.Pointer(cenam))
  459. cres := C.alGetEnumValue(cenam)
  460. return uint32(cres)
  461. }
  462. func Listenerf(param uint32, value float32) {
  463. C.alListenerf(C.ALenum(param), C.ALfloat(value))
  464. }
  465. func Listener3f(param uint32, value1, value2, value3 float32) {
  466. C.alListener3f(C.ALenum(param), C.ALfloat(value1), C.ALfloat(value2), C.ALfloat(value3))
  467. }
  468. func Listenerfv(param uint32, values []float32) {
  469. C.alListenerfv(C.ALenum(param), (*C.ALfloat)(unsafe.Pointer(&values[0])))
  470. }
  471. func Listeneri(param uint32, value int32) {
  472. C.alListeneri(C.ALenum(param), C.ALint(value))
  473. }
  474. func Listener3i(param uint32, value1, value2, value3 int32) {
  475. C.alListener3i(C.ALenum(param), C.ALint(value1), C.ALint(value2), C.ALint(value3))
  476. }
  477. func Listeneriv(param uint32, values []int32) {
  478. C.alListeneriv(C.ALenum(param), (*C.ALint)(unsafe.Pointer(&values[0])))
  479. }
  480. func GetListenerf(param uint32) float32 {
  481. var cval C.ALfloat
  482. C.alGetListenerf(C.ALenum(param), &cval)
  483. return float32(cval)
  484. }
  485. func GetListener3f(param uint32) (float32, float32, float32) {
  486. var cval1 C.ALfloat
  487. var cval2 C.ALfloat
  488. var cval3 C.ALfloat
  489. C.alGetListener3f(C.ALenum(param), &cval1, &cval2, &cval3)
  490. return float32(cval1), float32(cval2), float32(cval3)
  491. }
  492. func GetListenerfv(param uint32, values []uint32) {
  493. C.alGetListenerfv(C.ALenum(param), (*C.ALfloat)(unsafe.Pointer(&values[0])))
  494. }
  495. func GetListeneri(param uint32) int32 {
  496. var cval C.ALint
  497. C.alGetListeneri(C.ALenum(param), &cval)
  498. return int32(cval)
  499. }
  500. func GetListener3i(param uint32) (int32, int32, int32) {
  501. var cval1 C.ALint
  502. var cval2 C.ALint
  503. var cval3 C.ALint
  504. C.alGetListener3i(C.ALenum(param), &cval1, &cval2, &cval3)
  505. return int32(cval1), int32(cval2), int32(cval3)
  506. }
  507. func GetListeneriv(param uint32, values []int32) {
  508. if len(values) < 3 {
  509. panic("Slice length less than minimum")
  510. }
  511. C.alGetListeneriv(C.ALenum(param), (*C.ALint)(unsafe.Pointer(&values[0])))
  512. }
  513. func GenSource() uint32 {
  514. var csource C.ALuint
  515. C.alGenSources(1, &csource)
  516. stats.Sources++
  517. return uint32(csource)
  518. }
  519. func GenSources(sources []uint32) {
  520. C.alGenSources(C.ALsizei(len(sources)), (*C.ALuint)(unsafe.Pointer(&sources[0])))
  521. stats.Sources += len(sources)
  522. }
  523. func DeleteSource(source uint32) {
  524. C.alDeleteSources(1, (*C.ALuint)(unsafe.Pointer(&source)))
  525. stats.Sources--
  526. }
  527. func DeleteSources(sources []uint32) {
  528. C.alDeleteSources(C.ALsizei(len(sources)), (*C.ALuint)(unsafe.Pointer(&sources[0])))
  529. stats.Sources -= len(sources)
  530. }
  531. func IsSource(source uint32) bool {
  532. cres := C.alIsSource(C.ALuint(source))
  533. return cres == C.AL_TRUE
  534. }
  535. func Sourcef(source uint32, param uint32, value float32) {
  536. C.alSourcef(C.ALuint(source), C.ALenum(param), C.ALfloat(value))
  537. }
  538. func Source3f(source uint32, param uint32, value1, value2, value3 float32) {
  539. C.alSource3f(C.ALuint(source), C.ALenum(param), C.ALfloat(value1), C.ALfloat(value2), C.ALfloat(value3))
  540. }
  541. func Sourcefv(source uint32, param uint32, values []float32) {
  542. if len(values) < 3 {
  543. panic("Slice length less than minimum")
  544. }
  545. C.alSourcefv(C.ALuint(source), C.ALenum(param), (*C.ALfloat)(unsafe.Pointer(&values[0])))
  546. }
  547. func Sourcei(source uint32, param uint32, value int32) {
  548. C.alSourcei(C.ALuint(source), C.ALenum(param), C.ALint(value))
  549. }
  550. func Source3i(source uint32, param uint32, value1, value2, value3 int32) {
  551. C.alSource3i(C.ALuint(source), C.ALenum(param), C.ALint(value1), C.ALint(value2), C.ALint(value3))
  552. }
  553. func Sourceiv(source uint32, param uint32, values []int32) {
  554. if len(values) < 3 {
  555. panic("Slice length less than minimum")
  556. }
  557. C.alSourceiv(C.ALuint(source), C.ALenum(param), (*C.ALint)(unsafe.Pointer(&values[0])))
  558. }
  559. func GetSourcef(source uint32, param uint32) float32 {
  560. var value C.ALfloat
  561. C.alGetSourcef(C.ALuint(source), C.ALenum(param), &value)
  562. return float32(value)
  563. }
  564. func GetSource3f(source uint32, param uint32) (float32, float32, float32) {
  565. var cval1 C.ALfloat
  566. var cval2 C.ALfloat
  567. var cval3 C.ALfloat
  568. C.alGetSource3f(C.ALuint(source), C.ALenum(param), &cval1, &cval2, &cval3)
  569. return float32(cval1), float32(cval2), float32(cval3)
  570. }
  571. func GetSourcefv(source uint32, param uint32, values []float32) {
  572. if len(values) < 3 {
  573. panic("Slice length less than minimum")
  574. }
  575. C.alGetSourcefv(C.ALuint(source), C.ALenum(param), (*C.ALfloat)(unsafe.Pointer(&values[0])))
  576. }
  577. func GetSourcei(source uint32, param uint32) int32 {
  578. var value C.ALint
  579. C.alGetSourcei(C.ALuint(source), C.ALenum(param), &value)
  580. return int32(value)
  581. }
  582. func GetSource3i(source uint32, param uint32) (int32, int32, int32) {
  583. var cval1 C.ALint
  584. var cval2 C.ALint
  585. var cval3 C.ALint
  586. C.alGetSource3i(C.ALuint(source), C.ALenum(param), &cval1, &cval2, &cval3)
  587. return int32(cval1), int32(cval2), int32(cval3)
  588. }
  589. func GetSourceiv(source uint32, param uint32, values []int32) {
  590. if len(values) < 3 {
  591. panic("Slice length less than minimum")
  592. }
  593. C.alGetSourceiv(C.ALuint(source), C.ALenum(param), (*C.ALint)(unsafe.Pointer(&values[0])))
  594. }
  595. func SourcePlayv(sources []uint32) {
  596. C.alSourcePlayv(C.ALsizei(len(sources)), (*C.ALuint)(unsafe.Pointer(&sources[0])))
  597. }
  598. func SourceStopv(sources []uint32) {
  599. C.alSourceStopv(C.ALsizei(len(sources)), (*C.ALuint)(unsafe.Pointer(&sources[0])))
  600. }
  601. func SourceRewindv(sources []uint32) {
  602. C.alSourceRewindv(C.ALsizei(len(sources)), (*C.ALuint)(unsafe.Pointer(&sources[0])))
  603. }
  604. func SourcePausev(sources []uint32) {
  605. C.alSourcePausev(C.ALsizei(len(sources)), (*C.ALuint)(unsafe.Pointer(&sources[0])))
  606. }
  607. func SourcePlay(source uint32) {
  608. C.alSourcePlay(C.ALuint(source))
  609. }
  610. func SourceStop(source uint32) {
  611. C.alSourceStop(C.ALuint(source))
  612. }
  613. func SourceRewind(source uint32) {
  614. C.alSourceRewind(C.ALuint(source))
  615. }
  616. func SourcePause(source uint32) {
  617. C.alSourcePause(C.ALuint(source))
  618. }
  619. func SourceQueueBuffers(source uint32, buffers ...uint32) {
  620. C.alSourceQueueBuffers(C.ALuint(source), C.ALsizei(len(buffers)), (*C.ALuint)(unsafe.Pointer(&buffers[0])))
  621. }
  622. func SourceUnqueueBuffers(source uint32, n uint32, buffers []uint32) {
  623. removed := make([]C.ALuint, n)
  624. C.alSourceUnqueueBuffers(C.ALuint(source), C.ALsizei(n), &removed[0])
  625. }
  626. func GenBuffers(n uint32) []uint32 {
  627. buffers := make([]uint32, n)
  628. C.alGenBuffers(C.ALsizei(len(buffers)), (*C.ALuint)(unsafe.Pointer(&buffers[0])))
  629. return buffers
  630. }
  631. func DeleteBuffers(buffers []uint32) {
  632. C.alDeleteBuffers(C.ALsizei(len(buffers)), (*C.ALuint)(unsafe.Pointer(&buffers[0])))
  633. }
  634. func IsBuffer(buffer uint32) bool {
  635. cres := C.alIsBuffer(C.ALuint(buffer))
  636. return cres == C.AL_TRUE
  637. }
  638. func BufferData(buffer uint32, format uint32, data unsafe.Pointer, size uint32, freq uint32) {
  639. C.alBufferData(C.ALuint(buffer), C.ALenum(format), data, C.ALsizei(size), C.ALsizei(freq))
  640. }
  641. func Bufferf(buffer uint32, param uint32, value float32) {
  642. C.alBufferf(C.ALuint(buffer), C.ALenum(param), C.ALfloat(value))
  643. }
  644. func Buffer3f(buffer uint32, param uint32, value1, value2, value3 float32) {
  645. C.alBuffer3f(C.ALuint(buffer), C.ALenum(param), C.ALfloat(value1), C.ALfloat(value2), C.ALfloat(value3))
  646. }
  647. func Bufferfv(buffer uint32, param uint32, values []float32) {
  648. C.alBufferfv(C.ALuint(buffer), C.ALenum(param), (*C.ALfloat)(unsafe.Pointer(&values[0])))
  649. }
  650. func Bufferi(buffer uint32, param uint32, value int32) {
  651. C.alBufferi(C.ALuint(buffer), C.ALenum(param), C.ALint(value))
  652. }
  653. func Buffer3i(buffer uint32, param uint32, value1, value2, value3 int32) {
  654. C.alBuffer3i(C.ALuint(buffer), C.ALenum(param), C.ALint(value1), C.ALint(value2), C.ALint(value3))
  655. }
  656. func Bufferiv(buffer uint32, param uint32, values []int32) {
  657. C.alBufferiv(C.ALuint(buffer), C.ALenum(param), (*C.ALint)(unsafe.Pointer(&values[0])))
  658. }
  659. func GetBufferf(buffer uint32, param uint32) float32 {
  660. var value C.ALfloat
  661. C.alGetBufferf(C.ALuint(buffer), C.ALenum(param), &value)
  662. return float32(value)
  663. }
  664. func GetBuffer3f(buffer uint32, param uint32) (v1 float32, v2 float32, v3 float32) {
  665. var value1, value2, value3 C.ALfloat
  666. C.alGetBuffer3f(C.ALuint(buffer), C.ALenum(param), &value1, &value2, &value3)
  667. return float32(value1), float32(value2), float32(value3)
  668. }
  669. func GetBufferfv(buffer uint32, param uint32, values []float32) {
  670. C.alGetBufferfv(C.ALuint(buffer), C.ALenum(param), (*C.ALfloat)(unsafe.Pointer(&values[0])))
  671. }
  672. func GetBufferi(buffer uint32, param uint32) int32 {
  673. var value C.ALint
  674. C.alGetBufferi(C.ALuint(buffer), C.ALenum(param), &value)
  675. return int32(value)
  676. }
  677. func GetBuffer3i(buffer uint32, param uint32) (int32, int32, int32) {
  678. var value1, value2, value3 C.ALint
  679. C.alGetBuffer3i(C.ALuint(buffer), C.ALenum(param), &value1, &value2, &value3)
  680. return int32(value1), int32(value2), int32(value3)
  681. }
  682. func GetBufferiv(buffer uint32, param uint32, values []int32) {
  683. C.alGetBufferiv(C.ALuint(buffer), C.ALenum(param), (*C.ALint)(unsafe.Pointer(&values[0])))
  684. }