DragonNest/Common/FMODEngine/FMOD_static/src/fmod_output_emulated.cpp
2024-12-19 09:48:26 +08:00

196 lines
2.9 KiB
C++

#include "fmod_settings.h"
#include "fmod_channel_emulated.h"
#include "fmod_channelpool.h"
#include "fmod_memory.h"
#include "fmod_output_emulated.h"
#include "fmod_soundi.h"
#include "fmod_string.h"
namespace FMOD
{
/*
[
[DESCRIPTION]
[PARAMETERS]
[RETURN_VALUE]
FMOD_OK
[REMARKS]
[PLATFORMS]
Win32, Win64, Linux, Macintosh, XBox, PlayStation 2, GameCube
[SEE_ALSO]
]
*/
OutputEmulated::OutputEmulated()
{
FMOD_memset(&mDescription, 0, sizeof(FMOD_OUTPUT_DESCRIPTION_EX));
mChannel = 0;
}
/*
[
[DESCRIPTION]
[PARAMETERS]
[RETURN_VALUE]
FMOD_OK
[REMARKS]
[PLATFORMS]
Win32, Win64, Linux, Macintosh, XBox, PlayStation 2, GameCube
[SEE_ALSO]
]
*/
FMOD_RESULT OutputEmulated::init(int maxchannels)
{
FMOD_RESULT result;
if (!mSystem)
{
return FMOD_ERR_UNINITIALIZED;
}
/*
Create Emulated channels
*/
if (maxchannels)
{
int count;
mChannelPool = mChannelPool3D = FMOD_Object_Alloc(ChannelPool);
if (!mChannelPool)
{
return FMOD_ERR_MEMORY;
}
result = mChannelPool->init(mSystem, this, maxchannels);
if (result != FMOD_OK)
{
return result;
}
mChannel = (ChannelEmulated *)FMOD_Memory_Calloc(sizeof(ChannelEmulated) * maxchannels);
if (!mChannel)
{
return FMOD_ERR_MEMORY;
}
for (count = 0; count < maxchannels; count++)
{
new (&mChannel[count]) ChannelEmulated;
CHECK_RESULT(mChannelPool->setChannel(count, &mChannel[count]));
}
}
return FMOD_OK;
}
/*
[
[DESCRIPTION]
[PARAMETERS]
[RETURN_VALUE]
FMOD_OK
[REMARKS]
[PLATFORMS]
Win32, Win64, Linux, Macintosh, XBox, PlayStation 2, GameCube
[SEE_ALSO]
]
*/
FMOD_RESULT OutputEmulated::release()
{
if (mChannelPool)
{
mChannelPool->release();
mChannelPool = 0;
}
if (mChannel)
{
FMOD_Memory_Free(mChannel);
mChannel = 0;
}
return Output::release();
}
/*
[
[DESCRIPTION]
[PARAMETERS]
[RETURN_VALUE]
FMOD_OK
[REMARKS]
[PLATFORMS]
Win32, Win64, Linux, Macintosh, XBox, PlayStation 2, GameCube
[SEE_ALSO]
]
*/
FMOD_RESULT OutputEmulated::update()
{
return FMOD_OK;
}
/*
[
[DESCRIPTION]
[PARAMETERS]
[RETURN_VALUE]
[REMARKS]
[PLATFORMS]
[SEE_ALSO]
]
*/
#ifdef FMOD_SUPPORT_MEMORYTRACKER
FMOD_RESULT OutputEmulated::getMemoryUsedImpl(MemoryTracker *tracker)
{
tracker->add(false, FMOD_MEMBITS_OUTPUT, sizeof(*this));
if (mChannel)
{
int numchannels = 0;
if (mChannelPool)
{
CHECK_RESULT(mChannelPool->getNumChannels(&numchannels));
}
tracker->add(false, FMOD_MEMBITS_CHANNEL, sizeof(ChannelEmulated) * numchannels);
}
return Output::getMemoryUsedImpl(tracker);
}
#endif
}