#ifndef EAX_EAX_CALL_INCLUDED #define EAX_EAX_CALL_INCLUDED #include "AL/al.h" #include "alspan.h" #include "eax_api.h" #include "eax_fx_slot_index.h" enum class EaxEaxCallPropertySetId { none, context, fx_slot, source, fx_slot_effect, }; // EaxEaxCallPropertySetId class EaxEaxCall { public: EaxEaxCall( bool is_get, const GUID& property_set_guid, ALuint property_id, ALuint property_source_id, ALvoid* property_buffer, ALuint property_size); bool is_get() const noexcept { return is_get_; } int get_version() const noexcept { return version_; } EaxEaxCallPropertySetId get_property_set_id() const noexcept { return property_set_id_; } ALuint get_property_id() const noexcept { return property_id_; } ALuint get_property_al_name() const noexcept { return property_source_id_; } EaxFxSlotIndex get_fx_slot_index() const noexcept { return fx_slot_index_; } template< typename TException, typename TValue > TValue& get_value() const { if (property_size_ < static_cast(sizeof(TValue))) { throw TException{"Property buffer too small."}; } return *static_cast(property_buffer_); } template< typename TException, typename TValue > al::span get_values() const { if (property_size_ < static_cast(sizeof(TValue))) { throw TException{"Property buffer too small."}; } const auto count = property_size_ / sizeof(TValue); return al::span{static_cast(property_buffer_), count}; } template< typename TException, typename TValue > void set_value( const TValue& value) const { get_value() = value; } private: const bool is_get_; int version_; EaxFxSlotIndex fx_slot_index_; EaxEaxCallPropertySetId property_set_id_; ALuint property_id_; const ALuint property_source_id_; ALvoid*const property_buffer_; const ALuint property_size_; [[noreturn]] static void fail( const char* message); static ALuint convert_eax_v2_0_listener_property_id( ALuint property_id); static ALuint convert_eax_v2_0_buffer_property_id( ALuint property_id); }; // EaxEaxCall EaxEaxCall create_eax_call( bool is_get, const GUID* property_set_id, ALuint property_id, ALuint property_source_id, ALvoid* property_buffer, ALuint property_size); #endif // !EAX_EAX_CALL_INCLUDED