diff options
author | Kae <80987908+Novaenia@users.noreply.github.com> | 2023-07-21 00:58:49 +1000 |
---|---|---|
committer | Kae <80987908+Novaenia@users.noreply.github.com> | 2023-07-21 00:58:49 +1000 |
commit | 4b0bc220e4da1173f742a4973939b139bef562db (patch) | |
tree | 0ff66d5957575fa814fc10b8cd93e3dd378f45dc /source/base | |
parent | 607be749451aa40e3619e7ceab0927d1fcec8233 (diff) |
Support for changing the game's timescale
Context-specific (like per-world) timescales can also be added later
Diffstat (limited to 'source/base')
-rw-r--r-- | source/base/StarMixer.cpp | 13 | ||||
-rw-r--r-- | source/base/StarMixer.hpp | 6 |
2 files changed, 17 insertions, 2 deletions
diff --git a/source/base/StarMixer.cpp b/source/base/StarMixer.cpp index c38d17e..2ec6b9e 100644 --- a/source/base/StarMixer.cpp +++ b/source/base/StarMixer.cpp @@ -172,6 +172,8 @@ Mixer::Mixer(unsigned sampleRate, unsigned channels) { m_groupVolumes[MixerGroup::Effects] = {1.0f, 1.0f, 0}; m_groupVolumes[MixerGroup::Music] = {1.0f, 1.0f, 0}; m_groupVolumes[MixerGroup::Cinematic] = {1.0f, 1.0f, 0}; + + m_speed = 1.0f; } unsigned Mixer::sampleRate() const { @@ -203,6 +205,10 @@ bool Mixer::hasEffect(String const& effectName) { return m_effects.contains(effectName); } +void Mixer::setSpeed(float speed) { + m_speed = speed; +} + void Mixer::setVolume(float volume, float rampTime) { MutexLocker locker(m_mutex); m_volume.target = volume; @@ -259,6 +265,8 @@ void Mixer::read(int16_t* outBuffer, size_t frameCount, ExtraMixFunction extraMi for (size_t i = 0; i < bufferSize; ++i) outBuffer[i] = 0; + float speed = m_speed; + { MutexLocker locker(m_queueMutex); // Mix all active sounds @@ -288,6 +296,9 @@ void Mixer::read(int16_t* outBuffer, size_t frameCount, ExtraMixFunction extraMi ? approach(audioInstance->m_pitchMultiplierTarget, audioInstance->m_pitchMultiplier, audioInstance->m_pitchMultiplierVelocity * time) : audioInstance->m_pitchMultiplier; + if (audioInstance->m_mixerGroup == MixerGroup::Effects) + pitchMultiplier *= speed; + if (audioStopVolEnd == 0.0f && audioInstance->m_stopping) finished = true; @@ -461,7 +472,7 @@ void Mixer::setGroupVolume(MixerGroup group, float targetValue, float rampTime) } } -void Mixer::update(PositionalAttenuationFunction positionalAttenuationFunction) { +void Mixer::update(float dt, PositionalAttenuationFunction positionalAttenuationFunction) { { MutexLocker locker(m_queueMutex); eraseWhere(m_audios, [&](auto& p) { diff --git a/source/base/StarMixer.hpp b/source/base/StarMixer.hpp index d369cfb..f87f5be 100644 --- a/source/base/StarMixer.hpp +++ b/source/base/StarMixer.hpp @@ -115,6 +115,9 @@ public: StringList currentEffects(); bool hasEffect(String const& effectName); + // Global speed + void setSpeed(float speed); + // Global volume void setVolume(float volume, float rampTime); @@ -131,7 +134,7 @@ public: // Call within the main loop of the program using Mixer, calculates // positional attenuation of audio and does cleanup. - void update(PositionalAttenuationFunction positionalAttenuationFunction = {}); + void update(float dt, PositionalAttenuationFunction positionalAttenuationFunction = {}); private: struct EffectInfo { @@ -161,6 +164,7 @@ private: List<int16_t> m_mixBuffer; Map<MixerGroup, RampedValue> m_groupVolumes; + atomic<float> m_speed; }; } |