summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2025-09-16 16:16:22 -0400
committerJonathan Bradley <jcb@pikum.xyz>2025-09-16 16:16:22 -0400
commite52ef2e49ae660833370befc34ba79d412cb4604 (patch)
tree6df0a6bcec0bfe8d6e6dbe81799c957cc86ad0eb /src
parentd9422b3e34fd5923aabc488cf9379f698d473c12 (diff)
test: pipewire comp flag + test memory management
Diffstat (limited to 'src')
-rw-r--r--src/audio.cpp30
1 files changed, 22 insertions, 8 deletions
diff --git a/src/audio.cpp b/src/audio.cpp
index a91300a..d4470da 100644
--- a/src/audio.cpp
+++ b/src/audio.cpp
@@ -1,7 +1,4 @@
-#define PKE_AUDIO_IMPL_PIPEWIRE
-
#include "asset-manager.hpp"
-#include "audio-impl-pw.hpp"
#include "audio-impl-shared.hpp"
#include "audio.hpp"
#include "ecs.hpp"
@@ -11,6 +8,10 @@
#include "window.hpp"
#include <chrono>
+#ifdef PKE_AUDIO_IMPL_PIPEWIRE
+#include "audio-impl-pw.hpp"
+#endif
+
struct pke_audio_master pke_audio_mstr{};
void pke_audio_process_frames(int64_t frame_count);
@@ -37,8 +38,19 @@ void pke_audio_teardown() {
#ifdef PKE_AUDIO_IMPL_PIPEWIRE
pke_audio_pw_teardown();
#endif
+ pk_arr_reset(&pke_audio_mstr.playing_objects);
pk_delete_arr<float>(pke_audio_mstr.buffer, pke_audio_mstr.buffer_size, pke_audio_mstr.bkt);
pk_mem_bucket_destroy(pke_audio_mstr.bkt);
+
+ pke_audio_mstr.bkt = nullptr;
+ pke_audio_mstr.master_volume = 0;
+ memset(&pke_audio_mstr.source_volumes, 0, sizeof(pke_audio_mstr.source_volumes[0]) * pke_audio_source_T_MAX);
+ pke_audio_mstr.channel_count = 0;
+ pke_audio_mstr.buffer = nullptr;
+ pke_audio_mstr.buffer_frames = 0;
+ pke_audio_mstr.elapsed_ns = 0;
+ pke_audio_mstr.last_tick_tp = {};
+
}
void pke_audio_tick(double delta) {
@@ -104,7 +116,7 @@ void pke_audio_play(AssetHandle handle, pke_audio_source audio_source, pke_audio
// TODO rethink threading: first-pass only mutex
std::tuple<AssetHandle, pke_audio_source> tup {handle, audio_source};
pke_audio_mstr.mtx_buffer.lock();
- uint32_t idx = pk_arr_find_first_index(&pke_audio_mstr.playing_objects, &tup, pke_audio_playing_objects_find_first_by_key);
+ int64_t idx = (int64_t)pk_arr_find_first_index(&pke_audio_mstr.playing_objects, &tup, pke_audio_playing_objects_find_first_by_key);
pke_audio_obj *aobj = NULL;
if (idx == uint32_t(-1)) {
AM_Get(handle); // keep the asset in memory, freed when play_count hits 0
@@ -120,6 +132,7 @@ void pke_audio_play(AssetHandle handle, pke_audio_source audio_source, pke_audio
idx = aobj->play_count;
aobj->play_count += 1;
}
+ assert(idx >= 0 && idx < PKE_AUDIO_MAX_CONCURRENT_COUNT);
aobj->instance_handle[idx] = instance_handle;
aobj->position_source[idx] = position_source;
aobj->flags[idx] = flags;
@@ -350,10 +363,11 @@ void pke_audio_process_frames(int64_t frame_count) {
// TODO type-specific attributes for assets so we can pre-calculate this or just KNOW the frame length ahead of time
aobj->play_heads[pc] += 1;
if (aobj->play_heads[pc] >= a->size / sizeof(float)) {
- for (pc2 = 0; pc2 < aobj->play_count-1; ++pc2) {
- aobj->flags[pc2] = aobj->flags[pc2+1];
- aobj->play_heads[pc2] = aobj->play_heads[pc2+1];
- aobj->position_source[pc2] = aobj->position_source[pc2+1];
+ for (pc2 = 0; pc + pc2 + 1 < aobj->play_count; ++pc2) {
+ aobj->instance_handle[pc+pc2] = aobj->instance_handle[pc+pc2+1];
+ aobj->position_source[pc+pc2] = aobj->position_source[pc+pc2+1];
+ aobj->flags[pc+pc2] = aobj->flags[pc+pc2+1];
+ aobj->play_heads[pc+pc2] = aobj->play_heads[pc+pc2+1];
}
pc -= 1;
aobj->play_count -= 1;