nuclear@48: #include "openal.h" nuclear@48: #include "source.h" nuclear@48: nuclear@48: AudioSource::AudioSource() nuclear@48: { nuclear@48: sample = 0; nuclear@48: nuclear@48: alGenSources(1, &alsrc); nuclear@48: alSourcei(alsrc, AL_LOOPING, AL_TRUE); nuclear@48: } nuclear@48: nuclear@48: AudioSource::~AudioSource() nuclear@48: { nuclear@48: if(alsrc) { nuclear@48: if(is_playing()) { nuclear@48: stop(); nuclear@48: } nuclear@48: alDeleteSources(1, &alsrc); nuclear@48: } nuclear@48: } nuclear@48: nuclear@48: void AudioSource::set_sample(const AudioSample *sample) nuclear@48: { nuclear@48: stop(); nuclear@48: nuclear@48: if(sample) { nuclear@48: if(!sample->albuffer) { nuclear@48: fprintf(stderr, "%s: trying to attach null buffer!\n", __FUNCTION__); nuclear@48: return; nuclear@48: } nuclear@48: alSourcei(alsrc, AL_BUFFER, sample->albuffer); nuclear@48: } nuclear@48: this->sample = sample; nuclear@48: } nuclear@48: nuclear@48: const AudioSample *AudioSource::get_sample() const nuclear@48: { nuclear@48: return sample; nuclear@48: } nuclear@48: nuclear@48: void AudioSource::set_position(const Vector3 &pos, bool viewspace) nuclear@48: { nuclear@48: alSourcei(alsrc, AL_SOURCE_RELATIVE, viewspace ? AL_TRUE : AL_FALSE); nuclear@48: alSource3f(alsrc, AL_POSITION, pos.x, pos.y, pos.z); nuclear@48: } nuclear@48: nuclear@48: Vector3 AudioSource::get_position() const nuclear@48: { nuclear@48: float pos[3]; nuclear@48: alGetSourcefv(alsrc, AL_POSITION, pos); nuclear@48: return Vector3(pos[0], pos[1], pos[2]); nuclear@48: } nuclear@48: nuclear@51: void AudioSource::set_volume(float vol) nuclear@51: { nuclear@51: alSourcef(alsrc, AL_GAIN, vol); nuclear@51: } nuclear@51: nuclear@51: float AudioSource::get_volume() const nuclear@51: { nuclear@51: float vol; nuclear@51: alGetSourcef(alsrc, AL_GAIN, &vol); nuclear@51: return vol; nuclear@51: } nuclear@51: nuclear@51: void AudioSource::set_reference_dist(float rdist) nuclear@51: { nuclear@51: alSourcef(alsrc, AL_REFERENCE_DISTANCE, rdist); nuclear@51: } nuclear@51: nuclear@51: float AudioSource::get_reference_dist() const nuclear@51: { nuclear@51: float res; nuclear@51: alGetSourcef(alsrc, AL_REFERENCE_DISTANCE, &res); nuclear@51: return res; nuclear@51: } nuclear@51: nuclear@48: bool AudioSource::is_playing() const nuclear@48: { nuclear@48: int state; nuclear@48: alGetSourcei(alsrc, AL_SOURCE_STATE, &state); nuclear@48: return state == AL_PLAYING; nuclear@48: } nuclear@48: nuclear@48: void AudioSource::play() nuclear@48: { nuclear@48: if(sample) { nuclear@48: alSourcePlay(alsrc); nuclear@48: } nuclear@48: } nuclear@48: nuclear@48: void AudioSource::stop() nuclear@48: { nuclear@48: if(sample) { nuclear@48: alSourceStop(alsrc); nuclear@48: } nuclear@48: }