mirror of
https://github.com/TES3MP/openmw-tes3mp.git
synced 2025-01-21 11:23:51 +00:00
Merge pull request #2947 from elsid/fix_sound_update
Clamp sound volume on settings update (fix #5507)
This commit is contained in:
commit
21d4c9fe84
8 changed files with 108 additions and 55 deletions
|
@ -36,6 +36,7 @@
|
||||||
Bug #5490: Hits to carried left slot aren't redistributed if there's no shield equipped
|
Bug #5490: Hits to carried left slot aren't redistributed if there's no shield equipped
|
||||||
Bug #5499: Faction advance is available when requirements not met
|
Bug #5499: Faction advance is available when requirements not met
|
||||||
Bug #5502: Dead zone for analogue stick movement is too small
|
Bug #5502: Dead zone for analogue stick movement is too small
|
||||||
|
Bug #5507: Sound volume is not clamped on ingame settings update
|
||||||
Feature #390: 3rd person look "over the shoulder"
|
Feature #390: 3rd person look "over the shoulder"
|
||||||
Feature #2386: Distant Statics in the form of Object Paging
|
Feature #2386: Distant Statics in the form of Object Paging
|
||||||
Feature #5297: Add a search function to the "Datafiles" tab of the OpenMW launcher
|
Feature #5297: Add a search function to the "Datafiles" tab of the OpenMW launcher
|
||||||
|
|
|
@ -57,7 +57,7 @@ add_openmw_dir (mwscript
|
||||||
|
|
||||||
add_openmw_dir (mwsound
|
add_openmw_dir (mwsound
|
||||||
soundmanagerimp openal_output ffmpeg_decoder sound sound_buffer sound_decoder sound_output
|
soundmanagerimp openal_output ffmpeg_decoder sound sound_buffer sound_decoder sound_output
|
||||||
loudness movieaudiofactory alext efx efx-presets regionsoundselector watersoundupdater
|
loudness movieaudiofactory alext efx efx-presets regionsoundselector watersoundupdater volumesettings
|
||||||
)
|
)
|
||||||
|
|
||||||
add_openmw_dir (mwworld
|
add_openmw_dir (mwworld
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
#include <set>
|
#include <set>
|
||||||
|
|
||||||
#include "../mwworld/ptr.hpp"
|
#include "../mwworld/ptr.hpp"
|
||||||
|
#include "../mwsound/type.hpp"
|
||||||
|
|
||||||
namespace MWWorld
|
namespace MWWorld
|
||||||
{
|
{
|
||||||
|
@ -44,14 +45,7 @@ namespace MWSound
|
||||||
LoopNoEnv = Loop | NoEnv,
|
LoopNoEnv = Loop | NoEnv,
|
||||||
LoopRemoveAtDistance = Loop | RemoveAtDistance
|
LoopRemoveAtDistance = Loop | RemoveAtDistance
|
||||||
};
|
};
|
||||||
enum class Type {
|
|
||||||
Sfx = 1<<4, /* Normal SFX sound */
|
|
||||||
Voice = 1<<5, /* Voice sound */
|
|
||||||
Foot = 1<<6, /* Footstep sound */
|
|
||||||
Music = 1<<7, /* Music track */
|
|
||||||
Movie = 1<<8, /* Movie audio track */
|
|
||||||
Mask = Sfx | Voice | Foot | Music | Movie
|
|
||||||
};
|
|
||||||
// Used for creating a type mask for SoundManager::pauseSounds and resumeSounds
|
// Used for creating a type mask for SoundManager::pauseSounds and resumeSounds
|
||||||
inline int operator~(Type a) { return ~static_cast<int>(a); }
|
inline int operator~(Type a) { return ~static_cast<int>(a); }
|
||||||
inline int operator&(Type a, Type b) { return static_cast<int>(a) & static_cast<int>(b); }
|
inline int operator&(Type a, Type b) { return static_cast<int>(a) & static_cast<int>(b); }
|
||||||
|
|
|
@ -53,11 +53,6 @@ namespace MWSound
|
||||||
SoundManager::SoundManager(const VFS::Manager* vfs, bool useSound)
|
SoundManager::SoundManager(const VFS::Manager* vfs, bool useSound)
|
||||||
: mVFS(vfs)
|
: mVFS(vfs)
|
||||||
, mOutput(new DEFAULT_OUTPUT(*this))
|
, mOutput(new DEFAULT_OUTPUT(*this))
|
||||||
, mMasterVolume(1.0f)
|
|
||||||
, mSFXVolume(1.0f)
|
|
||||||
, mMusicVolume(1.0f)
|
|
||||||
, mVoiceVolume(1.0f)
|
|
||||||
, mFootstepsVolume(1.0f)
|
|
||||||
, mWaterSoundUpdater(makeWaterSoundUpdaterSettings())
|
, mWaterSoundUpdater(makeWaterSoundUpdaterSettings())
|
||||||
, mSoundBuffers(new SoundBufferList::element_type())
|
, mSoundBuffers(new SoundBufferList::element_type())
|
||||||
, mBufferCacheSize(0)
|
, mBufferCacheSize(0)
|
||||||
|
@ -72,17 +67,6 @@ namespace MWSound
|
||||||
, mNearWaterSound(nullptr)
|
, mNearWaterSound(nullptr)
|
||||||
, mPlaybackPaused(false)
|
, mPlaybackPaused(false)
|
||||||
{
|
{
|
||||||
mMasterVolume = Settings::Manager::getFloat("master volume", "Sound");
|
|
||||||
mMasterVolume = std::min(std::max(mMasterVolume, 0.0f), 1.0f);
|
|
||||||
mSFXVolume = Settings::Manager::getFloat("sfx volume", "Sound");
|
|
||||||
mSFXVolume = std::min(std::max(mSFXVolume, 0.0f), 1.0f);
|
|
||||||
mMusicVolume = Settings::Manager::getFloat("music volume", "Sound");
|
|
||||||
mMusicVolume = std::min(std::max(mMusicVolume, 0.0f), 1.0f);
|
|
||||||
mVoiceVolume = Settings::Manager::getFloat("voice volume", "Sound");
|
|
||||||
mVoiceVolume = std::min(std::max(mVoiceVolume, 0.0f), 1.0f);
|
|
||||||
mFootstepsVolume = Settings::Manager::getFloat("footsteps volume", "Sound");
|
|
||||||
mFootstepsVolume = std::min(std::max(mFootstepsVolume, 0.0f), 1.0f);
|
|
||||||
|
|
||||||
mBufferCacheMin = std::max(Settings::Manager::getInt("buffer cache min", "Sound"), 1);
|
mBufferCacheMin = std::max(Settings::Manager::getInt("buffer cache min", "Sound"), 1);
|
||||||
mBufferCacheMax = std::max(Settings::Manager::getInt("buffer cache max", "Sound"), 1);
|
mBufferCacheMax = std::max(Settings::Manager::getInt("buffer cache max", "Sound"), 1);
|
||||||
mBufferCacheMax *= 1024*1024;
|
mBufferCacheMax *= 1024*1024;
|
||||||
|
@ -349,26 +333,7 @@ namespace MWSound
|
||||||
// Gets the combined volume settings for the given sound type
|
// Gets the combined volume settings for the given sound type
|
||||||
float SoundManager::volumeFromType(Type type) const
|
float SoundManager::volumeFromType(Type type) const
|
||||||
{
|
{
|
||||||
float volume = mMasterVolume;
|
return mVolumeSettings.getVolumeFromType(type);
|
||||||
switch(type)
|
|
||||||
{
|
|
||||||
case Type::Sfx:
|
|
||||||
volume *= mSFXVolume;
|
|
||||||
break;
|
|
||||||
case Type::Voice:
|
|
||||||
volume *= mVoiceVolume;
|
|
||||||
break;
|
|
||||||
case Type::Foot:
|
|
||||||
volume *= mFootstepsVolume;
|
|
||||||
break;
|
|
||||||
case Type::Music:
|
|
||||||
volume *= mMusicVolume;
|
|
||||||
break;
|
|
||||||
case Type::Movie:
|
|
||||||
case Type::Mask:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return volume;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SoundManager::stopMusic()
|
void SoundManager::stopMusic()
|
||||||
|
@ -1158,11 +1123,7 @@ namespace MWSound
|
||||||
|
|
||||||
void SoundManager::processChangedSettings(const Settings::CategorySettingVector& settings)
|
void SoundManager::processChangedSettings(const Settings::CategorySettingVector& settings)
|
||||||
{
|
{
|
||||||
mMasterVolume = Settings::Manager::getFloat("master volume", "Sound");
|
mVolumeSettings.update();
|
||||||
mMusicVolume = Settings::Manager::getFloat("music volume", "Sound");
|
|
||||||
mSFXVolume = Settings::Manager::getFloat("sfx volume", "Sound");
|
|
||||||
mFootstepsVolume = Settings::Manager::getFloat("footsteps volume", "Sound");
|
|
||||||
mVoiceVolume = Settings::Manager::getFloat("voice volume", "Sound");
|
|
||||||
|
|
||||||
if(!mOutput->isInitialized())
|
if(!mOutput->isInitialized())
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -16,6 +16,8 @@
|
||||||
|
|
||||||
#include "regionsoundselector.hpp"
|
#include "regionsoundselector.hpp"
|
||||||
#include "watersoundupdater.hpp"
|
#include "watersoundupdater.hpp"
|
||||||
|
#include "type.hpp"
|
||||||
|
#include "volumesettings.hpp"
|
||||||
|
|
||||||
namespace VFS
|
namespace VFS
|
||||||
{
|
{
|
||||||
|
@ -56,11 +58,7 @@ namespace MWSound
|
||||||
std::unordered_map<std::string, std::vector<int>> mMusicToPlay; // A list with music files not yet played
|
std::unordered_map<std::string, std::vector<int>> mMusicToPlay; // A list with music files not yet played
|
||||||
std::string mLastPlayedMusic; // The music file that was last played
|
std::string mLastPlayedMusic; // The music file that was last played
|
||||||
|
|
||||||
float mMasterVolume;
|
VolumeSettings mVolumeSettings;
|
||||||
float mSFXVolume;
|
|
||||||
float mMusicVolume;
|
|
||||||
float mVoiceVolume;
|
|
||||||
float mFootstepsVolume;
|
|
||||||
|
|
||||||
WaterSoundUpdater mWaterSoundUpdater;
|
WaterSoundUpdater mWaterSoundUpdater;
|
||||||
|
|
||||||
|
|
17
apps/openmw/mwsound/type.hpp
Normal file
17
apps/openmw/mwsound/type.hpp
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
#ifndef GAME_SOUND_TYPE_H
|
||||||
|
#define GAME_SOUND_TYPE_H
|
||||||
|
|
||||||
|
namespace MWSound
|
||||||
|
{
|
||||||
|
enum class Type
|
||||||
|
{
|
||||||
|
Sfx = 1 << 4, /* Normal SFX sound */
|
||||||
|
Voice = 1 << 5, /* Voice sound */
|
||||||
|
Foot = 1 << 6, /* Footstep sound */
|
||||||
|
Music = 1 << 7, /* Music track */
|
||||||
|
Movie = 1 << 8, /* Movie audio track */
|
||||||
|
Mask = Sfx | Voice | Foot | Music | Movie
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
56
apps/openmw/mwsound/volumesettings.cpp
Normal file
56
apps/openmw/mwsound/volumesettings.cpp
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
#include "volumesettings.hpp"
|
||||||
|
|
||||||
|
#include <components/settings/settings.hpp>
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
|
namespace MWSound
|
||||||
|
{
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
float clamp(float value)
|
||||||
|
{
|
||||||
|
return std::max(0.0f, std::min(1.0f, value));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
VolumeSettings::VolumeSettings()
|
||||||
|
: mMasterVolume(clamp(Settings::Manager::getFloat("master volume", "Sound"))),
|
||||||
|
mSFXVolume(clamp(Settings::Manager::getFloat("sfx volume", "Sound"))),
|
||||||
|
mMusicVolume(clamp(Settings::Manager::getFloat("music volume", "Sound"))),
|
||||||
|
mVoiceVolume(clamp(Settings::Manager::getFloat("voice volume", "Sound"))),
|
||||||
|
mFootstepsVolume(clamp(Settings::Manager::getFloat("footsteps volume", "Sound")))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
float VolumeSettings::getVolumeFromType(Type type) const
|
||||||
|
{
|
||||||
|
float volume = mMasterVolume;
|
||||||
|
|
||||||
|
switch(type)
|
||||||
|
{
|
||||||
|
case Type::Sfx:
|
||||||
|
volume *= mSFXVolume;
|
||||||
|
break;
|
||||||
|
case Type::Voice:
|
||||||
|
volume *= mVoiceVolume;
|
||||||
|
break;
|
||||||
|
case Type::Foot:
|
||||||
|
volume *= mFootstepsVolume;
|
||||||
|
break;
|
||||||
|
case Type::Music:
|
||||||
|
volume *= mMusicVolume;
|
||||||
|
break;
|
||||||
|
case Type::Movie:
|
||||||
|
case Type::Mask:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return volume;
|
||||||
|
}
|
||||||
|
|
||||||
|
void VolumeSettings::update()
|
||||||
|
{
|
||||||
|
*this = VolumeSettings();
|
||||||
|
}
|
||||||
|
}
|
26
apps/openmw/mwsound/volumesettings.hpp
Normal file
26
apps/openmw/mwsound/volumesettings.hpp
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
#ifndef GAME_SOUND_VOLUMESETTINGS_H
|
||||||
|
#define GAME_SOUND_VOLUMESETTINGS_H
|
||||||
|
|
||||||
|
#include "type.hpp"
|
||||||
|
|
||||||
|
namespace MWSound
|
||||||
|
{
|
||||||
|
class VolumeSettings
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
VolumeSettings();
|
||||||
|
|
||||||
|
float getVolumeFromType(Type type) const;
|
||||||
|
|
||||||
|
void update();
|
||||||
|
|
||||||
|
private:
|
||||||
|
float mMasterVolume;
|
||||||
|
float mSFXVolume;
|
||||||
|
float mMusicVolume;
|
||||||
|
float mVoiceVolume;
|
||||||
|
float mFootstepsVolume;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in a new issue