al.go 28 KB

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