nimble install openal
This library has no dependencies other than the Nim standard library.
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:
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 openalALuint = cuintALint = cintALsizei = cintALenum = cintALfloat = float32ALdouble = float64AL_SOURCE_RELATIVE = 0x00000202AL_CONE_INNER_ANGLE = 0x00001001AL_CONE_OUTER_ANGLE = 0x00001002AL_PITCH = 0x00001003AL_POSITION = 0x00001004AL_DIRECTION = 0x00001005AL_VELOCITY = 0x00001006AL_LOOPING = 0x00001007AL_BUFFER = 0x00001009AL_GAIN = 0x0000100AAL_MIN_GAIN = 0x0000100DAL_MAX_GAIN = 0x0000100EAL_ORIENTATION = 0x0000100FAL_SOURCE_STATE = 0x00001010AL_INITIAL = 0x00001011AL_PLAYING = 0x00001012AL_PAUSED = 0x00001013AL_STOPPED = 0x00001014AL_BUFFERS_QUEUED = 0x00001015AL_BUFFERS_PROCESSED = 0x00001016AL_SEC_OFFSET = 0x00001024AL_SAMPLE_OFFSET = 0x00001025AL_BYTE_OFFSET = 0x00001026AL_SOURCE_TYPE = 0x00001027AL_STATIC = 0x00001028AL_STREAMING = 0x00001029AL_UNDETERMINED = 0x00001030AL_FORMAT_MONO8 = 0x00001100AL_FORMAT_MONO16 = 0x00001101AL_FORMAT_STEREO8 = 0x00001102AL_FORMAT_STEREO16 = 0x00001103AL_REFERENCE_DISTANCE = 0x00001020AL_ROLLOFF_FACTOR = 0x00001021AL_CONE_OUTER_GAIN = 0x00001022AL_MAX_DISTANCE = 0x00001023AL_FREQUENCY = 0x00002001AL_BITS = 0x00002002AL_CHANNELS = 0x00002003AL_SIZE = 0x00002004AL_UNUSED = 0x00002010AL_PENDING = 0x00002011AL_PROCESSED = 0x00002012AL_NO_ERROR = falseAL_INVALID_NAME = 0x0000A001AL_INVALID_ENUM = 0x0000A002AL_INVALID_VALUE = 0x0000A003AL_INVALID_OPERATION = 0x0000A004AL_OUT_OF_MEMORY = 0x0000A005AL_VENDOR = 0x0000B001AL_VERSION = 0x0000B002AL_RENDERER = 0x0000B003AL_EXTENSIONS = 0x0000B004AL_DOPPLER_FACTOR = 0x0000C000AL_DOPPLER_VELOCITY = 0x0000C001AL_SPEED_OF_SOUND = 0x0000C003AL_DISTANCE_MODEL = 0x0000D000AL_INVERSE_DISTANCE = 0x0000D001AL_INVERSE_DISTANCE_CLAMPED = 0x0000D002AL_LINEAR_DISTANCE = 0x0000D003AL_LINEAR_DISTANCE_CLAMPED = 0x0000D004AL_EXPONENT_DISTANCE = 0x0000D005AL_EXPONENT_DISTANCE_CLAMPED = 0x0000D006AL_PRIORITY = 0x0000E001AL_PRIORITY_SLOTS = 0x0000E002proc 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 = trueALCAPIENTRY = trueALC_INVALID = 0ALC_VERSION_0_1 = 1ALCchar = charALCbyte = ccharALCubyte = cucharALCshort = cshortALCushort = cushortALCint = cintALCuint = cuintALCsizei = cintALCenum = cintALCfloat = cfloatALCdouble = cdoubleALCdevice = pointerALCcontext = pointerALC_FALSE = 0ALC_TRUE = 1ALC_FREQUENCY = 0x00001007ALC_REFRESH = 0x00001008ALC_SYNC = 0x00001009ALC_MONO_SOURCES = 0x00001010ALC_STEREO_SOURCES = 0x00001011ALC_NO_ERROR = 0ALC_INVALID_DEVICE = 0x0000A001ALC_INVALID_CONTEXT = 0x0000A002ALC_INVALID_ENUM = 0x0000A003ALC_INVALID_VALUE = 0x0000A004ALC_OUT_OF_MEMORY = 0x0000A005ALC_DEFAULT_DEVICE_SPECIFIER = 0x00001004ALC_DEVICE_SPECIFIER = 0x00001005ALC_EXTENSIONS = 0x00001006ALC_MAJOR_VERSION = 0x00001000ALC_MINOR_VERSION = 0x00001001ALC_ATTRIBUTES_SIZE = 0x00001002ALC_ALL_ATTRIBUTES = 0x00001003ALC_CAPTURE_DEVICE_SPECIFIER = 0x00000310ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER = 0x00000311ALC_CAPTURE_SAMPLES = 0x00000312proc 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.}