Changing the rolloff settings now immediately apply (with fmodex). Also added AudioLevelUnderwaterRolloff now that the underwater rolloff 3d setting doesnt immediately get clobbered. Also, divvied up sound channels into channelgroups if using the fmod profiler, so it actually has useful info to show now.
This commit is contained in:
@@ -47,7 +47,6 @@
|
||||
#include "lllistener.h"
|
||||
|
||||
const F32 LL_WIND_UPDATE_INTERVAL = 0.1f;
|
||||
const F32 LL_ROLLOFF_MULTIPLIER_UNDER_WATER = 5.f; // How much sounds are weaker under water
|
||||
const F32 LL_WIND_UNDERWATER_CENTER_FREQ = 20.f;
|
||||
|
||||
const F32 ATTACHED_OBJECT_TIMEOUT = 5.0f;
|
||||
|
||||
@@ -72,6 +72,8 @@ bool attemptDelayLoad()
|
||||
|
||||
FMOD_RESULT F_CALLBACK windCallback(FMOD_DSP_STATE *dsp_state, float *inbuffer, float *outbuffer, unsigned int length, int inchannels, int outchannels);
|
||||
|
||||
FMOD::ChannelGroup *LLAudioEngine_FMODEX::mChannelGroups[LLAudioEngine::AUDIO_TYPE_COUNT] = {0};
|
||||
|
||||
LLAudioEngine_FMODEX::LLAudioEngine_FMODEX(bool enable_profiler)
|
||||
{
|
||||
mInited = false;
|
||||
@@ -207,7 +209,13 @@ bool LLAudioEngine_FMODEX::init(const S32 num_channels, void* userdata)
|
||||
|
||||
U32 fmod_flags = FMOD_INIT_NORMAL;
|
||||
if(mEnableProfiler)
|
||||
{
|
||||
fmod_flags |= FMOD_INIT_ENABLE_PROFILE;
|
||||
mSystem->createChannelGroup("None", &mChannelGroups[AUDIO_TYPE_NONE]);
|
||||
mSystem->createChannelGroup("SFX", &mChannelGroups[AUDIO_TYPE_SFX]);
|
||||
mSystem->createChannelGroup("UI", &mChannelGroups[AUDIO_TYPE_UI]);
|
||||
mSystem->createChannelGroup("Ambient", &mChannelGroups[AUDIO_TYPE_AMBIENT]);
|
||||
}
|
||||
|
||||
#if LL_LINUX
|
||||
bool audio_ok = false;
|
||||
@@ -639,6 +647,9 @@ void LLAudioChannelFMODEX::play()
|
||||
Check_FMOD_Error(mChannelp->setPaused(false), "FMOD::Channel::pause");
|
||||
|
||||
getSource()->setPlayedOnce(true);
|
||||
|
||||
if(LLAudioEngine_FMODEX::mChannelGroups[getSource()->getType()])
|
||||
mChannelp->setChannelGroup(LLAudioEngine_FMODEX::mChannelGroups[getSource()->getType()]);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -44,6 +44,7 @@ namespace FMOD
|
||||
{
|
||||
class System;
|
||||
class Channel;
|
||||
class ChannelGroup;
|
||||
class Sound;
|
||||
class DSP;
|
||||
}
|
||||
@@ -83,6 +84,9 @@ protected:
|
||||
FMOD::DSP *mWindDSP;
|
||||
FMOD::System *mSystem;
|
||||
bool mEnableProfiler;
|
||||
|
||||
public:
|
||||
static FMOD::ChannelGroup *mChannelGroups[LLAudioEngine::AUDIO_TYPE_COUNT];
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -106,6 +106,15 @@ void LLListener_FMODEX::commitDeferredChanges()
|
||||
|
||||
void LLListener_FMODEX::setRolloffFactor(F32 factor)
|
||||
{
|
||||
//An internal FMODEx optimization skips 3D updates if there have not been changes to the 3D sound environment.
|
||||
//Sadly, a change in rolloff is not accounted for, thus we must touch the listener properties as well.
|
||||
//In short: Changing the position ticks a dirtyflag inside fmodex, which makes it not skip 3D processing next update call.
|
||||
if(mRolloffFactor != factor)
|
||||
{
|
||||
LLVector3 pos = mVelocity - LLVector3(0.f,0.f,.1f);
|
||||
mSystem->set3DListenerAttributes(0, (FMOD_VECTOR*)pos.mV, NULL, NULL, NULL);
|
||||
mSystem->set3DListenerAttributes(0, (FMOD_VECTOR*)mVelocity.mV, NULL, NULL, NULL);
|
||||
}
|
||||
mRolloffFactor = factor;
|
||||
mSystem->set3DSettings(mDopplerFactor, 1.f, mRolloffFactor);
|
||||
}
|
||||
|
||||
@@ -1725,6 +1725,17 @@
|
||||
<key>Value</key>
|
||||
<real>1.0</real>
|
||||
</map>
|
||||
<key>AudioLevelUnderwaterRolloff</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Controls the distance-based dropoff of audio volume when camera is submerged (fraction or multiple of default audio rolloff)</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>F32</string>
|
||||
<key>Value</key>
|
||||
<real>4.0</real>
|
||||
</map>
|
||||
<key>AudioLevelSFX</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
||||
@@ -105,6 +105,7 @@ void LLPanelAudioPrefs::refreshValues()
|
||||
mPreviousMediaVolume = gSavedSettings.getF32("AudioLevelMedia");
|
||||
mPreviousDoppler = gSavedSettings.getF32("AudioLevelDoppler");
|
||||
mPreviousRolloff = gSavedSettings.getF32("AudioLevelRolloff");
|
||||
mPreviousUnderwaterRolloff = gSavedSettings.getF32("AudioLevelUnderwaterRolloff");
|
||||
|
||||
mPreviousMoneyThreshold = gSavedSettings.getF32("UISndMoneyChangeThreshold");
|
||||
mPreviousHealthThreshold = gSavedSettings.getF32("UISndHealthReductionThreshold");
|
||||
@@ -126,6 +127,7 @@ void LLPanelAudioPrefs::cancel()
|
||||
gSavedSettings.setF32("AudioLevelMedia", mPreviousMediaVolume);
|
||||
gSavedSettings.setF32("AudioLevelDoppler", mPreviousDoppler );
|
||||
gSavedSettings.setF32("AudioLevelRolloff", mPreviousRolloff );
|
||||
gSavedSettings.setF32("AudioLevelUnderwaterRolloff", mPreviousUnderwaterRolloff );
|
||||
|
||||
gSavedSettings.setF32("UISndMoneyChangeThreshold", mPreviousMoneyThreshold );
|
||||
gSavedSettings.setF32("UISndHealthReductionThreshold", mPreviousHealthThreshold );
|
||||
|
||||
@@ -67,6 +67,7 @@ private:
|
||||
F32 mPreviousDoppler;
|
||||
F32 mPreviousDistance;
|
||||
F32 mPreviousRolloff;
|
||||
F32 mPreviousUnderwaterRolloff;
|
||||
|
||||
S32 mPreviousBitrate;
|
||||
|
||||
|
||||
@@ -134,6 +134,7 @@ void audio_update_volume(bool force_update)
|
||||
static const LLCachedControl<bool> mute_when_minimized("MuteWhenMinimized",true);
|
||||
static const LLCachedControl<F32> audio_level_doppler("AudioLevelDoppler",1.0);
|
||||
static const LLCachedControl<F32> audio_level_rolloff("AudioLevelRolloff",1.0);
|
||||
static const LLCachedControl<F32> audio_level_underwater_rolloff("AudioLevelUnderwaterRolloff",3.0);
|
||||
BOOL mute_audio = _mute_audio;
|
||||
if (!gViewerWindow->getActive() && mute_when_minimized)
|
||||
{
|
||||
@@ -147,7 +148,11 @@ void audio_update_volume(bool force_update)
|
||||
gAudiop->setMasterGain ( master_volume );
|
||||
|
||||
gAudiop->setDopplerFactor(audio_level_doppler);
|
||||
gAudiop->setRolloffFactor(audio_level_rolloff);
|
||||
if(!LLViewerCamera::getInstance()->cameraUnderWater())
|
||||
gAudiop->setRolloffFactor( audio_level_rolloff );
|
||||
else
|
||||
gAudiop->setRolloffFactor( audio_level_underwater_rolloff );
|
||||
|
||||
gAudiop->setMuted(mute_audio);
|
||||
|
||||
if (force_update)
|
||||
@@ -215,32 +220,8 @@ void audio_update_listener()
|
||||
void audio_update_wind(bool force_update)
|
||||
{
|
||||
#ifdef kAUDIO_ENABLE_WIND
|
||||
//
|
||||
// Extract height above water to modulate filter by whether above/below water
|
||||
//
|
||||
LLViewerRegion* region = gAgent.getRegion();
|
||||
if (region)
|
||||
if(gAgent.getRegion())
|
||||
{
|
||||
static F32 last_camera_water_height = -1000.f;
|
||||
LLVector3 camera_pos = gAgentCamera.getCameraPositionAgent();
|
||||
F32 camera_water_height = camera_pos.mV[VZ] - region->getWaterHeight();
|
||||
|
||||
//
|
||||
// Don't update rolloff factor unless water surface has been crossed
|
||||
//
|
||||
if (force_update || (last_camera_water_height * camera_water_height) < 0.f)
|
||||
{
|
||||
static const LLCachedControl<F32> audio_level_rolloff("AudioLevelRolloff",1);
|
||||
if (camera_water_height < 0.f)
|
||||
{
|
||||
gAudiop->setRolloffFactor(audio_level_rolloff * LL_ROLLOFF_MULTIPLIER_UNDER_WATER);
|
||||
}
|
||||
else
|
||||
{
|
||||
gAudiop->setRolloffFactor(audio_level_rolloff);
|
||||
}
|
||||
}
|
||||
|
||||
// Scale down the contribution of weather-simulation wind to the
|
||||
// ambient wind noise. Wind velocity averages 3.5 m/s, with gusts to 7 m/s
|
||||
// whereas steady-state avatar walk velocity is only 3.2 m/s.
|
||||
@@ -289,8 +270,7 @@ void audio_update_wind(bool force_update)
|
||||
gAudiop->mMaxWindGain = llmax(gAudiop->mMaxWindGain - volume_delta, 0.f);
|
||||
}
|
||||
|
||||
last_camera_water_height = camera_water_height;
|
||||
gAudiop->updateWind(gRelativeWindVec, camera_water_height);
|
||||
gAudiop->updateWind(gRelativeWindVec, gAgentCamera.getCameraPositionAgent()[VZ] - gAgent.getRegion()->getWaterHeight());
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -690,6 +690,7 @@ void settings_setup_listeners()
|
||||
gSavedSettings.getControl("AudioLevelVoice")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _2));
|
||||
gSavedSettings.getControl("AudioLevelDoppler")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _2));
|
||||
gSavedSettings.getControl("AudioLevelRolloff")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _2));
|
||||
gSavedSettings.getControl("AudioLevelUnderwaterRolloff")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _2));
|
||||
gSavedSettings.getControl("AudioStreamingMusic")->getSignal()->connect(boost::bind(&handleAudioStreamMusicChanged, _2));
|
||||
gSavedSettings.getControl("MuteAudio")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _2));
|
||||
gSavedSettings.getControl("MuteMusic")->getSignal()->connect(boost::bind(&handleAudioVolumeChanged, _2));
|
||||
|
||||
@@ -9,8 +9,9 @@
|
||||
<check_box bottom_delta="-20" control_name="ParcelMediaAutoPlayEnable" follows="top" height="16" initial_value="true" label="Automatically play media" left="162" name="auto_streaming_video"/>
|
||||
<check_box bottom_delta="-20" control_name="MediaEnableFilter" follows="top" height="16" initial_value="true" label="Ask for permission (enables filtering)" name="streaming_video"/>
|
||||
<check_box bottom_delta="-25" control_name="MuteWhenMinimized" follows="top" height="16" initial_value="true" label="Mute Audio When Window Minimized" left="142" name="mute_when_minimized"/>
|
||||
<slider bottom_delta="-20" control_name="AudioLevelDoppler" edit_text="true" follows="top" height="15" increment="0.1" initial_val="1" label="Doppler Effect" label_width="69" left="148" max_val="2" min_val="0" name="Doppler Effect" show_text="true" width="219" />
|
||||
<slider bottom_delta="-20" control_name="AudioLevelRolloff" edit_text="true" follows="top" height="15" increment="0.1" initial_val="1" label="Rolloff Factor" label_width="69" max_val="2" min_val="0" name="Rolloff Factor" width="219"/>
|
||||
<spinner bottom_delta="-20" control_name="UISndMoneyChangeThreshold" decimal_digits="0" follows="top" height="16" increment="10" initial_val="10" label="[CURRENCY] change threshold:" label_width="128" max_val="10000" min_val="0" name="currency_change_threshold" width="192"/>
|
||||
<slider bottom_delta="-20" control_name="AudioLevelDoppler" edit_text="true" follows="top" height="15" increment="0.1" initial_val="1" label="Doppler Effect" label_width="130" left="148" max_val="2" min_val="0" name="Doppler Effect" show_text="true" width="300" />
|
||||
<slider bottom_delta="-20" control_name="AudioLevelRolloff" edit_text="true" follows="top" height="15" increment="0.1" initial_val="1" label="Rolloff Factor (Default)" label_width="130" max_val="2" min_val="0" name="Rolloff Factor" width="300"/>
|
||||
<slider bottom_delta="-20" control_name="AudioLevelUnderwaterRolloff" edit_text="true" follows="top" height="15" increment="0.1" initial_val="3" label="Rolloff Factor (Underwater)" label_width="130" max_val="8" min_val="0" name="Underwater Rolloff Factor" width="300"/>
|
||||
<spinner bottom_delta="-20" control_name="UISndMoneyChangeThreshold" decimal_digits="0" follows="top" height="16" increment="10" initial_val="10" label="[CURRENCY] change threshold:" label_width="128" max_val="10000" min_val="0" name="currency_change_threshold" width="192"/>
|
||||
<spinner bottom_delta="-20" control_name="UISndHealthReductionThreshold" decimal_digits="0" follows="top" height="16" increment="10" initial_val="20" label="Health Change Threshold" label_width="128" max_val="10000" min_val="0" name="Health Change Threshold" width="192" />
|
||||
</panel>
|
||||
|
||||
Reference in New Issue
Block a user