summaryrefslogtreecommitdiff
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
parentd9422b3e34fd5923aabc488cf9379f698d473c12 (diff)
test: pipewire comp flag + test memory management
-rw-r--r--config.mk1
-rw-r--r--src/audio.cpp30
-rw-r--r--tests/pke-test-audio.cpp28
3 files changed, 35 insertions, 24 deletions
diff --git a/config.mk b/config.mk
index ce454c8..4a12e00 100644
--- a/config.mk
+++ b/config.mk
@@ -42,6 +42,7 @@ SHARED_FLAGS = -D_DEFAULT_SOURCE \
-pthread \
-rdynamic \
-finstrument-functions \
+ -DPKE_AUDIO_IMPL_PIPEWIRE \
CFLAGS += -Wall -Wextra $(SHARED_FLAGS)
CXXFLAGS += -Wall -Wextra $(SHARED_FLAGS)
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;
diff --git a/tests/pke-test-audio.cpp b/tests/pke-test-audio.cpp
index bc181b1..488a67c 100644
--- a/tests/pke-test-audio.cpp
+++ b/tests/pke-test-audio.cpp
@@ -17,11 +17,16 @@
#include <thread>
#include <threads.h>
-pk_membucket *bkt = nullptr;
+static pk_membucket *bkt = nullptr;
+
+#define PKE_TEST_AUDIO_SLEEP_DUR_NS 10
void pke_test_audio_spinup() {
// pk_funcinstr_init();
pkeSettings.isSimulationPaused = true;
+ bkt = pk_mem_bucket_create("pke_test_audio", PK_MEM_DEFAULT_BUCKET_SIZE, PK_MEMBUCKET_FLAG_NONE);
+ pk_mem_bucket_set_client_mem_bucket(bkt);
+ pk_ev_init(bkt);
PkeThreads_Init();
AM_Init();
Physics_Init();
@@ -38,6 +43,9 @@ void pke_test_audio_teardown() {
Physics_Teardown();
AM_Teardown();
PkeThreads_Teardown();
+ pk_ev_teardown();
+ pk_mem_bucket_destroy(bkt);
+ pk_mem_bucket_set_client_mem_bucket(nullptr);
bkt = nullptr;
// pk_funcinstr_teardown();
};
@@ -46,8 +54,6 @@ void pke_test_audio_teardown() {
int pke_test_audio_001() {
uint32_t i;
try {
- bkt = pk_mem_bucket_create("pke_test_serialization", PK_MEM_DEFAULT_BUCKET_SIZE, PK_MEMBUCKET_FLAG_NONE);
-
UBO.model = glm::translate(glm::mat4(1.f), glm::vec3(0, 0, 0));
float *zip_bop_bytes = pk_new_arr<float>(PKE_AUDIO_BITRATE, bkt);
@@ -66,24 +72,20 @@ int pke_test_audio_001() {
while (pke_audio_mstr.playing_objects.next > 0) {
pke_audio_tick(0.001f);
- std::this_thread::sleep_for(std::chrono::nanoseconds(500000));
+ std::this_thread::sleep_for(std::chrono::nanoseconds(PKE_TEST_AUDIO_SLEEP_DUR_NS));
}
AM_Release(ah_sawtooth);
} catch (const std::exception &ex) {
- pk_mem_bucket_destroy(bkt);
throw;
}
- pk_mem_bucket_destroy(bkt);
return 0;
}
int pke_test_audio_002() {
uint32_t i, k;
try {
- bkt = pk_mem_bucket_create("pke_test_serialization", PK_MEM_DEFAULT_BUCKET_SIZE, PK_MEMBUCKET_FLAG_NONE);
-
UBO.model = glm::translate(glm::mat4(1.f), glm::vec3(0, 0, 0));
AssetHandle ahs[3];
@@ -114,7 +116,7 @@ int pke_test_audio_002() {
while (pke_audio_mstr.playing_objects.next > 0) {
pke_audio_tick(0.001f);
- std::this_thread::sleep_for(std::chrono::nanoseconds(500000));
+ std::this_thread::sleep_for(std::chrono::nanoseconds(PKE_TEST_AUDIO_SLEEP_DUR_NS));
}
for(k = 0; k < 3; ++k) {
@@ -122,18 +124,14 @@ int pke_test_audio_002() {
}
} catch (const std::exception &ex) {
- pk_mem_bucket_destroy(bkt);
throw;
}
- pk_mem_bucket_destroy(bkt);
return 0;
}
int pke_test_audio_003() {
uint64_t i, k;
try {
- bkt = pk_mem_bucket_create("pke_test_serialization", PK_MEM_DEFAULT_BUCKET_SIZE, PK_MEMBUCKET_FLAG_NONE);
-
UBO.model = glm::translate(glm::mat4(1.f), glm::vec3(0, 0, 0));
InstPos inst_pos{};
@@ -185,7 +183,7 @@ int pke_test_audio_003() {
inst->bt.rigidBody->setWorldTransform(trfm);
// fprintf(stdout, "%f,%f,%f\n", rot_pos.x, rot_pos.y, rot_pos.z);
- std::this_thread::sleep_for(std::chrono::nanoseconds(500000));
+ std::this_thread::sleep_for(std::chrono::nanoseconds(PKE_TEST_AUDIO_SLEEP_DUR_NS));
}
for(k = 0; k < 1; ++k) {
@@ -193,10 +191,8 @@ int pke_test_audio_003() {
}
} catch (const std::exception &ex) {
- pk_mem_bucket_destroy(bkt);
throw;
}
- pk_mem_bucket_destroy(bkt);
return 0;
}