dungeon_crawler

annotate prototype/src/audio/audio.cc @ 51:d57df51f6b50

- fixed audio panning (listener direction) - particles had no fog - sound sources were not destroyed properly
author John Tsiombikas <nuclear@member.fsf.org>
date Tue, 18 Sep 2012 09:40:56 +0300
parents c40efa9cf844
children
rev   line source
nuclear@47 1 #include <stdio.h>
nuclear@47 2 #include "openal.h"
nuclear@47 3 #include "audio.h"
nuclear@47 4
nuclear@47 5 static ALCdevice *dev;
nuclear@47 6 static ALCcontext *ctx;
nuclear@47 7
nuclear@47 8
nuclear@47 9 bool init_audio()
nuclear@47 10 {
nuclear@47 11 if(dev) {
nuclear@47 12 return true;
nuclear@47 13 }
nuclear@47 14
nuclear@47 15 if(!(dev = alcOpenDevice(0))) {
nuclear@47 16 fprintf(stderr, "failed to open OpenAL device\n");
nuclear@47 17 return false;
nuclear@47 18 }
nuclear@47 19 ctx = alcCreateContext(dev, 0);
nuclear@47 20 alcMakeContextCurrent(ctx);
nuclear@47 21
nuclear@47 22 alGetError(); // clear error code
nuclear@47 23 return true;
nuclear@47 24 }
nuclear@47 25
nuclear@47 26 void destroy_audio()
nuclear@47 27 {
nuclear@47 28 alcMakeContextCurrent(0);
nuclear@47 29 if(ctx) {
nuclear@47 30 alcDestroyContext(ctx);
nuclear@47 31 }
nuclear@47 32 if(dev) {
nuclear@47 33 alcCloseDevice(dev);
nuclear@47 34 }
nuclear@47 35 }
nuclear@50 36
nuclear@50 37 void set_audio_listener(const Matrix4x4 &xform)
nuclear@50 38 {
nuclear@50 39 float pos[3], orient[6];
nuclear@50 40
nuclear@50 41 pos[0] = xform[0][3];
nuclear@50 42 pos[1] = xform[1][3];
nuclear@50 43 pos[2] = xform[2][3];
nuclear@50 44
nuclear@50 45 orient[0] = xform[0][2];
nuclear@50 46 orient[1] = xform[1][2];
nuclear@51 47 orient[2] = -xform[2][2];
nuclear@50 48
nuclear@50 49 orient[3] = xform[0][1];
nuclear@50 50 orient[4] = xform[1][1];
nuclear@50 51 orient[5] = xform[2][1];
nuclear@50 52
nuclear@50 53 alListenerfv(AL_POSITION, pos);
nuclear@50 54 alListenerfv(AL_ORIENTATION, orient);
nuclear@50 55 }