#pragma once #include #include #include #include #include #include #include #include #include #include "steam_audio_dynamic_mesh.hpp" #include "steam_audio_source.hpp" #include "steam_audio_static_mesh.hpp" using namespace godot; class SteamAudioServer : public Object { GDCLASS(SteamAudioServer, Object) // Godot class declaration macro private: struct AudioSourceData { Vector input_buffer; Vector output_buffer; IPLSource source; Transform3D transform; bool needs_processing = false; }; std::unordered_map audio_sources; Ref audio_mutex; IPLContext ctx=nullptr; IPLContextSettings ctxSettings; IPLAudioSettings audioSettings; IPLEmbreeDevice *embreeDevice=nullptr; IPLEmbreeDeviceSettings embreeDeviceSettings; IPLScene *scene=nullptr; IPLSceneSettings sceneSettings; IPLSimulator simulator; IPLSimulationSettings simulationSettings; IPLHRTF hrtf; IPLHRTFSettings hrtfSettings; ProjectSettings *proj_settings = ProjectSettings::get_singleton(); Ref directThread; Ref indirectThread; public: SteamAudioServer(); // Constructor ~SteamAudioServer() override; // Destructor void _notification(int p_what); void register_audio_source(SteamAudioSource *source); void unregister_audio_source(SteamAudioSource *source); void process_audio_source(SteamAudioSource *source, const Vector &input_buffer); Vector get_processed_audio_buffer(SteamAudioSource *source); protected: static void _bind_methods(); void initialize(); void shutdown(); void start_direct_thread(); void start_indirect_thread(); };