diff options
Diffstat (limited to 'al/eax_fx_slots.cpp')
-rw-r--r-- | al/eax_fx_slots.cpp | 81 |
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; + } +} |