开放式AldistanceModel增益/衰减

OpenAL alDistanceModel Gain/Attenuation

本文关键字:衰减 增益 AldistanceModel 开放式      更新时间:2023-10-16

你好,我正在开放一个项目。我试图让AldistanceModel上班,但似乎行不通。我看了一个开放的曼努埃尔(Manuel),但我仍然感到困惑。

我有一个source_id的地图:std :: map source_id;它包含实际的缓冲键并存储源ID。

我也有一个缓冲区std :: buffer_handle的地图。

我抓住buffer_handle映射在.wav文件中发送的字符串,而buffer_handle地图返回有效的句柄。然后我做同样的事情,我使用返回的buffer_handle值来获取source_id。

在set_attenuation函数中,我很确定我已经设置了正确的变量。但是,当我接近时,声音的正常增益为1。所以我所做的是手动执行了方程式,但我怀疑这是正确的方法。

距离变量是通过使用从侦听器到播放音频的距离公式来计算的。

避免变量,我认为是该区域宽度的半径,因此您可以通过距离进行计算以确定正确的增益/衰减。

因此,将这一切都放在一起,我做错了吗?开放式内部是否进行方程式,然后对其进行适当的更新?因为在我手动执行此方程之前,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);
}

您是否确定缓冲区包含单声道格式的声音?因为如果没有:根据开放文档https://openal.org/documentation/openal_programmers_guide.pdf如果源用立体声声音连接到缓冲区,则此源不再受距离计算的影响。第21页的文档引用:

8位PCM数据表示为在范围0至范围内的无符号值255,128是零的音频输出水平。16位PCM数据是以范围内的签名值表示-32768至32767,0是一个音频输出水平为零。立体声数据以交错表示格式,首先左通道。缓冲区包含多个通道数据将在没有3D空间化的情况下播放。

因此,首先确保您的缓冲区已配置为Al_format_mono8或al_format_mono16格式,然后再进行进一步研究问题。