#ifndef PKE_AUDIO_TYPES_INTERNAL_HPP #define PKE_AUDIO_TYPES_INTERNAL_HPP #include "asset-manager.hpp" #include "components.hpp" #include "pk.h" #include "vendor-glm-include.hpp" #define PKE_AUDIO_MAX_CONCURRENT_COUNT 8 #define PKE_AUDIO_MAX_SPATIAL_DISTANCE 256.f #define PKE_AUDIO_BITRATE 48000 #define PKE_AUDIO_BUFFER_FRAMES 2048 TypeSafeInt_constexpr(pke_audio_flags, uint8_t, 0xFF); TypeSafeInt_constexpr(pke_audio_source, uint8_t, 0x40); const pke_audio_flags pke_audio_flag_none = pke_audio_flags{0x00}; const pke_audio_flags pke_audio_flag_pos_spatial = pke_audio_flags{0x01}; const pke_audio_source pke_audio_source_music = pke_audio_source{0x00}; const pke_audio_source pke_audio_source_ambient = pke_audio_source{0x01}; const pke_audio_source pke_audio_source_voices = pke_audio_source{0x02}; const pke_audio_source pke_audio_source_sfx = pke_audio_source{0x03}; struct pke_audio_fx_params_reverb { float reverb_strength; }; struct pke_audio_fx_params_delay { int64_t delay_frames; }; struct pke_audio_fx_params_low_pass_filter { float cutoff_freq; float prev_output; }; struct pke_audio_obj { AssetHandle handle; // key pke_audio_source source; // key InstanceHandle instance_handle[PKE_AUDIO_MAX_CONCURRENT_COUNT]; glm::vec3 position_source[PKE_AUDIO_MAX_CONCURRENT_COUNT]; pke_audio_flags flags[PKE_AUDIO_MAX_CONCURRENT_COUNT]; uint32_t play_heads[PKE_AUDIO_MAX_CONCURRENT_COUNT]; uint8_t play_count; }; struct pke_audio_master { pk_arr_t playing_objects; pk_membucket *bkt; float master_volume; float source_volumes[pke_audio_source_T_MAX]; uint32_t channel_count; // mono, stereo, 7.1 float *buffer; int64_t buffer_size; int64_t buffer_frames; int64_t elapsed_ns; std::mutex mtx_buffer; std::chrono::time_point last_tick_tp{}; }; extern struct pke_audio_master pke_audio_mstr; #endif /* PKE_AUDIO_TYPES_INTERNAL_HPP */