26#include <unordered_map>
83 const glm::vec3& position,
84 const glm::vec3& velocity = glm::vec3{0.0f},
86 float priority = 1.0f);
88 bool positional =
false,
89 const glm::vec3& position = glm::vec3{0.0f},
91 float priority = 1.0f);
93 const glm::vec3& position,
94 const glm::vec3& velocity = glm::vec3{0.0f},
99 void setListener(
const audio::ListenerState& listener);
101 const glm::vec3& position,
102 const glm::vec3& velocity = glm::vec3{0.0f});
104 void setAudioRtpc(audio::AudioObjectId
object, audio::RtpcId rtpc,
float value);
105 void setAudioSwitch(audio::AudioObjectId
object, audio::SwitchGroupId group, audio::SwitchValueId value);
106 void setAudioState(audio::StateGroupId group, audio::StateValueId value);
115 std::uint16_t sequence,
116 std::span<const float> monoPcm48k,
117 const glm::vec3& position,
118 const glm::vec3& velocity = glm::vec3{0.0f});
229 std::uint16_t maxInstances = 0,
230 std::uint16_t maxBusInstances = 0);
236 const glm::vec3& position,
237 const glm::vec3& velocity,
242 std::uint16_t maxInstances,
243 std::uint16_t maxBusInstances,
244 float cooldownOverrideSeconds = -1.0f,
253 bool isOccluded(
const glm::vec3& position)
const;
254 static void mixCallback(
void* userdata, SDL_AudioStream* stream,
int additionalAmount,
int totalAmount);
255 void mixIntoStream(SDL_AudioStream* stream,
int additionalAmount);
Pure helpers for spatial audio attenuation, panning, Doppler, and occlusion.
Wwise-like data-driven audio runtime definitions and resolver.
Network client identifier component for multiplayer entities.
Event structs dispatched via entt::dispatcher for particle spawning.
Shared ECS registry type alias for the game engine.
entt::registry Registry
Shared ECS registry type alias.
Definition Registry.hpp:11
Sound effect identifiers, categories, and the SoundClip data type.
SfxId
Identifies a loaded sound clip.
Definition SfxTypes.hpp:16
@ _Count
Definition SfxTypes.hpp:118
SfxCategory
Sound category for per-category volume control.
Definition SfxTypes.hpp:140
@ _Count
Definition SfxTypes.hpp:148
UiSoundAction
Semantic menu/UI sound actions.
Definition SfxTypes.hpp:123
@ _Count
Definition SfxTypes.hpp:135
Client-side sound effects system.
Definition SfxSystem.hpp:50
int prevKills_
Definition SfxSystem.hpp:213
void setMasterVolume(float v)
Definition SfxSystem.hpp:124
audio::AudioRuntime audioRuntime_
Definition SfxSystem.hpp:190
void setAudioState(audio::StateGroupId group, audio::StateValueId value)
Definition SfxSystem.cpp:558
SourceHandle startSource(SfxId id, bool positional, bool loop, const glm::vec3 &position, const glm::vec3 &velocity, float gain, float priority, audio::AudioBusId bus, float busGain, std::uint16_t maxInstances, std::uint16_t maxBusInstances, float cooldownOverrideSeconds=-1.0f, float fullGainDistance=audio::k_fullGainDistance, float silentDistance=audio::k_silentDistance)
Definition SfxSystem.cpp:1217
bool init()
Initialise SDL audio subsystem, open default playback device, load all clips.
Definition SfxSystem.cpp:223
bool pendingReopen_
Set by handleEvent(), processed at the start of update().
Definition SfxSystem.hpp:221
void updateSource(SourceHandle handle, const glm::vec3 &position, const glm::vec3 &velocity=glm::vec3{0.0f}, float gain=1.0f)
Definition SfxSystem.cpp:452
void quit()
Destroy active sources, close the audio device, quit audio subsystem.
Definition SfxSystem.cpp:380
std::array< float, static_cast< size_t >(UiSoundAction::_Count)> uiActionCooldowns_
Definition SfxSystem.hpp:206
SourceHandle play3D(SfxId id, const glm::vec3 &position, const glm::vec3 &velocity=glm::vec3{0.0f}, float gain=1.0f, float priority=1.0f)
Definition SfxSystem.cpp:441
void setCategoryVolume(SfxCategory cat, float v)
Definition SfxSystem.cpp:667
float categoryVolume(SfxCategory cat) const
Definition SfxSystem.cpp:682
SourceHandle startLoop(SfxId id, bool positional=false, const glm::vec3 &position=glm::vec3{0.0f}, float gain=1.0f, float priority=1.0f)
Definition SfxSystem.cpp:447
static constexpr int kMaxSources
Definition SfxSystem.hpp:180
const audio::AudioRuntimeStats & audioStats() const noexcept
Definition SfxSystem.hpp:137
std::array< Source, kMaxSources > sources_
Definition SfxSystem.hpp:182
SourceHandle nextSourceHandle_
Definition SfxSystem.hpp:183
std::string manifestPath_
Definition SfxSystem.hpp:192
void removeAudioObject(audio::AudioObjectId object)
Definition SfxSystem.cpp:543
float healingSoundCooldown_
Throttle the looping heal tick sound.
Definition SfxSystem.hpp:218
SourceHandle postAudioEvent(std::string_view eventName, audio::AudioObjectId object=audio::kGlobalObject, float gain=1.0f)
Definition SfxSystem.cpp:581
std::array< float, 48000 > reverbDelayL_
Definition SfxSystem.hpp:195
std::unordered_map< entt::entity, bool > knownFireFields_
Definition SfxSystem.hpp:217
void play(SfxId id, float gain=1.0f)
Play a sound immediately.
Definition SfxSystem.cpp:403
void setAudioBusVolume(audio::AudioBusId bus, float volume)
Definition SfxSystem.cpp:563
const SfxRuntimeStats & sfxStats() const noexcept
Definition SfxSystem.hpp:138
void onExplosion(const ExplosionEvent &e)
Definition SfxSystem.cpp:722
SourceHandle play2D(SfxId id, float gain=1.0f, float priority=1.0f)
Definition SfxSystem.cpp:408
SDL_AudioDeviceID physicalDeviceId_
Logical device ID we opened (for event matching).
Definition SfxSystem.hpp:145
const audio::AudioRuntime & audioRuntime() const noexcept
Definition SfxSystem.hpp:136
SDL_AudioSpec mixerSpec_
Definition SfxSystem.hpp:147
std::string playbackDeviceName_
Definition SfxSystem.hpp:193
bool reloadAudioManifest()
Definition SfxSystem.cpp:568
std::uint32_t activeSourceCount() const noexcept
Definition SfxSystem.cpp:1514
std::array< std::size_t, static_cast< size_t >(UiSoundAction::_Count)> uiActionVariantCursors_
Definition SfxSystem.hpp:207
std::mutex mixerMutex_
Definition SfxSystem.hpp:202
void setAudioObjectTransform(audio::AudioObjectId object, const glm::vec3 &position, const glm::vec3 &velocity=glm::vec3{0.0f})
Definition SfxSystem.cpp:536
float clipDuration(SfxId id) const noexcept
Definition SfxSystem.cpp:1534
bool prevLocalReloading_
Definition SfxSystem.hpp:214
SfxId currentMusic_
Definition SfxSystem.hpp:186
void stopSource(SourceHandle handle)
Definition SfxSystem.cpp:466
SourceHandle postLocalAudioEvent(std::string_view eventName, audio::AudioObjectId object=audio::kGlobalObject, float gain=1.0f)
Definition SfxSystem.cpp:593
float deathMuffleStateR_
Definition SfxSystem.hpp:201
std::array< float, 48000 > reverbDelayR_
Definition SfxSystem.hpp:196
std::unordered_map< int, SourceHandle > voiceSources_
Definition SfxSystem.hpp:184
void setPlaybackDeviceName(std::string_view name)
Definition SfxSystem.cpp:672
void handleEvent(const SDL_Event &event)
Forward SDL audio-device events so the system can handle hot-swap.
Definition SfxSystem.cpp:729
float deathMuffleAmount_
Definition SfxSystem.hpp:199
void reopenDevice()
Tear down all active voices/streams, close the device, then reopen.
Definition SfxSystem.cpp:1339
float masterVolume_
Definition SfxSystem.hpp:188
SfxRuntimeStats sfxStats_
Definition SfxSystem.hpp:191
float deathMuffleTarget_
Definition SfxSystem.hpp:198
std::uint32_t SourceHandle
Definition SfxSystem.hpp:52
static void mixCallback(void *userdata, SDL_AudioStream *stream, int additionalAmount, int totalAmount)
Definition SfxSystem.cpp:1374
bool prevLocalRailgunCharging_
Definition SfxSystem.hpp:215
void setAudioSwitch(audio::AudioObjectId object, audio::SwitchGroupId group, audio::SwitchValueId value)
Definition SfxSystem.cpp:553
void setListener(const audio::ListenerState &listener)
Definition SfxSystem.cpp:526
static constexpr SourceHandle kInvalidSource
Definition SfxSystem.hpp:53
void update(float dt)
Per-frame update: decrement cooldowns and retire finished voices.
Definition SfxSystem.cpp:745
Source * acquireSource(float priority, SfxId id=SfxId::_Count, audio::AudioBusId bus=audio::kInvalidBus, std::uint16_t maxInstances=0, std::uint16_t maxBusInstances=0)
Definition SfxSystem.cpp:1120
Source * findSource(SourceHandle handle)
Definition SfxSystem.cpp:1193
void convertClipToMixer(SoundClip &clip, const char *debugName)
Definition SfxSystem.cpp:1084
bool stateInitialized_
Skip sounds on the very first update().
Definition SfxSystem.hpp:219
void playMusic(SfxId id, float gain=1.0f)
Definition SfxSystem.cpp:483
void stopMusic()
Definition SfxSystem.cpp:518
audio::ListenerState listener_
Definition SfxSystem.hpp:194
std::unordered_map< entt::entity, float > prevGrenadeCooldowns_
Definition SfxSystem.hpp:216
Source * findVoiceSource(ClientId speaker)
Definition SfxSystem.cpp:1204
void onWeaponFired(const WeaponFiredEvent &e)
Definition SfxSystem.cpp:687
std::size_t reverbWrite_
Definition SfxSystem.hpp:197
std::array< SoundClip, static_cast< size_t >(SfxId::_Count)> clips_
Definition SfxSystem.hpp:149
SourceHandle playUi(UiSoundAction action, float gain=1.0f)
Definition SfxSystem.cpp:414
SourceHandle musicHandle_
Definition SfxSystem.hpp:185
std::uint32_t activeVoiceSourceCount() const noexcept
Definition SfxSystem.cpp:1524
int prevDeaths_
Definition SfxSystem.hpp:212
static constexpr std::size_t kMaxVoiceQueuedFrames
Definition SfxSystem.hpp:181
void mixIntoStream(SDL_AudioStream *stream, int additionalAmount)
Definition SfxSystem.cpp:1380
float prevArmor_
Definition SfxSystem.hpp:211
void convertClipsToMixer()
Definition SfxSystem.cpp:1108
float masterVolume() const
Definition SfxSystem.hpp:127
std::array< float, static_cast< size_t >(SfxCategory::_Count)> categoryVolumes_
Definition SfxSystem.hpp:189
float prevHealth_
Definition SfxSystem.hpp:210
void setAudioRtpc(audio::AudioObjectId object, audio::RtpcId rtpc, float value)
Definition SfxSystem.cpp:548
SourceHandle playCommand(const audio::AudioCommand &command)
Definition SfxSystem.cpp:1278
SDL_AudioStream * mixStream_
Single SDL stream that receives our mixed stereo output.
Definition SfxSystem.hpp:146
void submitVoiceFrame(ClientId speaker, std::uint16_t sequence, std::span< const float > monoPcm48k, const glm::vec3 &position, const glm::vec3 &velocity=glm::vec3{0.0f})
Definition SfxSystem.cpp:605
bool isOccluded(const glm::vec3 &position) const
Definition SfxSystem.cpp:1306
bool loadClip(SfxId id, const char *filename, SfxCategory cat, float gain, float cooldownSecs)
Decode a single MP3 from assets/sounds/ and store it as clip[id].
Definition SfxSystem.cpp:913
bool openDevice()
Open a specific physical playback device (macOS) or the default (other platforms).
Definition SfxSystem.cpp:1316
float effectiveGain(SfxId id, float extraGain) const
master × category × clip × extraGain.
Definition SfxSystem.cpp:1300
void synthesizeClip(SfxId id, SfxCategory cat, float gain, float cooldownSecs)
Definition SfxSystem.cpp:986
SDL_AudioDeviceID device_
Logical playback device (0 = not initialised).
Definition SfxSystem.hpp:144
void stop(SfxId id)
Stop all active voices playing the given sound.
Definition SfxSystem.cpp:655
float deathMuffleStateL_
Definition SfxSystem.hpp:200
bool isInitialized() const
True after a successful init().
Definition SfxSystem.hpp:135
void warmUpDevice()
Push a tiny silent buffer to force AudioQueue buffer pre-allocation.
Definition SfxSystem.cpp:1364
std::array< float, static_cast< size_t >(SfxId::_Count)> cooldowns_
Per-SfxId countdown to next allowed play (seconds remaining).
Definition SfxSystem.hpp:205
Definition AudioRuntime.hpp:310
constexpr float k_fullGainDistance
Definition AudioMath.hpp:14
constexpr AudioObjectId kGlobalObject
Definition AudioRuntime.hpp:84
constexpr AudioBusId kInvalidBus
Definition AudioRuntime.hpp:85
constexpr float k_silentDistance
Definition AudioMath.hpp:15
Definition AudioRuntime.hpp:365
Associates an entity with a connected network client.
Definition ClientId.hpp:10
Emitted when a rocket/grenade explodes.
Definition ParticleEvents.hpp:34
Definition SfxSystem.hpp:30
std::uint64_t droppedByLimit
Definition SfxSystem.hpp:33
std::uint64_t virtualizedFrames
Definition SfxSystem.hpp:35
std::uint64_t droppedByCooldown
Definition SfxSystem.hpp:32
std::uint64_t sourcesStarted
Definition SfxSystem.hpp:31
std::uint64_t stolenSources
Definition SfxSystem.hpp:34
Definition SfxSystem.hpp:152
float fullGainDistance
Definition SfxSystem.hpp:167
float age
Definition SfxSystem.hpp:169
float lowPassStateL
Definition SfxSystem.hpp:170
SfxId playingId
Which sound this voice is playing.
Definition SfxSystem.hpp:157
bool positional
Definition SfxSystem.hpp:155
bool hasVoiceSeq
Definition SfxSystem.hpp:173
float cursor
Definition SfxSystem.hpp:160
float priority
Definition SfxSystem.hpp:162
float silentDistance
Definition SfxSystem.hpp:168
std::size_t voiceReadFrame
Definition SfxSystem.hpp:178
float gain
Definition SfxSystem.hpp:161
SourceHandle handle
Definition SfxSystem.hpp:158
std::uint16_t maxBusInstances
Definition SfxSystem.hpp:166
float busGain
Definition SfxSystem.hpp:164
glm::vec3 position
Definition SfxSystem.hpp:175
ClientId speaker
Definition SfxSystem.hpp:159
std::uint16_t maxInstances
Definition SfxSystem.hpp:165
audio::AudioBusId bus
Definition SfxSystem.hpp:163
bool occluded
Definition SfxSystem.hpp:174
bool voiceStream
Definition SfxSystem.hpp:156
float lowPassStateR
Definition SfxSystem.hpp:171
bool active
Definition SfxSystem.hpp:153
std::vector< float > voicePcm
Definition SfxSystem.hpp:177
glm::vec3 velocity
Definition SfxSystem.hpp:176
bool loop
Definition SfxSystem.hpp:154
std::uint16_t newestVoiceSeq
Definition SfxSystem.hpp:172
A decoded sound clip ready for playback.
Definition SfxTypes.hpp:153
Emitted when a weapon fires (both hitscan and projectile).
Definition ParticleEvents.hpp:13
Definition AudioRuntime.hpp:43
Definition AudioRuntime.hpp:240
Definition AudioRuntime.hpp:266
Definition AudioMath.hpp:18