From 4b0bc220e4da1173f742a4973939b139bef562db Mon Sep 17 00:00:00 2001 From: Kae <80987908+Novaenia@users.noreply.github.com> Date: Fri, 21 Jul 2023 00:58:49 +1000 Subject: Support for changing the game's timescale Context-specific (like per-world) timescales can also be added later --- source/base/StarMixer.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) (limited to 'source/base/StarMixer.cpp') 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) { -- cgit v1.2.3