nimble install openal
This library has no dependencies other than the Nim standard libarary.
An OpenAL wrapper for nim. OpenAL is a cross platform way to play sounds.
OpenAL works on:
- Windows
- macOS
- Linux
Its great for games because it can play sounds in 3d and apply effects to them.
Great reference on how to use openAL:
https://github.com/kcat/openal-soft/wiki/Programmer's-Guide
Small example on how to use this nim library:
import openal, os, readwav
var
# sound by DANMITCH3LL: https://freesound.org/people/DANMITCH3LL/sounds/232009/
wav = readWav("xylophone-sweep.wav") # read wav file using simple helper utility
buffer = ALuint(0) # buffer is like a record of a sound
source = ALuint(0) # source is like a record player, it can play 1 buffer at a time
# open setup and error handling
let device = alcOpenDevice(nil)
if device == nil: quit "OpenAL: failed to get default device"
let ctx = device.alcCreateContext(nil)
if ctx == nil: quit "OpenAL: failed to create context"
if not alcMakeContextCurrent(ctx): quit "OpenAL: failed to make context current"
# setup buffer
alGenBuffers(ALsizei 1, addr buffer)
alBufferData(buffer, AL_FORMAT_MONO16, wav.data, ALsizei wav.size, ALsizei wav.freq)
# setup source
alGenSources(ALsizei 1, addr source)
alSourcei(source, AL_BUFFER, Alint buffer)
alSourcePlay(source)
# wait for sound to finish playing
sleep(2500)
# taredown and error handling
alDeleteSources(1, addr source)
alDeleteBuffers(1, addr buffer)
alcDestroyContext(ctx)
if not alcCloseDevice(device): quit "OpenAL: failed to close device"
import openal
ALuint = cuint
ALint = cint
ALsizei = cint
ALenum = cint
ALfloat = float32
ALdouble = float64
AL_SOURCE_RELATIVE = 0x00000202
AL_CONE_INNER_ANGLE = 0x00001001
AL_CONE_OUTER_ANGLE = 0x00001002
AL_PITCH = 0x00001003
AL_POSITION = 0x00001004
AL_DIRECTION = 0x00001005
AL_VELOCITY = 0x00001006
AL_LOOPING = 0x00001007
AL_BUFFER = 0x00001009
AL_GAIN = 0x0000100A
AL_MIN_GAIN = 0x0000100D
AL_MAX_GAIN = 0x0000100E
AL_ORIENTATION = 0x0000100F
AL_SOURCE_STATE = 0x00001010
AL_INITIAL = 0x00001011
AL_PLAYING = 0x00001012
AL_PAUSED = 0x00001013
AL_STOPPED = 0x00001014
AL_BUFFERS_QUEUED = 0x00001015
AL_BUFFERS_PROCESSED = 0x00001016
AL_SEC_OFFSET = 0x00001024
AL_SAMPLE_OFFSET = 0x00001025
AL_BYTE_OFFSET = 0x00001026
AL_SOURCE_TYPE = 0x00001027
AL_STATIC = 0x00001028
AL_STREAMING = 0x00001029
AL_UNDETERMINED = 0x00001030
AL_FORMAT_MONO8 = 0x00001100
AL_FORMAT_MONO16 = 0x00001101
AL_FORMAT_STEREO8 = 0x00001102
AL_FORMAT_STEREO16 = 0x00001103
AL_REFERENCE_DISTANCE = 0x00001020
AL_ROLLOFF_FACTOR = 0x00001021
AL_CONE_OUTER_GAIN = 0x00001022
AL_MAX_DISTANCE = 0x00001023
AL_FREQUENCY = 0x00002001
AL_BITS = 0x00002002
AL_CHANNELS = 0x00002003
AL_SIZE = 0x00002004
AL_UNUSED = 0x00002010
AL_PENDING = 0x00002011
AL_PROCESSED = 0x00002012
AL_NO_ERROR = false
AL_INVALID_NAME = 0x0000A001
AL_INVALID_ENUM = 0x0000A002
AL_INVALID_VALUE = 0x0000A003
AL_INVALID_OPERATION = 0x0000A004
AL_OUT_OF_MEMORY = 0x0000A005
AL_VENDOR = 0x0000B001
AL_VERSION = 0x0000B002
AL_RENDERER = 0x0000B003
AL_EXTENSIONS = 0x0000B004
AL_DOPPLER_FACTOR = 0x0000C000
AL_DOPPLER_VELOCITY = 0x0000C001
AL_SPEED_OF_SOUND = 0x0000C003
AL_DISTANCE_MODEL = 0x0000D000
AL_INVERSE_DISTANCE = 0x0000D001
AL_INVERSE_DISTANCE_CLAMPED = 0x0000D002
AL_LINEAR_DISTANCE = 0x0000D003
AL_LINEAR_DISTANCE_CLAMPED = 0x0000D004
AL_EXPONENT_DISTANCE = 0x0000D005
AL_EXPONENT_DISTANCE_CLAMPED = 0x0000D006
AL_PRIORITY = 0x0000E001
AL_PRIORITY_SLOTS = 0x0000E002
proc alEnable(capability: ALenum) {.cdecl, importc.}
proc alDisable(capability: ALenum) {.cdecl, importc.}
proc alIsEnabled(capability: ALenum): bool {.cdecl, importc.}
proc alGetString(param: ALenum): ptr char {.cdecl, importc.}
proc alGetBooleanv(param: ALenum; data: ptr bool) {.cdecl, importc.}
proc alGetIntegerv(param: ALenum; data: ptr ALint) {.cdecl, importc.}
proc alGetFloatv(param: ALenum; data: ptr ALfloat) {.cdecl, importc.}
proc alGetDoublev(param: ALenum; data: ptr ALdouble) {.cdecl, importc.}
proc alGetBoolean(param: ALenum): bool {.cdecl, importc.}
proc alGetInteger(param: ALenum): ALint {.cdecl, importc.}
proc alGetFloat(param: ALenum): ALfloat {.cdecl, importc.}
proc alGetDouble(param: ALenum): ALdouble {.cdecl, importc.}
proc alGetError(): ALenum {.cdecl, importc.}
proc alIsExtensionPresent(extname: ptr char): bool {.cdecl, importc.}
proc alGetProcAddress(fname: ptr char): pointer {.cdecl, importc.}
proc alGetEnumValue(ename: ptr char): ALenum {.cdecl, importc.}
proc alListenerf(param: ALenum; value: ALfloat) {.cdecl, importc.}
proc alListener3f(param: ALenum; value1: ALfloat; value2: ALfloat; value3: ALfloat) {.cdecl, importc.}
proc alListenerfv(param: ALenum; values: ptr ALfloat) {.cdecl, importc.}
proc alListeneri(param: ALenum; value: ALint) {.cdecl, importc.}
proc alListener3i(param: ALenum; value1: ALint; value2: ALint; value3: ALint) {.cdecl, importc.}
proc alListeneriv(param: ALenum; values: ptr ALint) {.cdecl, importc.}
proc alGetListenerf(param: ALenum; value: ptr ALfloat) {.cdecl, importc.}
proc alGetListener3f(param: ALenum; value1: ptr ALfloat; value2: ptr ALfloat;
value3: ptr ALfloat) {.cdecl, importc.}
proc alGetListenerfv(param: ALenum; values: ptr ALfloat) {.cdecl, importc.}
proc alGetListeneri(param: ALenum; value: ptr ALint) {.cdecl, importc.}
proc alGetListener3i(param: ALenum; value1: ptr ALint; value2: ptr ALint;
value3: ptr ALint) {.cdecl, importc.}
proc alGetListeneriv(param: ALenum; values: ptr ALint) {.cdecl, importc.}
proc alGenSources(n: ALsizei; sources: ptr ALuint) {.cdecl, importc.}
proc alDeleteSources(n: ALsizei; sources: ptr ALuint) {.cdecl, importc.}
proc alIsSource(sid: ALuint): bool {.cdecl, importc.}
proc alSourcef(sid: ALuint; param: ALenum; value: ALfloat) {.cdecl, importc.}
proc alSource3f(sid: ALuint; param: ALenum; value1: ALfloat; value2: ALfloat;
value3: ALfloat) {.cdecl, importc.}
proc alSourcefv(sid: ALuint; param: ALenum; values: ptr ALfloat) {.cdecl, importc.}
proc alSourcei(sid: ALuint; param: ALenum; value: ALint) {.cdecl, importc.}
proc alSource3i(sid: ALuint; param: ALenum; value1: ALint; value2: ALint; value3: ALint) {.cdecl, importc.}
proc alSourceiv(sid: ALuint; param: ALenum; values: ptr ALint) {.cdecl, importc.}
proc alGetSourcef(sid: ALuint; param: ALenum; value: ptr ALfloat) {.cdecl, importc.}
proc alGetSource3f(sid: ALuint; param: ALenum; value1: ptr ALfloat; value2: ptr ALfloat;
value3: ptr ALfloat) {.cdecl, importc.}
proc alGetSourcefv(sid: ALuint; param: ALenum; values: ptr ALfloat) {.cdecl, importc.}
proc alGetSourcei(sid: ALuint; param: ALenum; value: ptr ALint) {.cdecl, importc.}
proc alGetSource3i(sid: ALuint; param: ALenum; value1: ptr ALint; value2: ptr ALint;
value3: ptr ALint) {.cdecl, importc.}
proc alGetSourceiv(sid: ALuint; param: ALenum; values: ptr ALint) {.cdecl, importc.}
proc alSourcePlayv(ns: ALsizei; sids: ptr ALuint) {.cdecl, importc.}
proc alSourceStopv(ns: ALsizei; sids: ptr ALuint) {.cdecl, importc.}
proc alSourceRewindv(ns: ALsizei; sids: ptr ALuint) {.cdecl, importc.}
proc alSourcePausev(ns: ALsizei; sids: ptr ALuint) {.cdecl, importc.}
proc alSourcePlay(sid: ALuint) {.cdecl, importc.}
proc alSourceStop(sid: ALuint) {.cdecl, importc.}
proc alSourceRewind(sid: ALuint) {.cdecl, importc.}
proc alSourcePause(sid: ALuint) {.cdecl, importc.}
proc alSourceQueueBuffers(sid: ALuint; numEntries: ALsizei; bids: ptr ALuint) {.cdecl, importc.}
proc alSourceUnqueueBuffers(sid: ALuint; numEntries: ALsizei; bids: ptr ALuint) {.cdecl, importc.}
proc alGenBuffers(n: ALsizei; buffers: ptr ALuint) {.cdecl, importc.}
proc alDeleteBuffers(n: ALsizei; buffers: ptr ALuint) {.cdecl, importc.}
proc alIsBuffer(bid: ALuint): bool {.cdecl, importc.}
proc alBufferData(bid: ALuint; format: ALenum; data: pointer; size: ALsizei;
freq: ALsizei) {.cdecl, importc.}
proc alBufferf(bid: ALuint; param: ALenum; value: ALfloat) {.cdecl, importc.}
proc alBuffer3f(bid: ALuint; param: ALenum; value1: ALfloat; value2: ALfloat;
value3: ALfloat) {.cdecl, importc.}
proc alBufferfv(bid: ALuint; param: ALenum; values: ptr ALfloat) {.cdecl, importc.}
proc alBufferi(bid: ALuint; param: ALenum; value: ALint) {.cdecl, importc.}
proc alBuffer3i(bid: ALuint; param: ALenum; value1: ALint; value2: ALint; value3: ALint) {.cdecl, importc.}
proc alBufferiv(bid: ALuint; param: ALenum; values: ptr ALint) {.cdecl, importc.}
proc alGetBufferf(bid: ALuint; param: ALenum; value: ptr ALfloat) {.cdecl, importc.}
proc alGetBuffer3f(bid: ALuint; param: ALenum; value1: ptr ALfloat; value2: ptr ALfloat;
value3: ptr ALfloat) {.cdecl, importc.}
proc alGetBufferfv(bid: ALuint; param: ALenum; values: ptr ALfloat) {.cdecl, importc.}
proc alGetBufferi(bid: ALuint; param: ALenum; value: ptr ALint) {.cdecl, importc.}
proc alGetBuffer3i(bid: ALuint; param: ALenum; value1: ptr ALint; value2: ptr ALint;
value3: ptr ALint) {.cdecl, importc.}
proc alGetBufferiv(bid: ALuint; param: ALenum; values: ptr ALint) {.cdecl, importc.}
proc alDopplerFactor(value: ALfloat) {.cdecl, importc.}
proc alDopplerVelocity(value: ALfloat) {.cdecl, importc.}
proc alSpeedOfSound(value: ALfloat) {.cdecl, importc.}
proc alDistanceModel(distanceModel: ALenum) {.cdecl, importc.}
ALCAPI = true
ALCAPIENTRY = true
ALC_INVALID = 0
ALC_VERSION_0_1 = 1
ALCchar = char
ALCbyte = cchar
ALCubyte = cuchar
ALCshort = cshort
ALCushort = cushort
ALCint = cint
ALCuint = cuint
ALCsizei = cint
ALCenum = cint
ALCfloat = cfloat
ALCdouble = cdouble
ALCdevice = pointer
ALCcontext = pointer
ALC_FALSE = 0
ALC_TRUE = 1
ALC_FREQUENCY = 0x00001007
ALC_REFRESH = 0x00001008
ALC_SYNC = 0x00001009
ALC_MONO_SOURCES = 0x00001010
ALC_STEREO_SOURCES = 0x00001011
ALC_NO_ERROR = 0
ALC_INVALID_DEVICE = 0x0000A001
ALC_INVALID_CONTEXT = 0x0000A002
ALC_INVALID_ENUM = 0x0000A003
ALC_INVALID_VALUE = 0x0000A004
ALC_OUT_OF_MEMORY = 0x0000A005
ALC_DEFAULT_DEVICE_SPECIFIER = 0x00001004
ALC_DEVICE_SPECIFIER = 0x00001005
ALC_EXTENSIONS = 0x00001006
ALC_MAJOR_VERSION = 0x00001000
ALC_MINOR_VERSION = 0x00001001
ALC_ATTRIBUTES_SIZE = 0x00001002
ALC_ALL_ATTRIBUTES = 0x00001003
ALC_CAPTURE_DEVICE_SPECIFIER = 0x00000310
ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER = 0x00000311
ALC_CAPTURE_SAMPLES = 0x00000312
proc alcCreateContext(device: ALCdevice; attrlist: ptr ALCint): ALCcontext {.cdecl, importc.}
proc alcMakeContextCurrent(context: ALCcontext): bool {.cdecl, importc.}
proc alcProcessContext(context: ALCcontext) {.cdecl, importc.}
proc alcSuspendContext(context: ALCcontext) {.cdecl, importc.}
proc alcDestroyContext(context: ALCcontext) {.cdecl, importc.}
proc alcGetCurrentContext(): ALCcontext {.cdecl, importc.}
proc alcGetContextsDevice(context: ALCcontext): ALCdevice {.cdecl, importc.}
proc alcOpenDevice(devicename: ptr ALCchar): ALCdevice {.cdecl, importc.}
proc alcCloseDevice(device: ALCdevice): bool {.cdecl, importc.}
proc alcGetError(device: ALCdevice): ALCenum {.cdecl, importc.}
proc alcIsExtensionPresent(device: ALCdevice; extname: ptr ALCchar): bool {.cdecl, importc.}
proc alcGetProcAddress(device: ALCdevice; funcname: ptr ALCchar): pointer {.cdecl, importc.}
proc alcGetEnumValue(device: ALCdevice; enumname: ptr ALCchar): ALCenum {.cdecl, importc.}
proc alcGetString(device: ALCdevice; param: ALCenum): ptr ALCchar {.cdecl, importc.}
proc alcGetIntegerv(device: ALCdevice; param: ALCenum; size: ALCsizei; data: ptr ALCint) {.cdecl, importc.}
proc alcCaptureOpenDevice(devicename: ptr ALCchar; frequency: ALCuint;
format: ALCenum; buffersize: ALCsizei): ALCdevice {.cdecl, importc.}
proc alcCaptureCloseDevice(device: ALCdevice): bool {.cdecl, importc.}
proc alcCaptureStart(device: ALCdevice) {.cdecl, importc.}
proc alcCaptureStop(device: ALCdevice) {.cdecl, importc.}
proc alcCaptureSamples(device: ALCdevice; buffer: pointer; samples: ALCsizei) {.cdecl, importc.}