Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
path: root/source/base
diff options
context:
space:
mode:
authorKae <80987908+Novaenia@users.noreply.github.com>2023-07-21 00:58:49 +1000
committerKae <80987908+Novaenia@users.noreply.github.com>2023-07-21 00:58:49 +1000
commit4b0bc220e4da1173f742a4973939b139bef562db (patch)
tree0ff66d5957575fa814fc10b8cd93e3dd378f45dc /source/base
parent607be749451aa40e3619e7ceab0927d1fcec8233 (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.cpp13
-rw-r--r--source/base/StarMixer.hpp6
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;
};
}