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 }