您好,我正在使用OpenAL做一个项目。我试图使alDistanceModel正常工作,但似乎不起作用。我看着深入的OpenAL Manuel,但我仍然感到困惑。
我有一个source_id的映射:std :: map source_id; 它拥有实际的缓冲键并存储源ID。
我也有一个缓冲区std :: buffer_handle的映射。
我抓取到一个字符串的.wav文件中发送的buffer_handle映射,并且buffer_handle映射返回一个有效的句柄。然后我做同样的事情,我使用返回的buffer_handle值来获取source_id。
我非常确定我已经设置了正确的变量。但是当我靠近时,声音只会以正常增益1播放。因此,我所做的是我手动执行了该方程式,并且该方法奏效了,但我怀疑这是正确的方法。
Distance变量是通过使用从收听者到将要播放音频的距离公式来计算的。
RefDistance变量,我相信是区域的宽度的半径,因此您可以通过距离进行计算以确定正确的增益/衰减。
因此,将所有内容整合在一起,我在做错什么吗? OpenAL在内部执行方程式,然后适当地更新它吗?因为在我手动执行此方程之前,OpenAL并未执行任何操作。
void cacctus_audio_manager::play(const ALuint& source, const ALuint& buffer,bool
loop,std::ostringstream& _debug)
{
set_attenuation(source);
if (loop)
{
alSourcei(source, AL_LOOPING, AL_TRUE);
}
else
{
alSourcei(source, AL_LOOPING, AL_FALSE);
}
alSourceQueueBuffers(source, 1, &buffer_id);
alSourcePlay(source);
}
#define MAX_GAIN 1.0f
#define MIN_GAIN 0.00f
#define REFERENCE_DISTANCE 10.0f
#define MAX_DISTANCE 125.0f
#define MIN_DISTANCE 0.0f
#define ROLL_OFF_FACTOR 1.0f;
set_attenuation(const ALuint& source)
{
alDistanceModel(AL_EXPONENT_DISTANCE_CLAMPED);
alSourcef(source, AL_ROLLOFF_FACTOR, 1);
alSourcef(source, AL_REFERENCE_DISTANCE,REFERENCE_DISTANCE);
alSourcef(source, AL_MAX_DISTANCE,MAX_DISTANCE);
alSourcef(source, AL_MAX_GAIN, MAX_GAIN);
alSourcef(source, AL_MIN_GAIN, MIN_GAIN);
ALfloat mRefDist = REFERENCE_DISTANCE;
ALfloat mVolume = 0;
ALfloat mRolloffvalue = ROLL_OFF_FACTOR;
alGetSourcef(source,AL_GAIN,&mVolume);
_distance = std::max(_distance,mRefDist);
mVolume = std::pow((_distance / mRefDist),(-mRolloffvalue));
alSourcef(source, AL_GAIN,mVolume);
}
答案 0 :(得分:0)
您确定缓冲区中包含MONO格式的声音吗?因为如果不是,则:根据OpenAL文档https://openal.org/documentation/OpenAL_Programmers_Guide.pdf,如果将源附加到具有STEREO声音的缓冲区,则该源不再受距离计算的影响。引用第21页的文档:
8位PCM数据表示为0到0范围内的无符号值 255、128是零的音频输出级别。 16位PCM数据是 表示为-32768至32767范围内的有符号值,0为 音频输出电平为零。立体声数据以交错形式表示 格式,左声道优先。 缓冲区包含多个通道 的数据将在没有3D空间的情况下播放。
因此,在进一步研究问题之前,请先确保您的缓冲区已配置为AL_FORMAT_MONO8或AL_FORMAT_MONO16格式。