aboutsummaryrefslogtreecommitdiffstats
path: root/al/eax
diff options
context:
space:
mode:
Diffstat (limited to 'al/eax')
-rw-r--r--al/eax/api.cpp621
-rw-r--r--al/eax/api.h114
-rw-r--r--al/eax/call.cpp212
-rw-r--r--al/eax/call.h (renamed from al/eax/eax_call.h)81
-rw-r--r--al/eax/eax_call.cpp323
-rw-r--r--al/eax/effect.cpp3
-rw-r--r--al/eax/effect.h165
-rw-r--r--al/eax/fx_slots.cpp6
-rw-r--r--al/eax/fx_slots.h3
-rw-r--r--al/eax/x_ram.cpp3
10 files changed, 1067 insertions, 464 deletions
diff --git a/al/eax/api.cpp b/al/eax/api.cpp
index f859a1c4..34ba554f 100644
--- a/al/eax/api.cpp
+++ b/al/eax/api.cpp
@@ -393,6 +393,569 @@ bool operator!=(
}
+// EAX1 =====================================================================
+
+namespace {
+constexpr EAX_REVERBPROPERTIES EAX1REVERB_PRESET_GENERIC = {EAX_ENVIRONMENT_GENERIC, 0.5F, 1.493F, 0.5F};
+constexpr EAX_REVERBPROPERTIES EAX1REVERB_PRESET_PADDEDCELL = {EAX_ENVIRONMENT_PADDEDCELL, 0.25F, 0.1F, 0.0F};
+constexpr EAX_REVERBPROPERTIES EAX1REVERB_PRESET_ROOM = {EAX_ENVIRONMENT_ROOM, 0.417F, 0.4F, 0.666F};
+constexpr EAX_REVERBPROPERTIES EAX1REVERB_PRESET_BATHROOM = {EAX_ENVIRONMENT_BATHROOM, 0.653F, 1.499F, 0.166F};
+constexpr EAX_REVERBPROPERTIES EAX1REVERB_PRESET_LIVINGROOM = {EAX_ENVIRONMENT_LIVINGROOM, 0.208F, 0.478F, 0.0F};
+constexpr EAX_REVERBPROPERTIES EAX1REVERB_PRESET_STONEROOM = {EAX_ENVIRONMENT_STONEROOM, 0.5F, 2.309F, 0.888F};
+constexpr EAX_REVERBPROPERTIES EAX1REVERB_PRESET_AUDITORIUM = {EAX_ENVIRONMENT_AUDITORIUM, 0.403F, 4.279F, 0.5F};
+constexpr EAX_REVERBPROPERTIES EAX1REVERB_PRESET_CONCERTHALL = {EAX_ENVIRONMENT_CONCERTHALL, 0.5F, 3.961F, 0.5F};
+constexpr EAX_REVERBPROPERTIES EAX1REVERB_PRESET_CAVE = {EAX_ENVIRONMENT_CAVE, 0.5F, 2.886F, 1.304F};
+constexpr EAX_REVERBPROPERTIES EAX1REVERB_PRESET_ARENA = {EAX_ENVIRONMENT_ARENA, 0.361F, 7.284F, 0.332F};
+constexpr EAX_REVERBPROPERTIES EAX1REVERB_PRESET_HANGAR = {EAX_ENVIRONMENT_HANGAR, 0.5F, 10.0F, 0.3F};
+constexpr EAX_REVERBPROPERTIES EAX1REVERB_PRESET_CARPETTEDHALLWAY = {EAX_ENVIRONMENT_CARPETEDHALLWAY, 0.153F, 0.259F, 2.0F};
+constexpr EAX_REVERBPROPERTIES EAX1REVERB_PRESET_HALLWAY = {EAX_ENVIRONMENT_HALLWAY, 0.361F, 1.493F, 0.0F};
+constexpr EAX_REVERBPROPERTIES EAX1REVERB_PRESET_STONECORRIDOR = {EAX_ENVIRONMENT_STONECORRIDOR, 0.444F, 2.697F, 0.638F};
+constexpr EAX_REVERBPROPERTIES EAX1REVERB_PRESET_ALLEY = {EAX_ENVIRONMENT_ALLEY, 0.25F, 1.752F, 0.776F};
+constexpr EAX_REVERBPROPERTIES EAX1REVERB_PRESET_FOREST = {EAX_ENVIRONMENT_FOREST, 0.111F, 3.145F, 0.472F};
+constexpr EAX_REVERBPROPERTIES EAX1REVERB_PRESET_CITY = {EAX_ENVIRONMENT_CITY, 0.111F, 2.767F, 0.224F};
+constexpr EAX_REVERBPROPERTIES EAX1REVERB_PRESET_MOUNTAINS = {EAX_ENVIRONMENT_MOUNTAINS, 0.194F, 7.841F, 0.472F};
+constexpr EAX_REVERBPROPERTIES EAX1REVERB_PRESET_QUARRY = {EAX_ENVIRONMENT_QUARRY, 1.0F, 1.499F, 0.5F};
+constexpr EAX_REVERBPROPERTIES EAX1REVERB_PRESET_PLAIN = {EAX_ENVIRONMENT_PLAIN, 0.097F, 2.767F, 0.224F};
+constexpr EAX_REVERBPROPERTIES EAX1REVERB_PRESET_PARKINGLOT = {EAX_ENVIRONMENT_PARKINGLOT, 0.208F, 1.652F, 1.5F};
+constexpr EAX_REVERBPROPERTIES EAX1REVERB_PRESET_SEWERPIPE = {EAX_ENVIRONMENT_SEWERPIPE, 0.652F, 2.886F, 0.25F};
+constexpr EAX_REVERBPROPERTIES EAX1REVERB_PRESET_UNDERWATER = {EAX_ENVIRONMENT_UNDERWATER, 1.0F, 1.499F, 0.0F};
+constexpr EAX_REVERBPROPERTIES EAX1REVERB_PRESET_DRUGGED = {EAX_ENVIRONMENT_DRUGGED, 0.875F, 8.392F, 1.388F};
+constexpr EAX_REVERBPROPERTIES EAX1REVERB_PRESET_DIZZY = {EAX_ENVIRONMENT_DIZZY, 0.139F, 17.234F, 0.666F};
+constexpr EAX_REVERBPROPERTIES EAX1REVERB_PRESET_PSYCHOTIC = {EAX_ENVIRONMENT_PSYCHOTIC, 0.486F, 7.563F, 0.806F};
+} // namespace
+
+const Eax1ReverbPresets EAX1REVERB_PRESETS{{
+ EAX1REVERB_PRESET_GENERIC,
+ EAX1REVERB_PRESET_PADDEDCELL,
+ EAX1REVERB_PRESET_ROOM,
+ EAX1REVERB_PRESET_BATHROOM,
+ EAX1REVERB_PRESET_LIVINGROOM,
+ EAX1REVERB_PRESET_STONEROOM,
+ EAX1REVERB_PRESET_AUDITORIUM,
+ EAX1REVERB_PRESET_CONCERTHALL,
+ EAX1REVERB_PRESET_CAVE,
+ EAX1REVERB_PRESET_ARENA,
+ EAX1REVERB_PRESET_HANGAR,
+ EAX1REVERB_PRESET_CARPETTEDHALLWAY,
+ EAX1REVERB_PRESET_HALLWAY,
+ EAX1REVERB_PRESET_STONECORRIDOR,
+ EAX1REVERB_PRESET_ALLEY,
+ EAX1REVERB_PRESET_FOREST,
+ EAX1REVERB_PRESET_CITY,
+ EAX1REVERB_PRESET_MOUNTAINS,
+ EAX1REVERB_PRESET_QUARRY,
+ EAX1REVERB_PRESET_PLAIN,
+ EAX1REVERB_PRESET_PARKINGLOT,
+ EAX1REVERB_PRESET_SEWERPIPE,
+ EAX1REVERB_PRESET_UNDERWATER,
+ EAX1REVERB_PRESET_DRUGGED,
+ EAX1REVERB_PRESET_DIZZY,
+ EAX1REVERB_PRESET_PSYCHOTIC,
+}};
+
+// EAX2 =====================================================================
+
+namespace {
+
+constexpr EAX20LISTENERPROPERTIES EAX2REVERB_PRESET_GENERIC{
+ EAX2LISTENER_DEFAULTROOM,
+ EAX2LISTENER_DEFAULTROOMHF,
+ EAX2LISTENER_DEFAULTROOMROLLOFFFACTOR,
+ EAX2LISTENER_DEFAULTDECAYTIME,
+ EAX2LISTENER_DEFAULTDECAYHFRATIO,
+ EAX2LISTENER_DEFAULTREFLECTIONS,
+ EAX2LISTENER_DEFAULTREFLECTIONSDELAY,
+ EAX2LISTENER_DEFAULTREVERB,
+ EAX2LISTENER_DEFAULTREVERBDELAY,
+ EAX2LISTENER_DEFAULTENVIRONMENT,
+ EAX2LISTENER_DEFAULTENVIRONMENTSIZE,
+ EAX2LISTENER_DEFAULTENVIRONMENTDIFFUSION,
+ EAX2LISTENER_DEFAULTAIRABSORPTIONHF,
+ EAX2LISTENER_DEFAULTFLAGS,
+};
+
+constexpr EAX20LISTENERPROPERTIES EAX2REVERB_PRESET_PADDEDCELL{
+ -1'000L,
+ -6'000L,
+ 0.0F,
+ 0.17F,
+ 0.1F,
+ -1'204L,
+ 0.001F,
+ 207L,
+ 0.002F,
+ EAX2_ENVIRONMENT_PADDEDCELL,
+ 1.4F,
+ 1.0F,
+ -5.0F,
+ EAX2LISTENER_DEFAULTFLAGS,
+};
+
+constexpr EAX20LISTENERPROPERTIES EAX2REVERB_PRESET_ROOM{
+ -1'000L,
+ -454L,
+ 0.0F,
+ 0.4F,
+ 0.83F,
+ -1'646L,
+ 0.002F,
+ 53L,
+ 0.003F,
+ EAX2_ENVIRONMENT_ROOM,
+ 1.9F,
+ 1.0F,
+ -5.0F,
+ EAX2LISTENER_DEFAULTFLAGS,
+};
+
+constexpr EAX20LISTENERPROPERTIES EAX2REVERB_PRESET_BATHROOM{
+ -1'000L,
+ -1'200L,
+ 0.0F,
+ 1.49F,
+ 0.54F,
+ -370L,
+ 0.007F,
+ 1'030L,
+ 0.011F,
+ EAX2_ENVIRONMENT_BATHROOM,
+ 1.4F,
+ 1.0F,
+ -5.0F,
+ EAX2LISTENER_DEFAULTFLAGS,
+};
+
+constexpr EAX20LISTENERPROPERTIES EAX2REVERB_PRESET_LIVINGROOM{
+ -1'000L,
+ -6'000L,
+ 0.0F,
+ 0.5F,
+ 0.1F,
+ -1'376L,
+ 0.003F,
+ -1'104L,
+ 0.004F,
+ EAX2_ENVIRONMENT_LIVINGROOM,
+ 2.5F,
+ 1.0F,
+ -5.0F,
+ EAX2LISTENER_DEFAULTFLAGS,
+};
+
+constexpr EAX20LISTENERPROPERTIES EAX2REVERB_PRESET_STONEROOM{
+ -1'000L,
+ -300L,
+ 0.0F,
+ 2.31F,
+ 0.64F,
+ -711L,
+ 0.012F,
+ 83L,
+ 0.017F,
+ EAX2_ENVIRONMENT_STONEROOM,
+ 11.6F,
+ 1.0F,
+ -5.0F,
+ EAX2LISTENER_DEFAULTFLAGS,
+};
+
+constexpr EAX20LISTENERPROPERTIES EAX2REVERB_PRESET_AUDITORIUM{
+ -1'000L,
+ -476L,
+ 0.0F,
+ 4.32F,
+ 0.59F,
+ -789L,
+ 0.02F,
+ -289L,
+ 0.03F,
+ EAX2_ENVIRONMENT_AUDITORIUM,
+ 21.6F,
+ 1.0F,
+ -5.0F,
+ EAX2LISTENER_DEFAULTFLAGS,
+};
+
+constexpr EAX20LISTENERPROPERTIES EAX2REVERB_PRESET_CONCERTHALL{
+ -1'000L,
+ -500L,
+ 0.0F,
+ 3.92F,
+ 0.7F,
+ -1'230L,
+ 0.02F,
+ -2L,
+ 0.029F,
+ EAX2_ENVIRONMENT_CONCERTHALL,
+ 19.6F,
+ 1.0F,
+ -5.0F,
+ EAX2LISTENER_DEFAULTFLAGS,
+};
+
+constexpr EAX20LISTENERPROPERTIES EAX2REVERB_PRESET_CAVE{
+ -1'000L,
+ 0L,
+ 0.0F,
+ 2.91F,
+ 1.3F,
+ -602L,
+ 0.015F,
+ -302L,
+ 0.022F,
+ EAX2_ENVIRONMENT_CAVE,
+ 14.6F,
+ 1.0F,
+ -5.0F,
+ EAX2LISTENERFLAGS_DECAYTIMESCALE |
+ EAX2LISTENERFLAGS_REFLECTIONSSCALE |
+ EAX2LISTENERFLAGS_REFLECTIONSDELAYSCALE |
+ EAX2LISTENERFLAGS_REVERBSCALE |
+ EAX2LISTENERFLAGS_REVERBDELAYSCALE,
+};
+
+constexpr EAX20LISTENERPROPERTIES EAX2REVERB_PRESET_ARENA{
+ -1'000L,
+ -698L,
+ 0.0F,
+ 7.24F,
+ 0.33F,
+ -1'166L,
+ 0.02F,
+ 16L,
+ 0.03F,
+ EAX2_ENVIRONMENT_ARENA,
+ 36.2F,
+ 1.0F,
+ -5.0F,
+ EAX2LISTENER_DEFAULTFLAGS,
+};
+
+constexpr EAX20LISTENERPROPERTIES EAX2REVERB_PRESET_HANGAR{
+ -1'000L,
+ -1'000L,
+ 0.0F,
+ 10.05F,
+ 0.23F,
+ -602L,
+ 0.02F,
+ 198L,
+ 0.03F,
+ EAX2_ENVIRONMENT_HANGAR,
+ 50.3F,
+ 1.0F,
+ -5.0F,
+ EAX2LISTENER_DEFAULTFLAGS,
+};
+
+constexpr EAX20LISTENERPROPERTIES EAX2REVERB_PRESET_CARPETTEDHALLWAY{
+ -1'000L,
+ -4'000L,
+ 0.0F,
+ 0.3F,
+ 0.1F,
+ -1'831L,
+ 0.002F,
+ -1'630L,
+ 0.03F,
+ EAX2_ENVIRONMENT_CARPETEDHALLWAY,
+ 1.9F,
+ 1.0F,
+ -5.0F,
+ EAX2LISTENER_DEFAULTFLAGS,
+};
+
+constexpr EAX20LISTENERPROPERTIES EAX2REVERB_PRESET_HALLWAY{
+ -1'000L,
+ -300L,
+ 0.0F,
+ 1.49F,
+ 0.59F,
+ -1'219L,
+ 0.007F,
+ 441L,
+ 0.011F,
+ EAX2_ENVIRONMENT_HALLWAY,
+ 1.8F,
+ 1.0F,
+ -5.0F,
+ EAX2LISTENER_DEFAULTFLAGS,
+};
+
+constexpr EAX20LISTENERPROPERTIES EAX2REVERB_PRESET_STONECORRIDOR{
+ -1'000L,
+ -237L,
+ 0.0F,
+ 2.7F,
+ 0.79F,
+ -1'214L,
+ 0.013F,
+ 395L,
+ 0.02F,
+ EAX2_ENVIRONMENT_STONECORRIDOR,
+ 13.5F,
+ 1.0F,
+ -5.0F,
+ EAX2LISTENER_DEFAULTFLAGS,
+};
+
+constexpr EAX20LISTENERPROPERTIES EAX2REVERB_PRESET_ALLEY{
+ -1'000L,
+ -270L,
+ 0.0F,
+ 1.49F,
+ 0.86F,
+ -1'204L,
+ 0.007F,
+ -4L,
+ 0.011F,
+ EAX2_ENVIRONMENT_ALLEY,
+ 7.5F,
+ 0.3F,
+ -5.0F,
+ EAX2LISTENER_DEFAULTFLAGS,
+};
+
+constexpr EAX20LISTENERPROPERTIES EAX2REVERB_PRESET_FOREST{
+ -1'000L,
+ -3'300L,
+ 0.0F,
+ 1.49F,
+ 0.54F,
+ -2'560L,
+ 0.162F,
+ -229L,
+ 0.088F,
+ EAX2_ENVIRONMENT_FOREST,
+ 38.0F,
+ 0.3F,
+ -5.0F,
+ EAX2LISTENER_DEFAULTFLAGS,
+};
+
+constexpr EAX20LISTENERPROPERTIES EAX2REVERB_PRESET_CITY{
+ -1'000L,
+ -800L,
+ 0.0F,
+ 1.49F,
+ 0.67F,
+ -2'273L,
+ 0.007F,
+ -1'691L,
+ 0.011F,
+ EAX2_ENVIRONMENT_CITY,
+ 7.5F,
+ 0.5F,
+ -5.0F,
+ EAX2LISTENER_DEFAULTFLAGS,
+};
+
+constexpr EAX20LISTENERPROPERTIES EAX2REVERB_PRESET_MOUNTAINS{
+ -1'000L,
+ -2'500L,
+ 0.0F,
+ 1.49F,
+ 0.21F,
+ -2'780L,
+ 0.3F,
+ -1'434L,
+ 0.1F,
+ EAX2_ENVIRONMENT_MOUNTAINS,
+ 100.0F,
+ 0.27F,
+ -5.0F,
+ EAX2LISTENERFLAGS_DECAYTIMESCALE |
+ EAX2LISTENERFLAGS_REFLECTIONSSCALE |
+ EAX2LISTENERFLAGS_REFLECTIONSDELAYSCALE |
+ EAX2LISTENERFLAGS_REVERBSCALE |
+ EAX2LISTENERFLAGS_REVERBDELAYSCALE,
+};
+
+constexpr EAX20LISTENERPROPERTIES EAX2REVERB_PRESET_QUARRY{
+ -1'000L,
+ -1'000L,
+ 0.0F,
+ 1.49F,
+ 0.83F,
+ -10'000L,
+ 0.061F,
+ 500L,
+ 0.025F,
+ EAX2_ENVIRONMENT_QUARRY,
+ 17.5F,
+ 1.0F,
+ -5.0F,
+ EAX2LISTENER_DEFAULTFLAGS,
+};
+
+constexpr EAX20LISTENERPROPERTIES EAX2REVERB_PRESET_PLAIN{
+ -1'000L,
+ -2'000L,
+ 0.0F,
+ 1.49F,
+ 0.5F,
+ -2'466L,
+ 0.179F,
+ -1'926L,
+ 0.1F,
+ EAX2_ENVIRONMENT_PLAIN,
+ 42.5F,
+ 0.21F,
+ -5.0F,
+ EAX2LISTENER_DEFAULTFLAGS,
+};
+
+constexpr EAX20LISTENERPROPERTIES EAX2REVERB_PRESET_PARKINGLOT{
+ -1'000L,
+ 0L,
+ 0.0F,
+ 1.65F,
+ 1.5F,
+ -1'363L,
+ 0.008F,
+ -1'153L,
+ 0.012F,
+ EAX2_ENVIRONMENT_PARKINGLOT,
+ 8.3F,
+ 1.0F,
+ -5.0F,
+ EAX2LISTENERFLAGS_DECAYTIMESCALE |
+ EAX2LISTENERFLAGS_REFLECTIONSSCALE |
+ EAX2LISTENERFLAGS_REFLECTIONSDELAYSCALE |
+ EAX2LISTENERFLAGS_REVERBSCALE |
+ EAX2LISTENERFLAGS_REVERBDELAYSCALE,
+};
+
+constexpr EAX20LISTENERPROPERTIES EAX2REVERB_PRESET_SEWERPIPE{
+ -1'000L,
+ -1'000L,
+ 0.0F,
+ 2.81F,
+ 0.14F,
+ 429L,
+ 0.014F,
+ 1'023L,
+ 0.021F,
+ EAX2_ENVIRONMENT_SEWERPIPE,
+ 1.7F,
+ 0.8F,
+ -5.0F,
+ EAX2LISTENER_DEFAULTFLAGS,
+};
+
+constexpr EAX20LISTENERPROPERTIES EAX2REVERB_PRESET_UNDERWATER{
+ -1'000L,
+ -4'000L,
+ 0.0F,
+ 1.49F,
+ 0.1F,
+ -449L,
+ 0.007F,
+ 1'700L,
+ 0.011F,
+ EAX2_ENVIRONMENT_UNDERWATER,
+ 1.8F,
+ 1.0F,
+ -5.0F,
+ EAX2LISTENER_DEFAULTFLAGS,
+};
+
+constexpr EAX20LISTENERPROPERTIES EAX2REVERB_PRESET_DRUGGED{
+ -1'000L,
+ 0L,
+ 0.0F,
+ 8.39F,
+ 1.39F,
+ -115L,
+ 0.002F,
+ 985L,
+ 0.03F,
+ EAX2_ENVIRONMENT_DRUGGED,
+ 1.9F,
+ 0.5F,
+ -5.0F,
+ EAX2LISTENERFLAGS_DECAYTIMESCALE |
+ EAX2LISTENERFLAGS_REFLECTIONSSCALE |
+ EAX2LISTENERFLAGS_REFLECTIONSDELAYSCALE |
+ EAX2LISTENERFLAGS_REVERBSCALE |
+ EAX2LISTENERFLAGS_REVERBDELAYSCALE,
+};
+
+constexpr EAX20LISTENERPROPERTIES EAX2REVERB_PRESET_DIZZY{
+ -1'000L,
+ -400L,
+ 0.0F,
+ 17.23F,
+ 0.56F,
+ -1'713L,
+ 0.02F,
+ -613L,
+ 0.03F,
+ EAX2_ENVIRONMENT_DIZZY,
+ 1.8F,
+ 0.6F,
+ -5.0F,
+ EAX2LISTENERFLAGS_DECAYTIMESCALE |
+ EAX2LISTENERFLAGS_REFLECTIONSSCALE |
+ EAX2LISTENERFLAGS_REFLECTIONSDELAYSCALE |
+ EAX2LISTENERFLAGS_REVERBSCALE |
+ EAX2LISTENERFLAGS_REVERBDELAYSCALE,
+};
+
+constexpr EAX20LISTENERPROPERTIES EAX2REVERB_PRESET_PSYCHOTIC{
+ -1'000L,
+ -151L,
+ 0.0F,
+ 7.56F,
+ 0.91F,
+ -626L,
+ 0.02F,
+ 774L,
+ 0.03F,
+ EAX2_ENVIRONMENT_PSYCHOTIC,
+ 1.0F,
+ 0.5F,
+ -5.0F,
+ EAX2LISTENERFLAGS_DECAYTIMESCALE |
+ EAX2LISTENERFLAGS_REFLECTIONSSCALE |
+ EAX2LISTENERFLAGS_REFLECTIONSDELAYSCALE |
+ EAX2LISTENERFLAGS_REVERBSCALE |
+ EAX2LISTENERFLAGS_REVERBDELAYSCALE,
+};
+
+} // namespace
+
+const Eax2ReverbPresets EAX2REVERB_PRESETS{
+ EAX2REVERB_PRESET_GENERIC,
+ EAX2REVERB_PRESET_PADDEDCELL,
+ EAX2REVERB_PRESET_ROOM,
+ EAX2REVERB_PRESET_BATHROOM,
+ EAX2REVERB_PRESET_LIVINGROOM,
+ EAX2REVERB_PRESET_STONEROOM,
+ EAX2REVERB_PRESET_AUDITORIUM,
+ EAX2REVERB_PRESET_CONCERTHALL,
+ EAX2REVERB_PRESET_CAVE,
+ EAX2REVERB_PRESET_ARENA,
+ EAX2REVERB_PRESET_HANGAR,
+ EAX2REVERB_PRESET_CARPETTEDHALLWAY,
+ EAX2REVERB_PRESET_HALLWAY,
+ EAX2REVERB_PRESET_STONECORRIDOR,
+ EAX2REVERB_PRESET_ALLEY,
+ EAX2REVERB_PRESET_FOREST,
+ EAX2REVERB_PRESET_CITY,
+ EAX2REVERB_PRESET_MOUNTAINS,
+ EAX2REVERB_PRESET_QUARRY,
+ EAX2REVERB_PRESET_PLAIN,
+ EAX2REVERB_PRESET_PARKINGLOT,
+ EAX2REVERB_PRESET_SEWERPIPE,
+ EAX2REVERB_PRESET_UNDERWATER,
+ EAX2REVERB_PRESET_DRUGGED,
+ EAX2REVERB_PRESET_DIZZY,
+ EAX2REVERB_PRESET_PSYCHOTIC,
+};
+
+// EAX3+ ====================================================================
+
namespace {
constexpr EAXREVERBPROPERTIES EAXREVERB_PRESET_GENERIC =
@@ -1153,61 +1716,3 @@ const EaxReverbPresets EAXREVERB_PRESETS{{
EAXREVERB_PRESET_DIZZY,
EAXREVERB_PRESET_PSYCHOTIC,
}};
-
-namespace {
-constexpr EAX_REVERBPROPERTIES EAX1REVERB_PRESET_GENERIC = {EAX_ENVIRONMENT_GENERIC, 0.5F, 1.493F, 0.5F};
-constexpr EAX_REVERBPROPERTIES EAX1REVERB_PRESET_PADDEDCELL = {EAX_ENVIRONMENT_PADDEDCELL, 0.25F, 0.1F, 0.0F};
-constexpr EAX_REVERBPROPERTIES EAX1REVERB_PRESET_ROOM = {EAX_ENVIRONMENT_ROOM, 0.417F, 0.4F, 0.666F};
-constexpr EAX_REVERBPROPERTIES EAX1REVERB_PRESET_BATHROOM = {EAX_ENVIRONMENT_BATHROOM, 0.653F, 1.499F, 0.166F};
-constexpr EAX_REVERBPROPERTIES EAX1REVERB_PRESET_LIVINGROOM = {EAX_ENVIRONMENT_LIVINGROOM, 0.208F, 0.478F, 0.0F};
-constexpr EAX_REVERBPROPERTIES EAX1REVERB_PRESET_STONEROOM = {EAX_ENVIRONMENT_STONEROOM, 0.5F, 2.309F, 0.888F};
-constexpr EAX_REVERBPROPERTIES EAX1REVERB_PRESET_AUDITORIUM = {EAX_ENVIRONMENT_AUDITORIUM, 0.403F, 4.279F, 0.5F};
-constexpr EAX_REVERBPROPERTIES EAX1REVERB_PRESET_CONCERTHALL = {EAX_ENVIRONMENT_CONCERTHALL, 0.5F, 3.961F, 0.5F};
-constexpr EAX_REVERBPROPERTIES EAX1REVERB_PRESET_CAVE = {EAX_ENVIRONMENT_CAVE, 0.5F, 2.886F, 1.304F};
-constexpr EAX_REVERBPROPERTIES EAX1REVERB_PRESET_ARENA = {EAX_ENVIRONMENT_ARENA, 0.361F, 7.284F, 0.332F};
-constexpr EAX_REVERBPROPERTIES EAX1REVERB_PRESET_HANGAR = {EAX_ENVIRONMENT_HANGAR, 0.5F, 10.0F, 0.3F};
-constexpr EAX_REVERBPROPERTIES EAX1REVERB_PRESET_CARPETTEDHALLWAY = {EAX_ENVIRONMENT_CARPETEDHALLWAY, 0.153F, 0.259F, 2.0F};
-constexpr EAX_REVERBPROPERTIES EAX1REVERB_PRESET_HALLWAY = {EAX_ENVIRONMENT_HALLWAY, 0.361F, 1.493F, 0.0F};
-constexpr EAX_REVERBPROPERTIES EAX1REVERB_PRESET_STONECORRIDOR = {EAX_ENVIRONMENT_STONECORRIDOR, 0.444F, 2.697F, 0.638F};
-constexpr EAX_REVERBPROPERTIES EAX1REVERB_PRESET_ALLEY = {EAX_ENVIRONMENT_ALLEY, 0.25F, 1.752F, 0.776F};
-constexpr EAX_REVERBPROPERTIES EAX1REVERB_PRESET_FOREST = {EAX_ENVIRONMENT_FOREST, 0.111F, 3.145F, 0.472F};
-constexpr EAX_REVERBPROPERTIES EAX1REVERB_PRESET_CITY = {EAX_ENVIRONMENT_CITY, 0.111F, 2.767F, 0.224F};
-constexpr EAX_REVERBPROPERTIES EAX1REVERB_PRESET_MOUNTAINS = {EAX_ENVIRONMENT_MOUNTAINS, 0.194F, 7.841F, 0.472F};
-constexpr EAX_REVERBPROPERTIES EAX1REVERB_PRESET_QUARRY = {EAX_ENVIRONMENT_QUARRY, 1.0F, 1.499F, 0.5F};
-constexpr EAX_REVERBPROPERTIES EAX1REVERB_PRESET_PLAIN = {EAX_ENVIRONMENT_PLAIN, 0.097F, 2.767F, 0.224F};
-constexpr EAX_REVERBPROPERTIES EAX1REVERB_PRESET_PARKINGLOT = {EAX_ENVIRONMENT_PARKINGLOT, 0.208F, 1.652F, 1.5F};
-constexpr EAX_REVERBPROPERTIES EAX1REVERB_PRESET_SEWERPIPE = {EAX_ENVIRONMENT_SEWERPIPE, 0.652F, 2.886F, 0.25F};
-constexpr EAX_REVERBPROPERTIES EAX1REVERB_PRESET_UNDERWATER = {EAX_ENVIRONMENT_UNDERWATER, 1.0F, 1.499F, 0.0F};
-constexpr EAX_REVERBPROPERTIES EAX1REVERB_PRESET_DRUGGED = {EAX_ENVIRONMENT_DRUGGED, 0.875F, 8.392F, 1.388F};
-constexpr EAX_REVERBPROPERTIES EAX1REVERB_PRESET_DIZZY = {EAX_ENVIRONMENT_DIZZY, 0.139F, 17.234F, 0.666F};
-constexpr EAX_REVERBPROPERTIES EAX1REVERB_PRESET_PSYCHOTIC = {EAX_ENVIRONMENT_PSYCHOTIC, 0.486F, 7.563F, 0.806F};
-} // namespace
-
-const Eax1ReverbPresets EAX1REVERB_PRESETS{{
- EAX1REVERB_PRESET_GENERIC,
- EAX1REVERB_PRESET_PADDEDCELL,
- EAX1REVERB_PRESET_ROOM,
- EAX1REVERB_PRESET_BATHROOM,
- EAX1REVERB_PRESET_LIVINGROOM,
- EAX1REVERB_PRESET_STONEROOM,
- EAX1REVERB_PRESET_AUDITORIUM,
- EAX1REVERB_PRESET_CONCERTHALL,
- EAX1REVERB_PRESET_CAVE,
- EAX1REVERB_PRESET_ARENA,
- EAX1REVERB_PRESET_HANGAR,
- EAX1REVERB_PRESET_CARPETTEDHALLWAY,
- EAX1REVERB_PRESET_HALLWAY,
- EAX1REVERB_PRESET_STONECORRIDOR,
- EAX1REVERB_PRESET_ALLEY,
- EAX1REVERB_PRESET_FOREST,
- EAX1REVERB_PRESET_CITY,
- EAX1REVERB_PRESET_MOUNTAINS,
- EAX1REVERB_PRESET_QUARRY,
- EAX1REVERB_PRESET_PLAIN,
- EAX1REVERB_PRESET_PARKINGLOT,
- EAX1REVERB_PRESET_SEWERPIPE,
- EAX1REVERB_PRESET_UNDERWATER,
- EAX1REVERB_PRESET_DRUGGED,
- EAX1REVERB_PRESET_DIZZY,
- EAX1REVERB_PRESET_PSYCHOTIC,
-}};
diff --git a/al/eax/api.h b/al/eax/api.h
index d0737d1d..f4419ddb 100644
--- a/al/eax/api.h
+++ b/al/eax/api.h
@@ -129,6 +129,110 @@ struct EAX20LISTENERPROPERTIES
unsigned long dwFlags; // modifies the behavior of properties
}; // EAX20LISTENERPROPERTIES
+inline bool operator==(const EAX20LISTENERPROPERTIES& lhs, const EAX20LISTENERPROPERTIES& rhs) noexcept
+{
+ return std::memcmp(&lhs, &rhs, sizeof(EAX20LISTENERPROPERTIES)) == 0;
+}
+
+enum : unsigned long
+{
+ EAX2_ENVIRONMENT_GENERIC,
+ EAX2_ENVIRONMENT_PADDEDCELL,
+ EAX2_ENVIRONMENT_ROOM,
+ EAX2_ENVIRONMENT_BATHROOM,
+ EAX2_ENVIRONMENT_LIVINGROOM,
+ EAX2_ENVIRONMENT_STONEROOM,
+ EAX2_ENVIRONMENT_AUDITORIUM,
+ EAX2_ENVIRONMENT_CONCERTHALL,
+ EAX2_ENVIRONMENT_CAVE,
+ EAX2_ENVIRONMENT_ARENA,
+ EAX2_ENVIRONMENT_HANGAR,
+ EAX2_ENVIRONMENT_CARPETEDHALLWAY,
+ EAX2_ENVIRONMENT_HALLWAY,
+ EAX2_ENVIRONMENT_STONECORRIDOR,
+ EAX2_ENVIRONMENT_ALLEY,
+ EAX2_ENVIRONMENT_FOREST,
+ EAX2_ENVIRONMENT_CITY,
+ EAX2_ENVIRONMENT_MOUNTAINS,
+ EAX2_ENVIRONMENT_QUARRY,
+ EAX2_ENVIRONMENT_PLAIN,
+ EAX2_ENVIRONMENT_PARKINGLOT,
+ EAX2_ENVIRONMENT_SEWERPIPE,
+ EAX2_ENVIRONMENT_UNDERWATER,
+ EAX2_ENVIRONMENT_DRUGGED,
+ EAX2_ENVIRONMENT_DIZZY,
+ EAX2_ENVIRONMENT_PSYCHOTIC,
+
+ EAX2_ENVIRONMENT_COUNT,
+};
+
+constexpr auto EAX2LISTENERFLAGS_DECAYTIMESCALE = 0x00000001UL;
+constexpr auto EAX2LISTENERFLAGS_REFLECTIONSSCALE = 0x00000002UL;
+constexpr auto EAX2LISTENERFLAGS_REFLECTIONSDELAYSCALE = 0x00000004UL;
+constexpr auto EAX2LISTENERFLAGS_REVERBSCALE = 0x00000008UL;
+constexpr auto EAX2LISTENERFLAGS_REVERBDELAYSCALE = 0x00000010UL;
+constexpr auto EAX2LISTENERFLAGS_DECAYHFLIMIT = 0x00000020UL;
+constexpr auto EAX2LISTENERFLAGS_RESERVED = 0xFFFFFFC0UL;
+
+constexpr auto EAX2LISTENER_MINROOM = -10'000L;
+constexpr auto EAX2LISTENER_MAXROOM = 0L;
+constexpr auto EAX2LISTENER_DEFAULTROOM = -1'000L;
+
+constexpr auto EAX2LISTENER_MINROOMHF = -10'000L;
+constexpr auto EAX2LISTENER_MAXROOMHF = 0L;
+constexpr auto EAX2LISTENER_DEFAULTROOMHF = -100L;
+
+constexpr auto EAX2LISTENER_MINROOMROLLOFFFACTOR = 0.0F;
+constexpr auto EAX2LISTENER_MAXROOMROLLOFFFACTOR = 10.0F;
+constexpr auto EAX2LISTENER_DEFAULTROOMROLLOFFFACTOR = 0.0F;
+
+constexpr auto EAX2LISTENER_MINDECAYTIME = 0.1F;
+constexpr auto EAX2LISTENER_MAXDECAYTIME = 20.0F;
+constexpr auto EAX2LISTENER_DEFAULTDECAYTIME = 1.49F;
+
+constexpr auto EAX2LISTENER_MINDECAYHFRATIO = 0.1F;
+constexpr auto EAX2LISTENER_MAXDECAYHFRATIO = 2.0F;
+constexpr auto EAX2LISTENER_DEFAULTDECAYHFRATIO = 0.83F;
+
+constexpr auto EAX2LISTENER_MINREFLECTIONS = -10'000L;
+constexpr auto EAX2LISTENER_MAXREFLECTIONS = 1'000L;
+constexpr auto EAX2LISTENER_DEFAULTREFLECTIONS = -2'602L;
+
+constexpr auto EAX2LISTENER_MINREFLECTIONSDELAY = 0.0F;
+constexpr auto EAX2LISTENER_MAXREFLECTIONSDELAY = 0.3F;
+constexpr auto EAX2LISTENER_DEFAULTREFLECTIONSDELAY = 0.007F;
+
+constexpr auto EAX2LISTENER_MINREVERB = -10'000L;
+constexpr auto EAX2LISTENER_MAXREVERB = 2'000L;
+constexpr auto EAX2LISTENER_DEFAULTREVERB = 200L;
+
+constexpr auto EAX2LISTENER_MINREVERBDELAY = 0.0F;
+constexpr auto EAX2LISTENER_MAXREVERBDELAY = 0.1F;
+constexpr auto EAX2LISTENER_DEFAULTREVERBDELAY = 0.011F;
+
+constexpr auto EAX2LISTENER_MINENVIRONMENT = 0UL;
+constexpr auto EAX2LISTENER_MAXENVIRONMENT = EAX2_ENVIRONMENT_COUNT - 1;
+constexpr auto EAX2LISTENER_DEFAULTENVIRONMENT = EAX2_ENVIRONMENT_GENERIC;
+
+constexpr auto EAX2LISTENER_MINENVIRONMENTSIZE = 1.0F;
+constexpr auto EAX2LISTENER_MAXENVIRONMENTSIZE = 100.0F;
+constexpr auto EAX2LISTENER_DEFAULTENVIRONMENTSIZE = 7.5F;
+
+constexpr auto EAX2LISTENER_MINENVIRONMENTDIFFUSION = 0.0F;
+constexpr auto EAX2LISTENER_MAXENVIRONMENTDIFFUSION = 1.0F;
+constexpr auto EAX2LISTENER_DEFAULTENVIRONMENTDIFFUSION = 1.0F;
+
+constexpr auto EAX2LISTENER_MINAIRABSORPTIONHF = -100.0F;
+constexpr auto EAX2LISTENER_MAXAIRABSORPTIONHF = 0.0F;
+constexpr auto EAX2LISTENER_DEFAULTAIRABSORPTIONHF = -5.0F;
+
+constexpr auto EAX2LISTENER_DEFAULTFLAGS =
+ EAX2LISTENERFLAGS_DECAYTIMESCALE |
+ EAX2LISTENERFLAGS_REFLECTIONSSCALE |
+ EAX2LISTENERFLAGS_REFLECTIONSDELAYSCALE |
+ EAX2LISTENERFLAGS_REVERBSCALE |
+ EAX2LISTENERFLAGS_REVERBDELAYSCALE |
+ EAX2LISTENERFLAGS_DECAYHFLIMIT;
extern const GUID DSPROPSETID_EAX20_BufferProperties;
@@ -957,13 +1061,15 @@ constexpr auto EAXREVERB_DEFAULTFLAGS =
EAXREVERBFLAGS_DECAYHFLIMIT;
-using EaxReverbPresets = std::array<EAXREVERBPROPERTIES, EAX1_ENVIRONMENT_COUNT>;
-extern const EaxReverbPresets EAXREVERB_PRESETS;
-
-
using Eax1ReverbPresets = std::array<EAX_REVERBPROPERTIES, EAX1_ENVIRONMENT_COUNT>;
extern const Eax1ReverbPresets EAX1REVERB_PRESETS;
+using Eax2ReverbPresets = std::array<EAX20LISTENERPROPERTIES, EAX2_ENVIRONMENT_COUNT>;
+extern const Eax2ReverbPresets EAX2REVERB_PRESETS;
+
+using EaxReverbPresets = std::array<EAXREVERBPROPERTIES, EAX1_ENVIRONMENT_COUNT>;
+extern const EaxReverbPresets EAXREVERB_PRESETS;
+
// AGC Compressor Effect
diff --git a/al/eax/call.cpp b/al/eax/call.cpp
new file mode 100644
index 00000000..1fd05968
--- /dev/null
+++ b/al/eax/call.cpp
@@ -0,0 +1,212 @@
+#include "config.h"
+#include "call.h"
+#include "exception.h"
+
+namespace {
+
+constexpr auto deferred_flag = 0x80000000U;
+
+class EaxCallException : public EaxException {
+public:
+ explicit EaxCallException(const char* message)
+ : EaxException{"EAX_CALL", message}
+ {}
+}; // EaxCallException
+
+} // namespace
+
+EaxCall::EaxCall(
+ EaxCallType type,
+ const GUID& property_set_guid,
+ ALuint property_id,
+ ALuint property_source_id,
+ ALvoid* property_buffer,
+ ALuint property_size)
+ : type_{type}, version_{0}, property_set_id_{EaxCallPropertySetId::none}
+ , property_id_{property_id & ~deferred_flag}, property_source_id_{property_source_id}
+ , property_buffer_{property_buffer}, property_size_{property_size}
+{
+ switch (type_)
+ {
+ case EaxCallType::get:
+ case EaxCallType::set:
+ break;
+
+ default:
+ fail("Invalid type.");
+ }
+
+ if (false)
+ {
+ }
+ else if (property_set_guid == EAXPROPERTYID_EAX40_Context)
+ {
+ version_ = 4;
+ property_set_id_ = EaxCallPropertySetId::context;
+ }
+ else if (property_set_guid == EAXPROPERTYID_EAX50_Context)
+ {
+ version_ = 5;
+ property_set_id_ = EaxCallPropertySetId::context;
+ }
+ else if (property_set_guid == DSPROPSETID_EAX20_ListenerProperties)
+ {
+ version_ = 2;
+ fx_slot_index_ = 0u;
+ property_set_id_ = EaxCallPropertySetId::fx_slot_effect;
+ }
+ else if (property_set_guid == DSPROPSETID_EAX30_ListenerProperties)
+ {
+ version_ = 3;
+ fx_slot_index_ = 0u;
+ property_set_id_ = EaxCallPropertySetId::fx_slot_effect;
+ }
+ else if (property_set_guid == EAXPROPERTYID_EAX40_FXSlot0)
+ {
+ version_ = 4;
+ fx_slot_index_ = 0u;
+ property_set_id_ = EaxCallPropertySetId::fx_slot;
+ }
+ else if (property_set_guid == EAXPROPERTYID_EAX50_FXSlot0)
+ {
+ version_ = 5;
+ fx_slot_index_ = 0u;
+ property_set_id_ = EaxCallPropertySetId::fx_slot;
+ }
+ else if (property_set_guid == EAXPROPERTYID_EAX40_FXSlot1)
+ {
+ version_ = 4;
+ fx_slot_index_ = 1u;
+ property_set_id_ = EaxCallPropertySetId::fx_slot;
+ }
+ else if (property_set_guid == EAXPROPERTYID_EAX50_FXSlot1)
+ {
+ version_ = 5;
+ fx_slot_index_ = 1u;
+ property_set_id_ = EaxCallPropertySetId::fx_slot;
+ }
+ else if (property_set_guid == EAXPROPERTYID_EAX40_FXSlot2)
+ {
+ version_ = 4;
+ fx_slot_index_ = 2u;
+ property_set_id_ = EaxCallPropertySetId::fx_slot;
+ }
+ else if (property_set_guid == EAXPROPERTYID_EAX50_FXSlot2)
+ {
+ version_ = 5;
+ fx_slot_index_ = 2u;
+ property_set_id_ = EaxCallPropertySetId::fx_slot;
+ }
+ else if (property_set_guid == EAXPROPERTYID_EAX40_FXSlot3)
+ {
+ version_ = 4;
+ fx_slot_index_ = 3u;
+ property_set_id_ = EaxCallPropertySetId::fx_slot;
+ }
+ else if (property_set_guid == EAXPROPERTYID_EAX50_FXSlot3)
+ {
+ version_ = 5;
+ fx_slot_index_ = 3u;
+ property_set_id_ = EaxCallPropertySetId::fx_slot;
+ }
+ else if (property_set_guid == DSPROPSETID_EAX20_BufferProperties)
+ {
+ version_ = 2;
+ property_set_id_ = EaxCallPropertySetId::source;
+ }
+ else if (property_set_guid == DSPROPSETID_EAX30_BufferProperties)
+ {
+ version_ = 3;
+ property_set_id_ = EaxCallPropertySetId::source;
+ }
+ else if (property_set_guid == EAXPROPERTYID_EAX40_Source)
+ {
+ version_ = 4;
+ property_set_id_ = EaxCallPropertySetId::source;
+ }
+ else if (property_set_guid == EAXPROPERTYID_EAX50_Source)
+ {
+ version_ = 5;
+ property_set_id_ = EaxCallPropertySetId::source;
+ }
+ else if (property_set_guid == DSPROPSETID_EAX_ReverbProperties)
+ {
+ version_ = 1;
+ fx_slot_index_ = 0u;
+ property_set_id_ = EaxCallPropertySetId::fx_slot_effect;
+ }
+ else if (property_set_guid == DSPROPSETID_EAXBUFFER_ReverbProperties)
+ {
+ version_ = 1;
+ property_set_id_ = EaxCallPropertySetId::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_ != EaxCallPropertySetId::fx_slot && property_id_ != 0)
+ {
+ if (property_buffer == nullptr)
+ {
+ fail("Null property buffer.");
+ }
+
+ if (property_size == 0)
+ {
+ fail("Empty property.");
+ }
+ }
+ }
+
+ if(property_set_id_ == EaxCallPropertySetId::source && property_source_id_ == 0)
+ {
+ fail("Null AL source id.");
+ }
+
+ if (property_set_id_ == EaxCallPropertySetId::fx_slot)
+ {
+ if (property_id_ < EAXFXSLOT_NONE)
+ {
+ property_set_id_ = EaxCallPropertySetId::fx_slot_effect;
+ }
+ }
+}
+
+[[noreturn]] void EaxCall::fail(const char* message)
+{
+ throw EaxCallException{message};
+}
+
+[[noreturn]] void EaxCall::fail_too_small()
+{
+ fail("Property buffer too small.");
+}
+
+EaxCall create_eax_call(
+ EaxCallType type,
+ const GUID* property_set_id,
+ ALuint property_id,
+ ALuint property_source_id,
+ ALvoid* property_buffer,
+ ALuint property_size)
+{
+ if(!property_set_id)
+ throw EaxCallException{"Null property set ID."};
+
+ return EaxCall{
+ type,
+ *property_set_id,
+ property_id,
+ property_source_id,
+ property_buffer,
+ property_size
+ };
+}
diff --git a/al/eax/eax_call.h b/al/eax/call.h
index 2c90bdc3..d491d6f9 100644
--- a/al/eax/eax_call.h
+++ b/al/eax/call.h
@@ -1,117 +1,92 @@
#ifndef EAX_EAX_CALL_INCLUDED
#define EAX_EAX_CALL_INCLUDED
-
#include "AL/al.h"
-
#include "alspan.h"
-
#include "api.h"
#include "fx_slot_index.h"
-
-enum class EaxEaxCallPropertySetId
-{
+enum class EaxCallType {
none,
+ get,
+ set,
+}; // EaxCallType
+enum class EaxCallPropertySetId {
+ none,
context,
fx_slot,
source,
fx_slot_effect,
-}; // EaxEaxCallPropertySetId
-
+}; // EaxCallPropertySetId
-class EaxEaxCall
-{
+class EaxCall {
public:
- EaxEaxCall(
- bool is_get,
+ EaxCall(
+ EaxCallType type,
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_; }
+ bool is_get() const noexcept { return type_ == EaxCallType::get; }
int get_version() const noexcept { return version_; }
- EaxEaxCallPropertySetId get_property_set_id() const noexcept { return property_set_id_; }
+ EaxCallPropertySetId 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
- >
+ template<typename TException, typename TValue>
TValue& get_value() const
{
if (property_size_ < static_cast<ALuint>(sizeof(TValue)))
{
- throw TException{"Property buffer too small."};
+ fail_too_small();
}
return *static_cast<TValue*>(property_buffer_);
}
- template<
- typename TException,
- typename TValue
- >
+ template<typename TException, typename TValue>
al::span<TValue> get_values() const
{
if (property_size_ < static_cast<ALuint>(sizeof(TValue)))
{
- throw TException{"Property buffer too small."};
+ fail_too_small();
}
const auto count = property_size_ / sizeof(TValue);
-
return al::span<TValue>{static_cast<TValue*>(property_buffer_), count};
}
- template<
- typename TException,
- typename TValue
- >
- void set_value(
- const TValue& value) const
+ template<typename TException, typename TValue>
+ void set_value(const TValue& value) const
{
get_value<TException, TValue>() = value;
}
-
private:
- const bool is_get_;
+ EaxCallType type_;
int version_;
EaxFxSlotIndex fx_slot_index_;
- EaxEaxCallPropertySetId property_set_id_;
+ EaxCallPropertySetId 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);
-
+ ALuint property_source_id_;
+ ALvoid*property_buffer_;
+ ALuint property_size_;
- static ALuint convert_eax_v2_0_listener_property_id(
- ALuint property_id);
+ [[noreturn]] static void fail(const char* message);
+ [[noreturn]] static void fail_too_small();
+}; // EaxCall
- static ALuint convert_eax_v2_0_buffer_property_id(
- ALuint property_id);
-}; // EaxEaxCall
-
-
-EaxEaxCall create_eax_call(
- bool is_get,
+EaxCall create_eax_call(
+ EaxCallType type,
const GUID* property_set_id,
ALuint property_id,
ALuint property_source_id,
ALvoid* property_buffer,
ALuint property_size);
-
#endif // !EAX_EAX_CALL_INCLUDED
diff --git a/al/eax/eax_call.cpp b/al/eax/eax_call.cpp
deleted file mode 100644
index 19565852..00000000
--- a/al/eax/eax_call.cpp
+++ /dev/null
@@ -1,323 +0,0 @@
-#include "config.h"
-
-#include "eax_call.h"
-#include "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
- };
-}
diff --git a/al/eax/effect.cpp b/al/eax/effect.cpp
deleted file mode 100644
index 4e8faa73..00000000
--- a/al/eax/effect.cpp
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "config.h"
-
-#include "effect.h"
diff --git a/al/eax/effect.h b/al/eax/effect.h
index 9c9fdef4..b57bf240 100644
--- a/al/eax/effect.h
+++ b/al/eax/effect.h
@@ -2,43 +2,172 @@
#define EAX_EFFECT_INCLUDED
+#include <cassert>
#include <memory>
+#include "alnumeric.h"
#include "AL/al.h"
#include "core/effects/base.h"
-#include "eax_call.h"
+#include "call.h"
-class EaxEffect
+struct EaxEffectErrorMessages
{
+ static constexpr auto unknown_property_id() noexcept { return "Unknown property id."; }
+ static constexpr auto unknown_version() noexcept { return "Unknown version."; }
+}; // EaxEffectErrorMessages
+
+class EaxEffect {
public:
- EaxEffect(ALenum type) : al_effect_type_{type} { }
+ EaxEffect(ALenum type) noexcept : al_effect_type_{type} { }
virtual ~EaxEffect() = default;
const ALenum al_effect_type_;
EffectProps al_effect_props_{};
- virtual void dispatch(const EaxEaxCall& eax_call) = 0;
+ virtual void dispatch(const EaxCall& call) = 0;
// Returns "true" if any immediated property was changed.
- // [[nodiscard]]
- virtual bool apply_deferred() = 0;
+ /*[[nodiscard]]*/ virtual bool commit() = 0;
}; // EaxEffect
+// Base class for EAX4+ effects.
+template<typename TException, typename TProps>
+class EaxEffect4 : public EaxEffect
+{
+public:
+ EaxEffect4(ALenum type, const EaxCall& call)
+ : EaxEffect{type}, version_{clamp(call.get_version(), 4, 5)}
+ {}
+
+ void initialize()
+ {
+ set_defaults();
+ set_efx_defaults();
+ }
+
+ void dispatch(const EaxCall& call) override
+ {
+ call.is_get() ? get(call) : set(call);
+ version_ = call.get_version();
+ }
+
+ bool commit() final
+ {
+ switch (version_)
+ {
+ case 4: return commit_state(state4_);
+ case 5: return commit_state(state5_);
+ default: fail_unknown_version();
+ }
+ }
+
+protected:
+ using Exception = TException;
+ using Props = TProps;
+
+ struct State {
+ Props i; // Immediate.
+ Props d; // Deferred.
+ }; // State
+
+ int version_;
+ Props props_;
+ State state4_;
+ State state5_;
+
+ template<typename TValidator, typename TProperty>
+ static void defer(const EaxCall& call, TProperty& property)
+ {
+ const auto& value = call.get_value<Exception, const TProperty>();
+ TValidator{}(value);
+ property = value;
+ }
+
+ virtual void set_defaults(Props& props) = 0;
+ virtual void set_efx_defaults() = 0;
+
+ virtual void get(const EaxCall& call, const Props& props) = 0;
+ virtual void set(const EaxCall& call, Props& props) = 0;
+
+ virtual bool commit_props(const Props& props) = 0;
+
+ [[noreturn]] static void fail(const char* message)
+ {
+ throw Exception{message};
+ }
+
+ [[noreturn]] static void fail_unknown_property_id()
+ {
+ fail(EaxEffectErrorMessages::unknown_property_id());
+ }
+
+ [[noreturn]] static void fail_unknown_version()
+ {
+ fail(EaxEffectErrorMessages::unknown_version());
+ }
+
+private:
+ void set_defaults()
+ {
+ set_defaults(props_);
+ state4_.i = props_;
+ state4_.d = props_;
+ state5_.i = props_;
+ state5_.d = props_;
+ }
+
+ void get(const EaxCall& call)
+ {
+ switch (call.get_version())
+ {
+ case 4: get(call, state4_.i); break;
+ case 5: get(call, state5_.i); break;
+ default: fail_unknown_version();
+ }
+ }
+
+ void set(const EaxCall& call)
+ {
+ switch (call.get_version())
+ {
+ case 4: set(call, state4_.d); break;
+ case 5: set(call, state5_.d); break;
+ default: fail_unknown_version();
+ }
+ }
+
+ bool commit_state(State& state)
+ {
+ const auto props = props_;
+ state.i = state.d;
+ props_ = state.d;
+ return commit_props(props);
+ }
+}; // EaxEffect4
using EaxEffectUPtr = std::unique_ptr<EaxEffect>;
+// Creates EAX4+ effect.
+template<typename TEffect>
+EaxEffectUPtr eax_create_eax4_effect(const EaxCall& call)
+{
+ auto effect = std::make_unique<TEffect>(call);
+ effect->initialize();
+ return effect;
+}
+
EaxEffectUPtr eax_create_eax_null_effect();
-EaxEffectUPtr eax_create_eax_chorus_effect();
-EaxEffectUPtr eax_create_eax_distortion_effect();
-EaxEffectUPtr eax_create_eax_echo_effect();
-EaxEffectUPtr eax_create_eax_flanger_effect();
-EaxEffectUPtr eax_create_eax_frequency_shifter_effect();
-EaxEffectUPtr eax_create_eax_vocal_morpher_effect();
-EaxEffectUPtr eax_create_eax_pitch_shifter_effect();
-EaxEffectUPtr eax_create_eax_ring_modulator_effect();
-EaxEffectUPtr eax_create_eax_auto_wah_effect();
-EaxEffectUPtr eax_create_eax_compressor_effect();
-EaxEffectUPtr eax_create_eax_equalizer_effect();
-EaxEffectUPtr eax_create_eax_reverb_effect();
+EaxEffectUPtr eax_create_eax_chorus_effect(const EaxCall& call);
+EaxEffectUPtr eax_create_eax_distortion_effect(const EaxCall& call);
+EaxEffectUPtr eax_create_eax_echo_effect(const EaxCall& call);
+EaxEffectUPtr eax_create_eax_flanger_effect(const EaxCall& call);
+EaxEffectUPtr eax_create_eax_frequency_shifter_effect(const EaxCall& call);
+EaxEffectUPtr eax_create_eax_vocal_morpher_effect(const EaxCall& call);
+EaxEffectUPtr eax_create_eax_pitch_shifter_effect(const EaxCall& call);
+EaxEffectUPtr eax_create_eax_ring_modulator_effect(const EaxCall& call);
+EaxEffectUPtr eax_create_eax_auto_wah_effect(const EaxCall& call);
+EaxEffectUPtr eax_create_eax_compressor_effect(const EaxCall& call);
+EaxEffectUPtr eax_create_eax_equalizer_effect(const EaxCall& call);
+EaxEffectUPtr eax_create_eax_reverb_effect(const EaxCall& call);
#endif // !EAX_EFFECT_INCLUDED
diff --git a/al/eax/fx_slots.cpp b/al/eax/fx_slots.cpp
index 5897e951..671d2cfb 100644
--- a/al/eax/fx_slots.cpp
+++ b/al/eax/fx_slots.cpp
@@ -29,9 +29,10 @@ public:
void EaxFxSlots::initialize(
+ const EaxCall& call,
ALCcontext& al_context)
{
- initialize_fx_slots(al_context);
+ initialize_fx_slots(call, al_context);
}
void EaxFxSlots::uninitialize() noexcept
@@ -70,6 +71,7 @@ void EaxFxSlots::fail(
}
void EaxFxSlots::initialize_fx_slots(
+ const EaxCall& call,
ALCcontext& al_context)
{
auto fx_slot_index = EaxFxSlotIndexValue{};
@@ -77,7 +79,7 @@ void EaxFxSlots::initialize_fx_slots(
for (auto& fx_slot : fx_slots_)
{
fx_slot = eax_create_al_effect_slot(al_context);
- fx_slot->eax_initialize(al_context, fx_slot_index);
+ fx_slot->eax_initialize(call, al_context, fx_slot_index);
fx_slot_index += 1;
}
}
diff --git a/al/eax/fx_slots.h b/al/eax/fx_slots.h
index 49cabd75..e7d1452e 100644
--- a/al/eax/fx_slots.h
+++ b/al/eax/fx_slots.h
@@ -7,6 +7,7 @@
#include "al/auxeffectslot.h"
#include "api.h"
+#include "call.h"
#include "fx_slot_index.h"
@@ -14,6 +15,7 @@ class EaxFxSlots
{
public:
void initialize(
+ const EaxCall& call,
ALCcontext& al_context);
void uninitialize() noexcept;
@@ -46,6 +48,7 @@ private:
const char* message);
void initialize_fx_slots(
+ const EaxCall& call,
ALCcontext& al_context);
}; // EaxFxSlots
diff --git a/al/eax/x_ram.cpp b/al/eax/x_ram.cpp
deleted file mode 100644
index 7332c82e..00000000
--- a/al/eax/x_ram.cpp
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "config.h"
-
-#include "x_ram.h"