From f88ca0bc946bae086e02eacdc6c129f00e2e07e3 Mon Sep 17 00:00:00 2001 From: Jonathan Bradley Date: Fri, 11 Jul 2025 11:41:21 -0400 Subject: pke: audio: fx boilerplate, low-pass spatial --- src/audio.cpp | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) (limited to 'src/audio.cpp') diff --git a/src/audio.cpp b/src/audio.cpp index 194c01c..33ea740 100644 --- a/src/audio.cpp +++ b/src/audio.cpp @@ -3,6 +3,8 @@ #include "asset-manager.hpp" #include "audio-impl-pw.hpp" #include "audio.hpp" +#include "ecs.hpp" +#include "math-helpers.hpp" #include "pk.h" struct pke_audio_master pke_audio_mstr{}; @@ -26,11 +28,29 @@ void pke_audio_teardown() { } void pke_audio_tick(double delta) { (void)delta; + uint32_t i, k; #ifdef PKE_AUDIO_IMPL_PIPEWIRE if (pke_audio_pw.is_needing_output_remapped == true) { pke_audio_pw_remap_outputs(); } #endif + pke_audio_mstr.mtx_buffer.lock(); + for (i = 0; i < pke_audio_mstr.playing_objects.next; ++i) { + for (k = 0; k < pke_audio_mstr.playing_objects[i].play_count; ++k) { + if (pke_audio_mstr.playing_objects[i].instance_handle[k] == InstanceHandle_MAX) { + continue; + } + CompInstance *inst = ECS_GetInstance(pke_audio_mstr.playing_objects[i].instance_handle[k]); + if (inst == nullptr || inst->instanceHandle == InstanceHandle_MAX) { + continue; + } + BulletToGlm( + inst->bt.rigidBody->getWorldTransform().getOrigin(), + pke_audio_mstr.playing_objects[i].position_source[k] + ); + } + } + pke_audio_mstr.mtx_buffer.unlock(); } float pke_audio_get_volume(pke_audio_source source) { @@ -46,7 +66,7 @@ bool pke_audio_playing_objects_find_first_by_key(void *user_data, void *arr_data pke_audio_obj &audio_obj = *reinterpret_cast(arr_data); return std::get<0>(tup) == audio_obj.handle && std::get<1>(tup) == audio_obj.source; } -void pke_audio_play(AssetHandle handle, pke_audio_source audio_source, glm::vec3 position_source, pke_audio_flags flags) { +void pke_audio_play(AssetHandle handle, pke_audio_source audio_source, pke_audio_flags flags, glm::vec3 position_source, InstanceHandle instance_handle) { // TODO validation: audio length (does it fit in uint32_t), etc // TODO rethink threading: first-pass only mutex std::tuple tup {handle, audio_source}; @@ -67,6 +87,7 @@ void pke_audio_play(AssetHandle handle, pke_audio_source audio_source, glm::vec3 idx = aobj->play_count; aobj->play_count += 1; } + aobj->instance_handle[idx] = instance_handle; aobj->position_source[idx] = position_source; aobj->flags[idx] = flags; aobj->play_heads[idx] = 0; -- cgit v1.2.3