LumixEngine/src/audio/audio_system.cpp
2023-08-04 01:50:28 +02:00

89 lines
1.8 KiB
C++

#include "audio_system.h"
#include "audio_device.h"
#include "audio_module.h"
#include "clip.h"
#include "engine/engine.h"
#include "engine/plugin.h"
#include "engine/profiler.h"
#include "engine/resource_manager.h"
#include "engine/world.h"
namespace Lumix
{
struct ClipManager final : ResourceManager {
explicit ClipManager(IAllocator& allocator)
: ResourceManager(allocator)
, m_allocator(allocator)
{}
Resource* createResource(const Path& path) override {
return LUMIX_NEW(m_allocator, Clip)(path, *this, m_allocator);
}
void destroyResource(Resource& resource) override {
LUMIX_DELETE(m_allocator, static_cast<Clip*>(&resource));
}
IAllocator& m_allocator;
};
struct AudioSystemImpl final : AudioSystem {
explicit AudioSystemImpl(Engine& engine)
: m_engine(engine)
, m_allocator(engine.getAllocator(), "audio")
, m_manager(m_allocator)
{
AudioModule::reflect(engine);
}
~AudioSystemImpl()
{
m_manager.destroy();
}
void serialize(OutputMemoryStream& stream) const override {}
bool deserialize(i32 version, InputMemoryStream& stream) override { return version == 0; }
void initBegin() override
{
PROFILE_FUNCTION();
m_device = AudioDevice::create(m_engine, m_allocator);
m_manager.create(Clip::TYPE, m_engine.getResourceManager());
}
Engine& getEngine() override { return m_engine; }
AudioDevice& getDevice() override { return *m_device; }
const char* getName() const override { return "audio"; }
void createModules(World& world) override
{
UniquePtr<AudioModule> module = AudioModule::createInstance(*this, world, m_allocator);
world.addModule(module.move());
}
Engine& m_engine;
TagAllocator m_allocator;
ClipManager m_manager;
UniquePtr<AudioDevice> m_device;
};
LUMIX_PLUGIN_ENTRY(audio) {
PROFILE_FUNCTION();
return LUMIX_NEW(engine.getAllocator(), AudioSystemImpl)(engine);
}
} // namespace Lumix