aboutsummaryrefslogtreecommitdiffstats
path: root/al/eax_fx_slots.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'al/eax_fx_slots.cpp')
-rw-r--r--al/eax_fx_slots.cpp81
1 files changed, 81 insertions, 0 deletions
diff --git a/al/eax_fx_slots.cpp b/al/eax_fx_slots.cpp
new file mode 100644
index 00000000..41b18f77
--- /dev/null
+++ b/al/eax_fx_slots.cpp
@@ -0,0 +1,81 @@
+#include "eax_fx_slots.h"
+
+#include <array>
+
+#include "eax_exception.h"
+
+#include "eax_api.h"
+
+
+namespace
+{
+
+
+class EaxFxSlotsException :
+ public EaxException
+{
+public:
+ explicit EaxFxSlotsException(
+ const char* message)
+ :
+ EaxException{"EAX_FX_SLOTS", message}
+ {
+ }
+}; // EaxFxSlotsException
+
+
+} // namespace
+
+
+void EaxFxSlots::initialize(
+ ALCcontext& al_context)
+{
+ initialize_fx_slots(al_context);
+}
+
+void EaxFxSlots::uninitialize() noexcept
+{
+ for (auto& fx_slot : fx_slots_)
+ {
+ fx_slot->eax_uninitialize();
+ fx_slot = nullptr;
+ }
+}
+
+const ALeffectslot& EaxFxSlots::get(
+ EaxFxSlotIndex index) const
+{
+ if (!index.has_value())
+ {
+ fail("Empty index.");
+ }
+
+ return *fx_slots_[index.get()];
+}
+
+ALeffectslot& EaxFxSlots::get(
+ EaxFxSlotIndex index)
+{
+ return const_cast<ALeffectslot&>(const_cast<const EaxFxSlots*>(this)->get(index));
+}
+
+
+[[noreturn]]
+void EaxFxSlots::fail(
+ const char* message)
+{
+ throw EaxFxSlotsException{message};
+}
+
+void EaxFxSlots::initialize_fx_slots(
+ ALCcontext& al_context)
+{
+ auto fx_slot_index = EaxFxSlotIndexValue{};
+
+ 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_index += 1;
+ }
+}