al.go 28 KB

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