dungeon_crawler
annotate prototype/src/audio/source.cc @ 48:aa9e28670ae2
added sound playback, more to do
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Mon, 17 Sep 2012 08:40:59 +0300 |
parents | |
children | d57df51f6b50 |
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@48 | 54 bool AudioSource::is_playing() const |
nuclear@48 | 55 { |
nuclear@48 | 56 int state; |
nuclear@48 | 57 alGetSourcei(alsrc, AL_SOURCE_STATE, &state); |
nuclear@48 | 58 return state == AL_PLAYING; |
nuclear@48 | 59 } |
nuclear@48 | 60 |
nuclear@48 | 61 void AudioSource::play() |
nuclear@48 | 62 { |
nuclear@48 | 63 if(sample) { |
nuclear@48 | 64 alSourcePlay(alsrc); |
nuclear@48 | 65 } |
nuclear@48 | 66 } |
nuclear@48 | 67 |
nuclear@48 | 68 void AudioSource::stop() |
nuclear@48 | 69 { |
nuclear@48 | 70 if(sample) { |
nuclear@48 | 71 alSourceStop(alsrc); |
nuclear@48 | 72 } |
nuclear@48 | 73 } |