diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2025-11-10 08:55:12 -0500 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2025-11-10 08:55:12 -0500 |
| commit | e40814b646af877f90834036f4f1cbac9e34be83 (patch) | |
| tree | a85e1a7832c39c8e6014c7e6cdf0e17a69851e77 | |
| parent | c3c4d351f8ccfc678aaa2de458326a11884aef19 (diff) | |
pke: audio release asset at last play end
| -rw-r--r-- | src/audio.cpp | 17 | ||||
| -rw-r--r-- | tests/pke-test-audio.cpp | 10 |
2 files changed, 10 insertions, 17 deletions
diff --git a/src/audio.cpp b/src/audio.cpp index d4470da..4e6a419 100644 --- a/src/audio.cpp +++ b/src/audio.cpp @@ -38,6 +38,7 @@ void pke_audio_teardown() { #ifdef PKE_AUDIO_IMPL_PIPEWIRE pke_audio_pw_teardown(); #endif + pke_audio_stop_all(); 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); @@ -142,10 +143,10 @@ void pke_audio_play(AssetHandle handle, pke_audio_source audio_source, pke_audio void pke_audio_stop_all() { // TODO fade-out instead of hard-cut? Maybe that should be a separate function. - uint32_t i; + uint32_t u; pke_audio_mstr.mtx_buffer.lock(); - for (i = 0; i < pke_audio_mstr.playing_objects.next; ++i) { - AM_Release(pke_audio_mstr.playing_objects[i].handle); + for (u = 0; u < pke_audio_mstr.playing_objects.next; ++u) { + AM_Release(pke_audio_mstr.playing_objects[u].handle); } pk_arr_clear(&pke_audio_mstr.playing_objects); pke_audio_mstr.mtx_buffer.unlock(); @@ -229,6 +230,10 @@ void pke_audio_process_frames(int64_t frame_count) { } } + if (pke_audio_mstr.playing_objects.next == 0) { + memset(dst, 0, sizeof(float) * frame_count * pke_audio_mstr.channel_count); + } + // calculate for (i = 0; i < pke_audio_mstr.playing_objects.next; ++i) { pke_audio_obj *aobj = &pke_audio_mstr.playing_objects[i]; @@ -375,16 +380,14 @@ void pke_audio_process_frames(int64_t frame_count) { } } } + AM_Release(aobj->handle); if (aobj->play_count == 0) { + AM_Release(aobj->handle); pk_arr_remove_at(&pke_audio_mstr.playing_objects, i); i -= 1; } } - if (pke_audio_mstr.playing_objects.next == 0) { - memset(dst, 0, sizeof(float) * frame_count * pke_audio_mstr.channel_count); - } - pke_audio_mstr.buffer_frames += frame_count; } diff --git a/tests/pke-test-audio.cpp b/tests/pke-test-audio.cpp index e594f9e..a7901ad 100644 --- a/tests/pke-test-audio.cpp +++ b/tests/pke-test-audio.cpp @@ -78,8 +78,6 @@ int pke_test_audio_001() { std::this_thread::sleep_for(std::chrono::nanoseconds(PKE_TEST_AUDIO_SLEEP_DUR_NS)); } - AM_Release(ah_sawtooth); - } catch (const std::exception &ex) { throw; } @@ -122,10 +120,6 @@ int pke_test_audio_002() { std::this_thread::sleep_for(std::chrono::nanoseconds(PKE_TEST_AUDIO_SLEEP_DUR_NS)); } - for(k = 0; k < 3; ++k) { - AM_Release(ahs[k]); - } - } catch (const std::exception &ex) { throw; } @@ -189,10 +183,6 @@ int pke_test_audio_003() { std::this_thread::sleep_for(std::chrono::nanoseconds(PKE_TEST_AUDIO_SLEEP_DUR_NS)); } - for(k = 0; k < 1; ++k) { - AM_Release(ahs[k]); - } - } catch (const std::exception &ex) { throw; } |
