mirror of
https://github.com/love2d/megasource.git
synced 2026-08-17 11:11:35 +02:00
Update OpenAL-Soft to 1.22.0
This commit is contained in:
@@ -0,0 +1,324 @@
|
||||
#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
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user