OpenAL alDistanceModel增益/衰减

时间:2019-03-14 10:33:56

标签: c++ openal

您好,我正在使用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);
}

1 个答案:

答案 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格式。