OpenAL alDistanceModel Усиление / Затухание - PullRequest
0 голосов
/ 14 марта 2019

Здравствуйте, я делаю проект с OpenAL.Я пытался заставить alDistanceModel работать, но, похоже, это не работает.Я посмотрел на OpenAL Manuel, который углубляется в это, но я все еще в замешательстве.

У меня есть карта source_id: std :: map source_id;он содержит фактический буферный ключ и хранит исходный идентификатор.

У меня также есть карта буферов std :: buffer_handle.

Я получаю отправку карты buffer_handle в файл .wav длястрока и карта buffer_handle возвращает действительный дескриптор.затем я делаю то же самое, использую возвращенное значение buffer_handle для получения source_id.

В функции set_attenuation я почти уверен, что установил правильные переменные.но звук просто играет с нормальным усилением 1, когда я близко, далеко.Так что я сделал вручную уравнение, и это сработало, но я сомневаюсь, что это правильный путь.

Переменная расстояния рассчитывается по формуле расстояния от слушателя до места, где будет воспроизводиться звук.

Переменная 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...