Add control to the sound attenuation by distance.

This commit is contained in:
Jonathan Giroux
2011-12-14 00:32:18 +01:00
parent 362a7835b4
commit 36a93e46c7
17 changed files with 516 additions and 11 deletions
+44 -1
View File
@@ -58,7 +58,7 @@ namespace openal
}
Audio::Audio()
Audio::Audio() : distanceModel(DISTANCE_INVERSE_CLAMPED)
{
// Passing zero for default device.
device = alcOpenDevice(0);
@@ -267,7 +267,50 @@ namespace openal
{
return (capture != NULL);
}
Audio::DistanceModel Audio::getDistanceModel() const
{
return this->distanceModel;
}
void Audio::setDistanceModel(DistanceModel distanceModel)
{
this->distanceModel = distanceModel;
switch (distanceModel)
{
case DISTANCE_NONE:
alDistanceModel(AL_NONE);
break;
case DISTANCE_INVERSE:
alDistanceModel(AL_INVERSE_DISTANCE);
break;
case DISTANCE_INVERSE_CLAMPED:
alDistanceModel(AL_INVERSE_DISTANCE_CLAMPED);
break;
case DISTANCE_LINEAR:
alDistanceModel(AL_LINEAR_DISTANCE);
break;
case DISTANCE_LINEAR_CLAMPED:
alDistanceModel(AL_LINEAR_DISTANCE_CLAMPED);
break;
case DISTANCE_EXPONENT:
alDistanceModel(AL_EXPONENT_DISTANCE);
break;
case DISTANCE_EXPONENT_CLAMPED:
alDistanceModel(AL_EXPONENT_DISTANCE_CLAMPED);
break;
default:
break;
}
}
} // openal
} // audio
} // love
+5 -1
View File
@@ -89,6 +89,8 @@ namespace openal
PoolThread* poolThread;
DistanceModel distanceModel;
public:
Audio();
@@ -126,7 +128,9 @@ namespace openal
love::sound::SoundData * getRecordedData();
love::sound::SoundData * stopRecording(bool returnData);
bool canRecord();
DistanceModel getDistanceModel() const;
void setDistanceModel(DistanceModel distanceModel);
}; // Audio
} // openal
+132 -4
View File
@@ -24,6 +24,7 @@
// STD
#include <iostream>
#include <float.h>
namespace love
{
@@ -34,8 +35,9 @@ namespace openal
Source::Source(Pool * pool, love::sound::SoundData * soundData)
: love::audio::Source(Source::TYPE_STATIC), pool(pool), valid(false),
pitch(1.0f), volume(1.0f), looping(false), paused(false), offsetSamples(0),
offsetSeconds(0), decoder(0), toLoop(0)
pitch(1.0f), volume(1.0f), looping(false), paused(false), minVolume(0.0f),
maxVolume(1.0f), referenceDistance(1.0f), rolloffFactor(1.0f), maxDistance(FLT_MAX),
offsetSamples(0), offsetSeconds(0), decoder(0), toLoop(0)
{
alGenBuffers(1, buffers);
ALenum fmt = getFormat(soundData->getChannels(), soundData->getBits());
@@ -50,8 +52,9 @@ namespace openal
Source::Source(Pool * pool, love::sound::Decoder * decoder)
: love::audio::Source(Source::TYPE_STREAM), pool(pool), valid(false),
pitch(1.0f), volume(1.0f), looping(false), paused(false), offsetSamples(0),
offsetSeconds(0), decoder(decoder), toLoop(0)
pitch(1.0f), volume(1.0f), looping(false), paused(false), minVolume(0.0f),
maxVolume(1.0f), referenceDistance(1.0f), rolloffFactor(1.0f), maxDistance(FLT_MAX),
offsetSamples(0), offsetSeconds(0), decoder(decoder), toLoop(0)
{
decoder->retain();
alGenBuffers(MAX_BUFFERS, buffers);
@@ -415,6 +418,11 @@ namespace openal
// been without an AL source.
alSourcef(source, AL_PITCH, pitch);
alSourcef(source, AL_GAIN, volume);
alSourcef(source, AL_MIN_GAIN, minVolume);
alSourcef(source, AL_MAX_GAIN, maxVolume);
alSourcef(source, AL_REFERENCE_DISTANCE, referenceDistance);
alSourcef(source, AL_ROLLOFF_FACTOR, rolloffFactor);
alSourcef(source, AL_MAX_DISTANCE, maxDistance);
alSourcePlay(source);
@@ -503,6 +511,11 @@ namespace openal
alSourcefv(source, AL_DIRECTION, direction);
alSourcef(source, AL_PITCH, pitch);
alSourcef(source, AL_GAIN, volume);
alSourcef(source, AL_MIN_GAIN, minVolume);
alSourcef(source, AL_MAX_GAIN, maxVolume);
alSourcef(source, AL_REFERENCE_DISTANCE, referenceDistance);
alSourcef(source, AL_ROLLOFF_FACTOR, rolloffFactor);
alSourcef(source, AL_MAX_DISTANCE, maxDistance);
}
void Source::setFloatv(float * dst, const float * src) const
@@ -564,6 +577,121 @@ namespace openal
{
return (type == TYPE_STATIC);
}
void Source::setMinVolume(float volume)
{
if (valid)
{
alSourcef(source, AL_MIN_GAIN, volume);
}
this->minVolume = volume;
}
float Source::getMinVolume() const
{
if (valid)
{
ALfloat f;
alGetSourcef(source, AL_MIN_GAIN, &f);
return f;
}
// In case the Source isn't playing.
return this->minVolume;
}
void Source::setMaxVolume(float volume)
{
if (valid)
{
alSourcef(source, AL_MAX_GAIN, volume);
}
this->maxVolume = volume;
}
float Source::getMaxVolume() const
{
if (valid)
{
ALfloat f;
alGetSourcef(source, AL_MAX_GAIN, &f);
return f;
}
// In case the Source isn't playing.
return this->maxVolume;
}
void Source::setReferenceDistance(float distance)
{
if (valid)
{
alSourcef(source, AL_REFERENCE_DISTANCE, distance);
}
this->referenceDistance = distance;
}
float Source::getReferenceDistance() const
{
if (valid)
{
ALfloat f;
alGetSourcef(source, AL_REFERENCE_DISTANCE, &f);
return f;
}
// In case the Source isn't playing.
return this->referenceDistance;
}
void Source::setRolloffFactor(float factor)
{
if (valid)
{
alSourcef(source, AL_ROLLOFF_FACTOR, factor);
}
this->rolloffFactor = factor;
}
float Source::getRolloffFactor() const
{
if (valid)
{
ALfloat f;
alGetSourcef(source, AL_ROLLOFF_FACTOR, &f);
return f;
}
// In case the Source isn't playing.
return this->rolloffFactor;
}
void Source::setMaxDistance(float distance)
{
if (valid)
{
alSourcef(source, AL_MAX_DISTANCE, distance);
}
this->maxDistance = distance;
}
float Source::getMaxDistance() const
{
if (valid)
{
ALfloat f;
alGetSourcef(source, AL_MAX_DISTANCE, &f);
return f;
}
// In case the Source isn't playing.
return this->maxDistance;
}
} // openal
} // audio
+15
View File
@@ -63,6 +63,11 @@ namespace openal
float direction[3];
bool looping;
bool paused;
float minVolume;
float maxVolume;
float referenceDistance;
float rolloffFactor;
float maxDistance;
float offsetSamples;
float offsetSeconds;
@@ -103,6 +108,16 @@ namespace openal
void setLooping(bool looping);
bool isLooping() const;
bool isStatic() const;
virtual void setMinVolume(float volume);
virtual float getMinVolume() const;
virtual void setMaxVolume(float volume);
virtual float getMaxVolume() const;
virtual void setReferenceDistance(float distance);
virtual float getReferenceDistance() const;
virtual void setRolloffFactor(float factor);
virtual float getRolloffFactor() const;
virtual void setMaxDistance(float distance);
virtual float getMaxDistance() const;
void playAtomic();
void stopAtomic();