diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2025-07-11 11:41:21 -0400 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2025-07-11 11:41:21 -0400 |
| commit | f88ca0bc946bae086e02eacdc6c129f00e2e07e3 (patch) | |
| tree | eb8975ec505315e7f53a15ded32fb0cfd6b57731 /tests/pke-test-audio.cpp | |
| parent | 1fd2b900a5f97379e80adc411d3763f9ba811570 (diff) | |
pke: audio: fx boilerplate, low-pass spatial
Diffstat (limited to 'tests/pke-test-audio.cpp')
| -rw-r--r-- | tests/pke-test-audio.cpp | 92 |
1 files changed, 89 insertions, 3 deletions
diff --git a/tests/pke-test-audio.cpp b/tests/pke-test-audio.cpp index 076634a..2d48022 100644 --- a/tests/pke-test-audio.cpp +++ b/tests/pke-test-audio.cpp @@ -1,7 +1,10 @@ #include "./pke-test-audio.h" +#include "ecs.hpp" #include "game-settings.hpp" +#include "math-helpers.hpp" +#include "physics.hpp" #include "pk.h" #include "audio-types.hpp" @@ -21,13 +24,18 @@ void pke_test_audio_spinup() { pkeSettings.isSimulationPaused = true; PkeThreads_Init(); AM_Init(); + Physics_Init(); + ECS_Init(); pke_audio_init(); + pke_audio_mstr.master_volume = 0.125; // pk_funcinstr_teardown(); }; void pke_test_audio_teardown() { // pk_funcinstr_init(); pke_audio_teardown(); + ECS_Teardown(); + Physics_Teardown(); AM_Teardown(); PkeThreads_Teardown(); bkt = nullptr; @@ -54,7 +62,7 @@ int pke_test_audio_001() { AssetHandle ah_sawtooth = AM_Register(ak_sawtooth, PKE_ASSET_TYPE_AUDIO, zip_bop_bytes, sizeof(float) * 48000, 64); pk_delete<float>(zip_bop_bytes, 48000, bkt); - pke_audio_play(ah_sawtooth, pke_audio_source_music, glm::vec3(0), pke_audio_flag_none); + pke_audio_play(ah_sawtooth, pke_audio_source_music, pke_audio_flag_none, glm::vec3(0)); while (pke_audio_mstr.playing_objects.next > 0) { pke_audio_tick(0.001f); @@ -101,7 +109,7 @@ int pke_test_audio_002() { } std::chrono::milliseconds(1); for(k = 0; k < 3; ++k) { - pke_audio_play(ahs[k], pke_audio_source_music, src_poss[k], pke_audio_flag_pos_spatial); + pke_audio_play(ahs[k], pke_audio_source_music, pke_audio_flag_pos_spatial, src_poss[k]); } while (pke_audio_mstr.playing_objects.next > 0) { @@ -121,8 +129,81 @@ int pke_test_audio_002() { 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{}; + Entity_Base *ent = ECS_CreateGenericEntity(); + CompInstance *inst = ECS_CreateInstance(ent, pk_uuid_zed, nullptr, &inst_pos); + + uint64_t dur_seconds = 2; + uint64_t bit_rate = 48000; + uint64_t total_frames = bit_rate * dur_seconds; + AssetHandle ahs[1]; + const AssetKey aks[1] {"sawtooth"}; + float freqs[1] = {2000.f}; + glm::vec3 src_poss[1] = { + glm::vec3(5, 0, 5), + }; + + for(k = 0; k < 1; ++k) { + float *zip_bop_bytes = pk_new<float>(total_frames, bkt); + float phase = 0.0f; + float phase_increment = freqs[k] / float(bit_rate); + for (i = 0; i < total_frames; ++i) { + zip_bop_bytes[i] = 2.f * (phase - floor(phase + 0.5f)); + phase += phase_increment; + if (phase >= 1.f) phase -= 1.f; + } + ahs[k] = AM_Register(aks[k], PKE_ASSET_TYPE_AUDIO, zip_bop_bytes, sizeof(float) * total_frames, 64); + pk_delete<float>(zip_bop_bytes, total_frames, bkt); + } + + for(k = 0; k < 1; ++k) { + pke_audio_play(ahs[k], pke_audio_source_music, pke_audio_flag_pos_spatial, src_poss[k], inst->instanceHandle); + } + + + float delta = 0.f; + float delta_elapsed = 0.f; + btTransform trfm{}; + std::chrono::time_point ts = std::chrono::steady_clock::now(); + std::chrono::time_point now = std::chrono::steady_clock::now(); + while (pke_audio_mstr.playing_objects.next > 0) { + now = std::chrono::steady_clock::now(); + auto ts_diff = now - ts; + delta = ts_diff.count() / 1000000000.f; + ts = now; + + delta_elapsed += delta; + pke_audio_tick(delta); + glm::vec3 rot_pos = glm::rotate(glm::mat4(1.f), glm::radians(360.f) * delta_elapsed, glm::vec3(0.f, 1.f, 0.f)) * glm::vec4(5.f, 0.f, 5.f, 1.f); + GlmToBullet(rot_pos, trfm.getOrigin()); + // NOTE: fine for a test, but prefer ECS_UpdateInstance() + 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(1)); + } + + for(k = 0; k < 1; ++k) { + AM_Release(ahs[k]); + } + + } catch (const std::exception &ex) { + pk_mem_bucket_destroy(bkt); + throw; + } + pk_mem_bucket_destroy(bkt); + return 0; +} + struct pke_test_group *pke_test_audio_get_group() { - static const uint64_t test_count = 2; + static const uint64_t test_count = 3; static struct pke_test tests[test_count] = { { .title = "test 001", @@ -134,6 +215,11 @@ struct pke_test_group *pke_test_audio_get_group() { .func = pke_test_audio_002, .expected_result = 0, }, + { + .title = "test 003", + .func = pke_test_audio_003, + .expected_result = 0, + }, }; static struct pke_test_group group = {}; group.title = "audio"; |
