metaforce/Runtime/Audio/CSfxManager.hpp

178 lines
6.2 KiB
C++
Raw Normal View History

2016-04-13 06:07:23 +00:00
#ifndef __URDE_CSFXMANAGER_HPP__
#define __URDE_CSFXMANAGER_HPP__
2015-08-20 02:52:07 +00:00
#include <vector>
#include "../RetroTypes.hpp"
2016-03-04 23:04:53 +00:00
#include "zeus/CVector3f.hpp"
2015-08-20 02:52:07 +00:00
#include "CAudioSys.hpp"
2016-03-04 23:04:53 +00:00
namespace urde
2015-08-20 02:52:07 +00:00
{
class CSfxManager
{
2016-04-28 04:52:41 +00:00
static std::vector<s16>* mpSfxTranslationTable;
2016-04-17 02:50:45 +00:00
public:
2016-12-29 05:53:00 +00:00
CSfxManager();
2015-11-21 01:16:07 +00:00
enum class ESfxChannels
2015-08-20 02:52:07 +00:00
{
2016-04-17 02:50:45 +00:00
Zero,
One
2015-08-20 02:52:07 +00:00
};
2015-11-21 01:16:07 +00:00
enum class ESfxAudibility
2015-08-20 02:52:07 +00:00
{
Aud0,
Aud1,
Aud2,
Aud3
};
class CSfxChannel
{
};
2016-12-29 05:53:00 +00:00
class CBaseSfxWrapper;
using CSfxHandle = std::shared_ptr<CBaseSfxWrapper>;
class CBaseSfxWrapper : public std::enable_shared_from_this<CBaseSfxWrapper>
2015-08-20 02:52:07 +00:00
{
float x4_ = 15.f;
s16 x8_rank = 0;
s16 xa_prio;
2016-12-29 05:53:00 +00:00
//CSfxHandle xc_handle;
TAreaId x10_area;
union
{
struct
{
2016-12-29 05:53:00 +00:00
bool x14_24_isActive:1;
bool x14_25_isPlaying:1;
bool x14_26_looped:1;
bool x14_27_inArea:1;
bool x14_28_available:1;
bool x14_29_useAcoustics:1;
};
u16 _dummy = 0;
};
2015-08-20 02:52:07 +00:00
public:
2016-12-29 05:53:00 +00:00
virtual ~CBaseSfxWrapper() = default;
virtual void SetActive(bool v) { x14_24_isActive = v; }
virtual void SetPlaying(bool v) { x14_25_isPlaying = v; }
virtual void SetRank(short v) { x8_rank = v; }
virtual void SetInArea(bool v) { x14_27_inArea = v; }
virtual bool IsInArea() const { return x14_27_inArea; }
virtual bool IsPlaying() const { return x14_25_isPlaying; }
virtual bool UseAcoustics() const { return x14_29_useAcoustics; }
virtual bool IsLooped() const { return x14_26_looped; }
virtual bool IsActive() const { return x14_24_isActive; }
virtual s16 GetRank() const { return x8_rank; }
virtual s16 GetPriority() const { return xa_prio; }
virtual TAreaId GetArea() const { return x10_area; }
virtual CSfxHandle GetSfxHandle() { return shared_from_this(); }
2015-08-20 02:52:07 +00:00
virtual void Play()=0;
virtual void Stop()=0;
virtual bool Ready()=0;
2016-04-17 02:50:45 +00:00
virtual ESfxAudibility GetAudible(const zeus::CVector3f&)=0;
virtual const std::shared_ptr<amuse::Voice>& GetVoice() const=0;
2015-08-20 02:52:07 +00:00
2016-12-29 05:53:00 +00:00
void Release() { x14_28_available = true; }
bool Available() const { return x14_28_available; }
2015-08-20 02:52:07 +00:00
2016-12-29 05:53:00 +00:00
CBaseSfxWrapper(bool looped, s16 prio, /*const CSfxHandle& handle,*/ bool useAcoustics, TAreaId area)
: x8_rank(0), xa_prio(prio), /*xc_handle(handle),*/ x10_area(area), x14_24_isActive(true), x14_25_isPlaying(false),
x14_26_looped(looped), x14_27_inArea(true), x14_28_available(false), x14_29_useAcoustics(useAcoustics) {}
2015-08-20 02:52:07 +00:00
};
class CSfxEmitterWrapper : public CBaseSfxWrapper
{
2016-12-29 05:53:00 +00:00
float x1a_reverb;
CAudioSys::C3DEmitterParmData x24_parmData;
std::shared_ptr<amuse::Emitter> x50_emitterHandle;
bool x54_ready = true;
2015-08-20 02:52:07 +00:00
public:
bool IsPlaying() const;
void Play();
void Stop();
bool Ready();
2016-04-17 02:50:45 +00:00
ESfxAudibility GetAudible(const zeus::CVector3f&);
const std::shared_ptr<amuse::Voice>& GetVoice() const { return x50_emitterHandle->getVoice(); }
2015-08-20 02:52:07 +00:00
const std::shared_ptr<amuse::Emitter>& GetHandle() const { return x50_emitterHandle; }
2015-08-20 02:52:07 +00:00
CSfxEmitterWrapper(bool looped, s16 prio, const CAudioSys::C3DEmitterParmData& data,
2016-12-29 05:53:00 +00:00
/*const CSfxHandle& handle,*/ bool useAcoustics, TAreaId area)
: CBaseSfxWrapper(looped, prio, /*handle,*/ useAcoustics, area), x24_parmData(data) {}
2015-08-20 02:52:07 +00:00
};
class CSfxWrapper : public CBaseSfxWrapper
{
u16 x18_sfxId;
std::shared_ptr<amuse::Voice> x1c_voiceHandle;
2016-12-29 05:53:00 +00:00
float x20_vol;
float x22_pan;
bool x24_ready = true;
2015-08-20 02:52:07 +00:00
public:
bool IsPlaying() const;
void Play();
void Stop();
bool Ready();
2016-12-29 05:53:00 +00:00
ESfxAudibility GetAudible(const zeus::CVector3f&) { return ESfxAudibility::Aud3; }
const std::shared_ptr<amuse::Voice>& GetVoice() const { return x1c_voiceHandle; }
2015-08-20 02:52:07 +00:00
2016-12-29 05:53:00 +00:00
void SetVolume(s16 vol) { x20_vol = vol; }
2015-08-20 02:52:07 +00:00
2016-12-29 05:53:00 +00:00
CSfxWrapper(bool looped, s16 prio, u16 sfxId, float vol, float pan,
/*const CSfxHandle& handle,*/ bool useAcoustics, TAreaId area)
: CBaseSfxWrapper(looped, prio, /*handle,*/ useAcoustics, area),
x18_sfxId(sfxId), x20_vol(vol), x22_pan(pan) {}
2015-08-20 02:52:07 +00:00
};
static CSfxChannel m_channels[4];
2016-12-29 05:53:00 +00:00
static rstl::reserved_vector<std::shared_ptr<CSfxEmitterWrapper>, 128> m_emitterWrapperPool;
static rstl::reserved_vector<std::shared_ptr<CSfxWrapper>, 128> m_wrapperPool;
2015-08-20 02:52:07 +00:00
static ESfxChannels m_currentChannel;
static bool m_doUpdate;
static void* m_usedSounds;
static bool m_muted;
static bool m_auxProcessingEnabled;
2016-12-29 05:53:00 +00:00
static float m_reverbAmount;
2015-08-20 02:52:07 +00:00
static u16 kMaxPriority;
static u16 kMedPriority;
static u16 kInternalInvalidSfxId;
static u32 kAllAreas;
2016-12-29 05:53:00 +00:00
static bool IsAuxProcessingEnabled() { return m_auxProcessingEnabled; }
2016-09-17 06:40:45 +00:00
static void SetChannel(ESfxChannels) {}
static void KillAll(ESfxChannels) {}
static void TurnOnChannel(ESfxChannels) {}
2015-08-20 02:52:07 +00:00
static ESfxChannels GetCurrentChannel() {return m_currentChannel;}
2016-04-17 02:50:45 +00:00
static void AddListener(ESfxChannels,
const zeus::CVector3f& pos, const zeus::CVector3f& dir,
const zeus::CVector3f& heading, const zeus::CVector3f& up,
float frontRadius, float surroundRadius, float soundSpeed,
u32 flags /* 0x1 for doppler */, u8 vol);
static void UpdateListener(const zeus::CVector3f& pos, const zeus::CVector3f& dir,
const zeus::CVector3f& heading, const zeus::CVector3f& up,
u8 vol);
2016-04-25 05:03:38 +00:00
2016-04-29 10:08:46 +00:00
static void RemoveEmitter(const CSfxHandle&) {}
2016-05-03 08:27:28 +00:00
static void PitchBend(const CSfxHandle&, s32) {}
2016-04-25 05:03:38 +00:00
static u16 TranslateSFXID(u16);
2016-12-29 05:53:00 +00:00
static void SfxStop(const CSfxHandle& handle);
static CSfxHandle SfxStart(u16 id, float vol, float pan, bool useAcoustics, s16 prio, bool looped, s32 areaId);
static void Update();
private:
static std::shared_ptr<CSfxWrapper>* AllocateCSfxWrapper();
2015-08-20 02:52:07 +00:00
};
2016-12-29 05:53:00 +00:00
using CSfxHandle = CSfxManager::CSfxHandle;
2015-08-20 02:52:07 +00:00
}
2016-04-13 06:07:23 +00:00
#endif // __URDE_CSFXMANAGER_HPP__