nuclear@47: #include nuclear@47: #include "openal.h" nuclear@47: #include "audio.h" nuclear@47: nuclear@47: static ALCdevice *dev; nuclear@47: static ALCcontext *ctx; nuclear@47: nuclear@47: nuclear@47: bool init_audio() nuclear@47: { nuclear@47: if(dev) { nuclear@47: return true; nuclear@47: } nuclear@47: nuclear@47: if(!(dev = alcOpenDevice(0))) { nuclear@47: fprintf(stderr, "failed to open OpenAL device\n"); nuclear@47: return false; nuclear@47: } nuclear@47: ctx = alcCreateContext(dev, 0); nuclear@47: alcMakeContextCurrent(ctx); nuclear@47: nuclear@47: alGetError(); // clear error code nuclear@47: return true; nuclear@47: } nuclear@47: nuclear@47: void destroy_audio() nuclear@47: { nuclear@47: alcMakeContextCurrent(0); nuclear@47: if(ctx) { nuclear@47: alcDestroyContext(ctx); nuclear@47: } nuclear@47: if(dev) { nuclear@47: alcCloseDevice(dev); nuclear@47: } nuclear@47: } nuclear@50: nuclear@50: void set_audio_listener(const Matrix4x4 &xform) nuclear@50: { nuclear@50: float pos[3], orient[6]; nuclear@50: nuclear@50: pos[0] = xform[0][3]; nuclear@50: pos[1] = xform[1][3]; nuclear@50: pos[2] = xform[2][3]; nuclear@50: nuclear@50: orient[0] = xform[0][2]; nuclear@50: orient[1] = xform[1][2]; nuclear@51: orient[2] = -xform[2][2]; nuclear@50: nuclear@50: orient[3] = xform[0][1]; nuclear@50: orient[4] = xform[1][1]; nuclear@50: orient[5] = xform[2][1]; nuclear@50: nuclear@50: alListenerfv(AL_POSITION, pos); nuclear@50: alListenerfv(AL_ORIENTATION, orient); nuclear@50: }