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 /src | |
| parent | d9422b3e34fd5923aabc488cf9379f698d473c12 (diff) | |
test: pipewire comp flag + test memory management
Diffstat (limited to 'src')
| -rw-r--r-- | src/audio.cpp | 30 |
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; |
