diff --git a/clib.json b/clib.json index 0668aa7d..8ca55f11 100644 --- a/clib.json +++ b/clib.json @@ -23,6 +23,7 @@ "src": [ "include/AudioDevice.hpp", "include/AudioStream.hpp", + "include/AutomationEventList.hpp", "include/BoundingBox.hpp", "include/Camera2D.hpp", "include/Camera3D.hpp", diff --git a/include/AutomationEventList.hpp b/include/AutomationEventList.hpp new file mode 100644 index 00000000..63d6fe1f --- /dev/null +++ b/include/AutomationEventList.hpp @@ -0,0 +1,136 @@ +#ifndef RAYLIB_CPP_INCLUDE_AUTOMATIONEVENTLIST_HPP_ +#define RAYLIB_CPP_INCLUDE_AUTOMATIONEVENTLIST_HPP_ + +#include "./raylib.hpp" +#include "./raylib-cpp-utils.hpp" +#include "./RaylibException.hpp" + +namespace raylib { +/** + * AutomationEventList management functions + */ +class AutomationEventList : public ::AutomationEventList { + public: + AutomationEventList(const ::AutomationEventList& automationEventList) { + set(automationEventList); + } + + AutomationEventList(unsigned int capacity = 16384, + unsigned int count = 0, + AutomationEvent *events = nullptr) : ::AutomationEventList{capacity, count, events} { + // Nothing. + } + + AutomationEventList(const char* fileName) { + Load(fileName); + } + + AutomationEventList(const AutomationEventList&) = delete; + + AutomationEventList(AutomationEventList&& other) { + set(other); + + other.capacity = 0; + other.count = 0; + other.events = nullptr; + } + + ~AutomationEventList() { + Unload(); + } + + GETTERSETTER(unsigned int, Capacity, capacity) + GETTERSETTER(unsigned int, Count, count) + GETTERSETTER(AutomationEvent*, Events, events) + + AutomationEventList& operator=(const ::AutomationEventList& other) { + set(other); + return *this; + } + + AutomationEventList& operator=(const AutomationEventList&) = delete; + + AutomationEventList& operator=(AutomationEventList&& other) noexcept { + if (this == &other) { + return *this; + } + + Unload(); + set(other); + + other.capacity = 0; + other.count = 0; + other.events = nullptr; + + return *this; + } + + /** + * Load audio stream (to stream raw audio pcm data) + * + * @throws raylib::RaylibException Throws if the AutomationEventList failed to load. + */ + void Load(const char* fileName) { + Unload(); + set(::LoadAutomationEventList(fileName)); + if (!IsReady()) { + throw RaylibException("Failed to load automation event list"); + } + } + + /** + * Update audio stream buffers with data + */ + inline AutomationEventList& Unload() { + ::UnloadAutomationEventList(this); + return *this; + } + + inline bool IsReady() { + return events != nullptr; + } + + inline bool Export(const char* fileName) { + return ::ExportAutomationEventList(*this, fileName); + } + + inline void Set() { + ::SetAutomationEventList(this); + } + + inline void SetBaseFrame(int frame) { + Set(); + ::SetAutomationEventBaseFrame(frame); + } + + inline void StartRecording() { + Set(); + ::StartAutomationEventRecording(); + } + + inline void StopRecording() { + Set(); + ::StopAutomationEventRecording(); + } + + inline void Play(int index) { + if (index < 0 || index >= this->count) { + return; + } + + Set(); + ::PlayAutomationEvent(this->events[index]); + } + + protected: + void set(const ::AutomationEventList& other) { + capacity = other.capacity; + count = other.count; + events = other.events; + } +}; +} // namespace raylib + +using RAutomationEventList = raylib::AutomationEventList; + +#endif // RAYLIB_CPP_INCLUDE_AUTOMATIONEVENTLIST_HPP_ diff --git a/include/CMakeLists.txt b/include/CMakeLists.txt index 08d50931..07be5c7a 100644 --- a/include/CMakeLists.txt +++ b/include/CMakeLists.txt @@ -7,6 +7,7 @@ target_include_directories(raylib_cpp INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/) install(FILES AudioDevice.hpp AudioStream.hpp + AutomationEventList.hpp BoundingBox.hpp Camera2D.hpp Camera3D.hpp diff --git a/include/raylib-cpp.hpp b/include/raylib-cpp.hpp index f0d380ef..88cd6ef9 100644 --- a/include/raylib-cpp.hpp +++ b/include/raylib-cpp.hpp @@ -33,6 +33,7 @@ #include "./AudioDevice.hpp" #include "./AudioStream.hpp" +#include "./AutomationEventList.hpp" #include "./BoundingBox.hpp" #include "./Camera2D.hpp" #include "./Camera3D.hpp"