From 57513610fdb45111d501b385c9cb9fe48fdacb2c Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 15 Apr 2014 12:43:02 -0700 Subject: [PATCH] recalc on any attribute changes --- interface/src/AudioReflector.cpp | 39 +++++++++++++++++++++++++++----- interface/src/AudioReflector.h | 11 ++++++++- 2 files changed, 43 insertions(+), 7 deletions(-) diff --git a/interface/src/AudioReflector.cpp b/interface/src/AudioReflector.cpp index 7801c26924..6c3e1e0f0b 100644 --- a/interface/src/AudioReflector.cpp +++ b/interface/src/AudioReflector.cpp @@ -32,7 +32,13 @@ AudioReflector::AudioReflector(QObject* parent) : _diffusionFanout(DEFAULT_DIFFUSION_FANOUT), _absorptionRatio(DEFAULT_ABSORPTION_RATIO), _diffusionRatio(DEFAULT_DIFFUSION_RATIO), - _withDiffusion(false) + _withDiffusion(false), + _lastPreDelay(DEFAULT_PRE_DELAY), + _lastSoundMsPerMeter(DEFAULT_MS_DELAY_PER_METER), + _lastDistanceAttenuationScalingFactor(DEFAULT_DISTANCE_SCALING_FACTOR), + _lastDiffusionFanout(DEFAULT_DIFFUSION_FANOUT), + _lastAbsorptionRatio(DEFAULT_ABSORPTION_RATIO), + _lastDiffusionRatio(DEFAULT_DIFFUSION_RATIO) { _reflections = 0; _diffusionPathCount = 0; @@ -44,6 +50,30 @@ AudioReflector::AudioReflector(QObject* parent) : _minDelay = 0; } +bool AudioReflector::haveAttributesChanged() { + bool withDiffusion = Menu::getInstance()->isOptionChecked(MenuOption::AudioSpatialProcessingWithDiffusions); + + bool attributesChange = (_withDiffusion != withDiffusion + || _lastPreDelay != _preDelay + || _lastSoundMsPerMeter != _soundMsPerMeter + || _lastDistanceAttenuationScalingFactor != _distanceAttenuationScalingFactor + || _lastDiffusionFanout != _diffusionFanout + || _lastAbsorptionRatio != _absorptionRatio + || _lastDiffusionRatio != _diffusionRatio); + + if (attributesChange) { + _withDiffusion = withDiffusion; + _lastPreDelay = _preDelay; + _lastSoundMsPerMeter = _soundMsPerMeter; + _lastDistanceAttenuationScalingFactor = _distanceAttenuationScalingFactor; + _lastDiffusionFanout = _diffusionFanout; + _lastAbsorptionRatio = _absorptionRatio; + _lastDiffusionRatio = _diffusionRatio; + } + + return attributesChange; +} + void AudioReflector::render() { // if we're not set up yet, or we're not processing spatial audio, then exit early @@ -274,20 +304,18 @@ void AudioReflector::addSoundSource(const glm::vec3& origin, const glm::vec3& in } void AudioReflector::calculateAllReflections() { - // only recalculate when we've moved... + // only recalculate when we've moved, or if the attributes have changed // TODO: what about case where new voxels are added in front of us??? bool wantHeadOrientation = Menu::getInstance()->isOptionChecked(MenuOption::AudioSpatialProcessingHeadOriented); glm::quat orientation = wantHeadOrientation ? _myAvatar->getHead()->getFinalOrientation() : _myAvatar->getOrientation(); glm::vec3 origin = _myAvatar->getHead()->getPosition(); glm::vec3 listenerPosition = _myAvatar->getHead()->getPosition(); - bool withDiffusion = Menu::getInstance()->isOptionChecked(MenuOption::AudioSpatialProcessingWithDiffusions); - bool shouldRecalc = _reflections == 0 || !isSimilarPosition(origin, _origin) || !isSimilarOrientation(orientation, _orientation) || !isSimilarPosition(listenerPosition, _listenerPosition) - || (withDiffusion != _withDiffusion); + || haveAttributesChanged(); if (shouldRecalc) { QMutexLocker locker(&_mutex); @@ -295,7 +323,6 @@ void AudioReflector::calculateAllReflections() { _origin = origin; _orientation = orientation; _listenerPosition = listenerPosition; - _withDiffusion = withDiffusion; analyzePaths(); // actually does the work quint64 end = usecTimestampNow(); const bool wantDebugging = false; diff --git a/interface/src/AudioReflector.h b/interface/src/AudioReflector.h index 72eca9aac2..6a4d10524f 100644 --- a/interface/src/AudioReflector.h +++ b/interface/src/AudioReflector.h @@ -171,8 +171,17 @@ private: float _absorptionRatio; float _diffusionRatio; float _reflectiveRatio; - + + // remember the last known values at calculation + bool haveAttributesChanged(); + bool _withDiffusion; + float _lastPreDelay; + float _lastSoundMsPerMeter; + float _lastDistanceAttenuationScalingFactor; + int _lastDiffusionFanout; + float _lastAbsorptionRatio; + float _lastDiffusionRatio; };