diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2025-09-16 16:16:22 -0400 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2025-09-16 16:16:22 -0400 |
| commit | e52ef2e49ae660833370befc34ba79d412cb4604 (patch) | |
| tree | 6df0a6bcec0bfe8d6e6dbe81799c957cc86ad0eb | |
| parent | d9422b3e34fd5923aabc488cf9379f698d473c12 (diff) | |
test: pipewire comp flag + test memory management
| -rw-r--r-- | config.mk | 1 | ||||
| -rw-r--r-- | src/audio.cpp | 30 | ||||
| -rw-r--r-- | tests/pke-test-audio.cpp | 28 |
3 files changed, 35 insertions, 24 deletions
@@ -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; } |
