summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2025-11-10 08:55:12 -0500
committerJonathan Bradley <jcb@pikum.xyz>2025-11-10 08:55:12 -0500
commite40814b646af877f90834036f4f1cbac9e34be83 (patch)
treea85e1a7832c39c8e6014c7e6cdf0e17a69851e77
parentc3c4d351f8ccfc678aaa2de458326a11884aef19 (diff)
pke: audio release asset at last play end
-rw-r--r--src/audio.cpp17
-rw-r--r--tests/pke-test-audio.cpp10
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;
}