dungeon_crawler

annotate prototype/src/audio/source.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 aa9e28670ae2
children
rev   line source
nuclear@48 1 #include "openal.h"
nuclear@48 2 #include "source.h"
nuclear@48 3
nuclear@48 4 AudioSource::AudioSource()
nuclear@48 5 {
nuclear@48 6 sample = 0;
nuclear@48 7
nuclear@48 8 alGenSources(1, &alsrc);
nuclear@48 9 alSourcei(alsrc, AL_LOOPING, AL_TRUE);
nuclear@48 10 }
nuclear@48 11
nuclear@48 12 AudioSource::~AudioSource()
nuclear@48 13 {
nuclear@48 14 if(alsrc) {
nuclear@48 15 if(is_playing()) {
nuclear@48 16 stop();
nuclear@48 17 }
nuclear@48 18 alDeleteSources(1, &alsrc);
nuclear@48 19 }
nuclear@48 20 }
nuclear@48 21
nuclear@48 22 void AudioSource::set_sample(const AudioSample *sample)
nuclear@48 23 {
nuclear@48 24 stop();
nuclear@48 25
nuclear@48 26 if(sample) {
nuclear@48 27 if(!sample->albuffer) {
nuclear@48 28 fprintf(stderr, "%s: trying to attach null buffer!\n", __FUNCTION__);
nuclear@48 29 return;
nuclear@48 30 }
nuclear@48 31 alSourcei(alsrc, AL_BUFFER, sample->albuffer);
nuclear@48 32 }
nuclear@48 33 this->sample = sample;
nuclear@48 34 }
nuclear@48 35
nuclear@48 36 const AudioSample *AudioSource::get_sample() const
nuclear@48 37 {
nuclear@48 38 return sample;
nuclear@48 39 }
nuclear@48 40
nuclear@48 41 void AudioSource::set_position(const Vector3 &pos, bool viewspace)
nuclear@48 42 {
nuclear@48 43 alSourcei(alsrc, AL_SOURCE_RELATIVE, viewspace ? AL_TRUE : AL_FALSE);
nuclear@48 44 alSource3f(alsrc, AL_POSITION, pos.x, pos.y, pos.z);
nuclear@48 45 }
nuclear@48 46
nuclear@48 47 Vector3 AudioSource::get_position() const
nuclear@48 48 {
nuclear@48 49 float pos[3];
nuclear@48 50 alGetSourcefv(alsrc, AL_POSITION, pos);
nuclear@48 51 return Vector3(pos[0], pos[1], pos[2]);
nuclear@48 52 }
nuclear@48 53
nuclear@51 54 void AudioSource::set_volume(float vol)
nuclear@51 55 {
nuclear@51 56 alSourcef(alsrc, AL_GAIN, vol);
nuclear@51 57 }
nuclear@51 58
nuclear@51 59 float AudioSource::get_volume() const
nuclear@51 60 {
nuclear@51 61 float vol;
nuclear@51 62 alGetSourcef(alsrc, AL_GAIN, &vol);
nuclear@51 63 return vol;
nuclear@51 64 }
nuclear@51 65
nuclear@51 66 void AudioSource::set_reference_dist(float rdist)
nuclear@51 67 {
nuclear@51 68 alSourcef(alsrc, AL_REFERENCE_DISTANCE, rdist);
nuclear@51 69 }
nuclear@51 70
nuclear@51 71 float AudioSource::get_reference_dist() const
nuclear@51 72 {
nuclear@51 73 float res;
nuclear@51 74 alGetSourcef(alsrc, AL_REFERENCE_DISTANCE, &res);
nuclear@51 75 return res;
nuclear@51 76 }
nuclear@51 77
nuclear@48 78 bool AudioSource::is_playing() const
nuclear@48 79 {
nuclear@48 80 int state;
nuclear@48 81 alGetSourcei(alsrc, AL_SOURCE_STATE, &state);
nuclear@48 82 return state == AL_PLAYING;
nuclear@48 83 }
nuclear@48 84
nuclear@48 85 void AudioSource::play()
nuclear@48 86 {
nuclear@48 87 if(sample) {
nuclear@48 88 alSourcePlay(alsrc);
nuclear@48 89 }
nuclear@48 90 }
nuclear@48 91
nuclear@48 92 void AudioSource::stop()
nuclear@48 93 {
nuclear@48 94 if(sample) {
nuclear@48 95 alSourceStop(alsrc);
nuclear@48 96 }
nuclear@48 97 }