| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324 |
- #include "config.h"
- #include "al/eax_eax_call.h"
- #include "al/eax_exception.h"
- namespace {
- constexpr auto deferred_flag = 0x80000000U;
- class EaxEaxCallException :
- public EaxException
- {
- public:
- explicit EaxEaxCallException(
- const char* message)
- :
- EaxException{"EAX_EAX_CALL", message}
- {
- }
- }; // EaxEaxCallException
- } // namespace
- EaxEaxCall::EaxEaxCall(
- bool is_get,
- const GUID& property_set_guid,
- ALuint property_id,
- ALuint property_source_id,
- ALvoid* property_buffer,
- ALuint property_size)
- : is_get_{is_get}, version_{0}, property_set_id_{EaxEaxCallPropertySetId::none}
- , property_id_{property_id & ~deferred_flag}, property_source_id_{property_source_id}
- , property_buffer_{property_buffer}, property_size_{property_size}
- {
- if (false)
- {
- }
- else if (property_set_guid == EAXPROPERTYID_EAX40_Context)
- {
- version_ = 4;
- property_set_id_ = EaxEaxCallPropertySetId::context;
- }
- else if (property_set_guid == EAXPROPERTYID_EAX50_Context)
- {
- version_ = 5;
- property_set_id_ = EaxEaxCallPropertySetId::context;
- }
- else if (property_set_guid == DSPROPSETID_EAX20_ListenerProperties)
- {
- version_ = 2;
- fx_slot_index_ = 0u;
- property_set_id_ = EaxEaxCallPropertySetId::fx_slot_effect;
- property_id_ = convert_eax_v2_0_listener_property_id(property_id_);
- }
- else if (property_set_guid == DSPROPSETID_EAX30_ListenerProperties)
- {
- version_ = 3;
- fx_slot_index_ = 0u;
- property_set_id_ = EaxEaxCallPropertySetId::fx_slot_effect;
- }
- else if (property_set_guid == EAXPROPERTYID_EAX40_FXSlot0)
- {
- version_ = 4;
- fx_slot_index_ = 0u;
- property_set_id_ = EaxEaxCallPropertySetId::fx_slot;
- }
- else if (property_set_guid == EAXPROPERTYID_EAX50_FXSlot0)
- {
- version_ = 5;
- fx_slot_index_ = 0u;
- property_set_id_ = EaxEaxCallPropertySetId::fx_slot;
- }
- else if (property_set_guid == EAXPROPERTYID_EAX40_FXSlot1)
- {
- version_ = 4;
- fx_slot_index_ = 1u;
- property_set_id_ = EaxEaxCallPropertySetId::fx_slot;
- }
- else if (property_set_guid == EAXPROPERTYID_EAX50_FXSlot1)
- {
- version_ = 5;
- fx_slot_index_ = 1u;
- property_set_id_ = EaxEaxCallPropertySetId::fx_slot;
- }
- else if (property_set_guid == EAXPROPERTYID_EAX40_FXSlot2)
- {
- version_ = 4;
- fx_slot_index_ = 2u;
- property_set_id_ = EaxEaxCallPropertySetId::fx_slot;
- }
- else if (property_set_guid == EAXPROPERTYID_EAX50_FXSlot2)
- {
- version_ = 5;
- fx_slot_index_ = 2u;
- property_set_id_ = EaxEaxCallPropertySetId::fx_slot;
- }
- else if (property_set_guid == EAXPROPERTYID_EAX40_FXSlot3)
- {
- version_ = 4;
- fx_slot_index_ = 3u;
- property_set_id_ = EaxEaxCallPropertySetId::fx_slot;
- }
- else if (property_set_guid == EAXPROPERTYID_EAX50_FXSlot3)
- {
- version_ = 5;
- fx_slot_index_ = 3u;
- property_set_id_ = EaxEaxCallPropertySetId::fx_slot;
- }
- else if (property_set_guid == DSPROPSETID_EAX20_BufferProperties)
- {
- version_ = 2;
- property_set_id_ = EaxEaxCallPropertySetId::source;
- property_id_ = convert_eax_v2_0_buffer_property_id(property_id_);
- }
- else if (property_set_guid == DSPROPSETID_EAX30_BufferProperties)
- {
- version_ = 3;
- property_set_id_ = EaxEaxCallPropertySetId::source;
- }
- else if (property_set_guid == EAXPROPERTYID_EAX40_Source)
- {
- version_ = 4;
- property_set_id_ = EaxEaxCallPropertySetId::source;
- }
- else if (property_set_guid == EAXPROPERTYID_EAX50_Source)
- {
- version_ = 5;
- property_set_id_ = EaxEaxCallPropertySetId::source;
- }
- else if (property_set_guid == DSPROPSETID_EAX_ReverbProperties)
- {
- version_ = 1;
- fx_slot_index_ = 0u;
- property_set_id_ = EaxEaxCallPropertySetId::fx_slot_effect;
- }
- else if (property_set_guid == DSPROPSETID_EAXBUFFER_ReverbProperties)
- {
- version_ = 1;
- property_set_id_ = EaxEaxCallPropertySetId::source;
- }
- else
- {
- fail("Unsupported property set id.");
- }
- if (version_ < 1 || version_ > 5)
- {
- fail("EAX version out of range.");
- }
- if(!(property_id&deferred_flag))
- {
- if(property_set_id_ != EaxEaxCallPropertySetId::fx_slot && property_id_ != 0)
- {
- if (!property_buffer)
- {
- fail("Null property buffer.");
- }
- if (property_size == 0)
- {
- fail("Empty property.");
- }
- }
- }
- if(property_set_id_ == EaxEaxCallPropertySetId::source && property_source_id_ == 0)
- {
- fail("Null AL source id.");
- }
- if (property_set_id_ == EaxEaxCallPropertySetId::fx_slot)
- {
- if (property_id_ < EAXFXSLOT_NONE)
- {
- property_set_id_ = EaxEaxCallPropertySetId::fx_slot_effect;
- }
- }
- }
- [[noreturn]]
- void EaxEaxCall::fail(
- const char* message)
- {
- throw EaxEaxCallException{message};
- }
- ALuint EaxEaxCall::convert_eax_v2_0_listener_property_id(
- ALuint property_id)
- {
- switch (property_id)
- {
- case DSPROPERTY_EAX20LISTENER_NONE:
- return EAXREVERB_NONE;
- case DSPROPERTY_EAX20LISTENER_ALLPARAMETERS:
- return EAXREVERB_ALLPARAMETERS;
- case DSPROPERTY_EAX20LISTENER_ROOM:
- return EAXREVERB_ROOM;
- case DSPROPERTY_EAX20LISTENER_ROOMHF:
- return EAXREVERB_ROOMHF;
- case DSPROPERTY_EAX20LISTENER_ROOMROLLOFFFACTOR:
- return EAXREVERB_ROOMROLLOFFFACTOR;
- case DSPROPERTY_EAX20LISTENER_DECAYTIME:
- return EAXREVERB_DECAYTIME;
- case DSPROPERTY_EAX20LISTENER_DECAYHFRATIO:
- return EAXREVERB_DECAYHFRATIO;
- case DSPROPERTY_EAX20LISTENER_REFLECTIONS:
- return EAXREVERB_REFLECTIONS;
- case DSPROPERTY_EAX20LISTENER_REFLECTIONSDELAY:
- return EAXREVERB_REFLECTIONSDELAY;
- case DSPROPERTY_EAX20LISTENER_REVERB:
- return EAXREVERB_REVERB;
- case DSPROPERTY_EAX20LISTENER_REVERBDELAY:
- return EAXREVERB_REVERBDELAY;
- case DSPROPERTY_EAX20LISTENER_ENVIRONMENT:
- return EAXREVERB_ENVIRONMENT;
- case DSPROPERTY_EAX20LISTENER_ENVIRONMENTSIZE:
- return EAXREVERB_ENVIRONMENTSIZE;
- case DSPROPERTY_EAX20LISTENER_ENVIRONMENTDIFFUSION:
- return EAXREVERB_ENVIRONMENTDIFFUSION;
- case DSPROPERTY_EAX20LISTENER_AIRABSORPTIONHF:
- return EAXREVERB_AIRABSORPTIONHF;
- case DSPROPERTY_EAX20LISTENER_FLAGS:
- return EAXREVERB_FLAGS;
- default:
- fail("Unsupported EAX 2.0 listener property id.");
- }
- }
- ALuint EaxEaxCall::convert_eax_v2_0_buffer_property_id(
- ALuint property_id)
- {
- switch (property_id)
- {
- case DSPROPERTY_EAX20BUFFER_NONE:
- return EAXSOURCE_NONE;
- case DSPROPERTY_EAX20BUFFER_ALLPARAMETERS:
- return EAXSOURCE_ALLPARAMETERS;
- case DSPROPERTY_EAX20BUFFER_DIRECT:
- return EAXSOURCE_DIRECT;
- case DSPROPERTY_EAX20BUFFER_DIRECTHF:
- return EAXSOURCE_DIRECTHF;
- case DSPROPERTY_EAX20BUFFER_ROOM:
- return EAXSOURCE_ROOM;
- case DSPROPERTY_EAX20BUFFER_ROOMHF:
- return EAXSOURCE_ROOMHF;
- case DSPROPERTY_EAX20BUFFER_ROOMROLLOFFFACTOR:
- return EAXSOURCE_ROOMROLLOFFFACTOR;
- case DSPROPERTY_EAX20BUFFER_OBSTRUCTION:
- return EAXSOURCE_OBSTRUCTION;
- case DSPROPERTY_EAX20BUFFER_OBSTRUCTIONLFRATIO:
- return EAXSOURCE_OBSTRUCTIONLFRATIO;
- case DSPROPERTY_EAX20BUFFER_OCCLUSION:
- return EAXSOURCE_OCCLUSION;
- case DSPROPERTY_EAX20BUFFER_OCCLUSIONLFRATIO:
- return EAXSOURCE_OCCLUSIONLFRATIO;
- case DSPROPERTY_EAX20BUFFER_OCCLUSIONROOMRATIO:
- return EAXSOURCE_OCCLUSIONROOMRATIO;
- case DSPROPERTY_EAX20BUFFER_OUTSIDEVOLUMEHF:
- return EAXSOURCE_OUTSIDEVOLUMEHF;
- case DSPROPERTY_EAX20BUFFER_AIRABSORPTIONFACTOR:
- return EAXSOURCE_AIRABSORPTIONFACTOR;
- case DSPROPERTY_EAX20BUFFER_FLAGS:
- return EAXSOURCE_FLAGS;
- default:
- fail("Unsupported EAX 2.0 buffer property id.");
- }
- }
- 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)
- {
- if(!property_set_id)
- throw EaxEaxCallException{"Null property set ID."};
- return EaxEaxCall{
- is_get,
- *property_set_id,
- property_id,
- property_source_id,
- property_buffer,
- property_size
- };
- }
|