mirror of
https://github.com/love2d/love.git
synced 2026-08-17 02:58:31 +02:00
Add control to the sound attenuation by distance.
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user