mirror of
https://github.com/PrimeDecomp/prime.git
synced 2026-07-12 18:18:56 -07:00
CAudioSys progress
This commit is contained in:
@@ -14652,7 +14652,7 @@ SysLoadGroupSet__9CAudioSysFP11CSimplePoolUi = .text:0x8034C2B0; // type:functio
|
||||
SysSetSfxVolume__9CAudioSysFUcUsUcUc = .text:0x8034C4EC; // type:function size:0x30 scope:global
|
||||
SysSetVolume__9CAudioSysFUcUsUc = .text:0x8034C51C; // type:function size:0x2C scope:global
|
||||
__dt__9CAudioSysFv = .text:0x8034C548; // type:function size:0x1A8 scope:global
|
||||
__ct__9CAudioSysFccccUi = .text:0x8034C6F0; // type:function size:0x294 scope:global
|
||||
__ct__9CAudioSysFUcUcUcUcUi = .text:0x8034C6F0; // type:function size:0x294 scope:global
|
||||
DoFree__FPv = .text:0x8034C984; // type:function size:0x28 scope:global
|
||||
DoMalloc__FUl = .text:0x8034C9AC; // type:function size:0x2C scope:global
|
||||
fn_8034C9D8 = .text:0x8034C9D8; // type:function size:0x5C
|
||||
@@ -17865,7 +17865,7 @@ lbl_803D8078 = .rodata:0x803D8078; // type:object size:0x30
|
||||
lbl_803D80A8 = .rodata:0x803D80A8; // type:object size:0x60 data:4byte
|
||||
lbl_803D8108 = .rodata:0x803D8108; // type:object size:0x8
|
||||
lbl_803D8110 = .rodata:0x803D8110; // type:object size:0x100
|
||||
lbl_803D8210 = .rodata:0x803D8210; // type:object size:0x10
|
||||
@stringBase0 = .rodata:0x803D8210; // type:object size:0x10 scope:local data:string_table
|
||||
lbl_803D8220 = .rodata:0x803D8220; // type:object size:0x8
|
||||
@stringBase0 = .rodata:0x803D8228; // type:object size:0x7 scope:local data:string_table
|
||||
@stringBase0 = .rodata:0x803D8230; // type:object size:0xD scope:local data:string_table
|
||||
@@ -21373,9 +21373,9 @@ lbl_805A8934 = .sdata:0x805A8934; // type:object size:0x4 data:4byte
|
||||
@229 = .sdata:0x805A898C; // type:object size:0x4 scope:local
|
||||
@230 = .sdata:0x805A8990; // type:object size:0x4 scope:local
|
||||
@232 = .sdata:0x805A8994; // type:object size:0x4 scope:local
|
||||
lbl_805A8998 = .sdata:0x805A8998; // type:object size:0x1 data:byte
|
||||
lbl_805A899A = .sdata:0x805A899A; // type:object size:0x2 align:2 data:2byte
|
||||
lbl_805A899C = .sdata:0x805A899C; // type:object size:0x2 data:2byte
|
||||
mProLogic2__9CAudioSys = .sdata:0x805A8998; // type:object size:0x1 data:byte
|
||||
mVolumeScale__9CAudioSys = .sdata:0x805A899A; // type:object size:0x2 align:2 data:2byte
|
||||
mDefaultVolumeScale__9CAudioSys = .sdata:0x805A899C; // type:object size:0x2 data:2byte
|
||||
lbl_805A899E = .sdata:0x805A899E; // type:object size:0x1 data:byte
|
||||
lbl_805A899F = .sdata:0x805A899F; // type:object size:0x1 data:byte
|
||||
lbl_805A89A0 = .sdata:0x805A89A0; // type:object size:0x1 data:byte
|
||||
@@ -22051,18 +22051,18 @@ sBlueColor__6CColor = .sbss:0x805A957C; // type:object size:0x4 scope:global dat
|
||||
sYellowColor__6CColor = .sbss:0x805A9580; // type:object size:0x4 scope:global data:4byte
|
||||
sPurpleColor__6CColor = .sbss:0x805A9584; // type:object size:0x4 scope:global data:4byte
|
||||
sOrangeColor__6CColor = .sbss:0x805A9588; // type:object size:0x4 scope:global data:4byte
|
||||
lbl_805A9590 = .sbss:0x805A9590; // type:object size:0x1 data:byte
|
||||
lbl_805A9591 = .sbss:0x805A9591; // type:object size:0x1 data:byte
|
||||
lbl_805A9592 = .sbss:0x805A9592; // type:object size:0x1 data:byte
|
||||
lbl_805A9593 = .sbss:0x805A9593; // type:object size:0x1 data:byte
|
||||
lbl_805A9594 = .sbss:0x805A9594; // type:object size:0x4 data:4byte
|
||||
lbl_805A9598 = .sbss:0x805A9598; // type:object size:0x4 data:4byte
|
||||
lbl_805A959C = .sbss:0x805A959C; // type:object size:0x4 data:4byte
|
||||
lbl_805A95A0 = .sbss:0x805A95A0; // type:object size:0x4 data:4byte
|
||||
lbl_805A95A4 = .sbss:0x805A95A4; // type:object size:0x4 data:4byte
|
||||
lbl_805A95A8 = .sbss:0x805A95A8; // type:object size:0x4 data:4byte
|
||||
lbl_805A95AC = .sbss:0x805A95AC; // type:object size:0x4 data:4byte
|
||||
lbl_805A95B0 = .sbss:0x805A95B0; // type:object size:0x4 data:4byte
|
||||
mInitialized__9CAudioSys = .sbss:0x805A9590; // type:object size:0x1 data:byte
|
||||
mIsListenerActive__9CAudioSys = .sbss:0x805A9591; // type:object size:0x1 data:byte
|
||||
mVerbose__9CAudioSys = .sbss:0x805A9592; // type:object size:0x1 data:byte
|
||||
mMaxNumEmitters__9CAudioSys = .sbss:0x805A9593; // type:object size:0x1 data:byte
|
||||
mpGroupSetDB__9CAudioSys = .sbss:0x805A9594; // type:object size:0x4 data:4byte
|
||||
mpGroupSetResNameDB__9CAudioSys = .sbss:0x805A9598; // type:object size:0x4 data:4byte
|
||||
mpDVDTrackDB__9CAudioSys = .sbss:0x805A959C; // type:object size:0x4 data:4byte
|
||||
mpEmitterDB__9CAudioSys = .sbss:0x805A95A0; // type:object size:0x4 data:4byte
|
||||
mpListener__9CAudioSys = .sbss:0x805A95A4; // type:object size:0x4 data:4byte
|
||||
mUnusedEmitterHandle__9CAudioSys = .sbss:0x805A95A8; // type:object size:0x4 data:4byte
|
||||
mSurroundMode__9CAudioSys = .sbss:0x805A95AC; // type:object size:0x4 data:4byte
|
||||
mMaxAramUsage__9CAudioSys = .sbss:0x805A95B0; // type:object size:0x4 data:4byte
|
||||
lbl_805A95B4 = .sbss:0x805A95B4; // type:object size:0x4 data:4byte
|
||||
lbl_805A95B8 = .sbss:0x805A95B8; // type:object size:0x4 data:4byte
|
||||
lbl_805A95BC = .sbss:0x805A95BC; // type:object size:0x4 data:4byte
|
||||
@@ -26694,7 +26694,7 @@ kInput_AnalogTriggerOnThreshhold__11CFinalInput = .sdata2:0x805AE94C; // type:ob
|
||||
@466 = .sdata2:0x805AE954; // type:object size:0x4 scope:local align:4 data:float
|
||||
@467 = .sdata2:0x805AE958; // type:object size:0x4 scope:local align:4 data:float
|
||||
kMaxVolume__9CAudioSys = .sdata2:0x805AE960; // type:object size:0x1 scope:global data:byte
|
||||
lbl_805AE961 = .sdata2:0x805AE961; // type:object size:0x1 data:byte
|
||||
kEmitterMedPriority__9CAudioSys = .sdata2:0x805AE961; // type:object size:0x1 data:byte
|
||||
lbl_805AE964 = .sdata2:0x805AE964; // type:object size:0x4 data:4byte
|
||||
lbl_805AE968 = .sdata2:0x805AE968; // type:object size:0x8 data:4byte
|
||||
kAbsoluteMinimum__11IController = .sdata2:0x805AE970; // type:object size:0x4 scope:global align:4 data:float
|
||||
|
||||
@@ -14652,7 +14652,7 @@ SysLoadGroupSet__9CAudioSysFP11CSimplePoolUi = .text:0x8034C420; // type:functio
|
||||
SysSetSfxVolume__9CAudioSysFUcUsUcUc = .text:0x8034C65C; // type:function size:0x30
|
||||
SysSetVolume__9CAudioSysFUcUsUc = .text:0x8034C68C; // type:function size:0x2C
|
||||
__dt__9CAudioSysFv = .text:0x8034C6B8; // type:function size:0x1A8
|
||||
__ct__9CAudioSysFccccUi = .text:0x8034C860; // type:function size:0x294
|
||||
__ct__9CAudioSysFUcUcUcUcUi = .text:0x8034C860; // type:function size:0x294
|
||||
DoFree__FPv = .text:0x8034CAF4; // type:function size:0x28
|
||||
DoMalloc__FUl = .text:0x8034CB1C; // type:function size:0x2C
|
||||
fn_8034CB48 = .text:0x8034CB48; // type:function size:0x5C
|
||||
|
||||
@@ -1,17 +1,22 @@
|
||||
#ifndef _CANIMATIONMANAGER
|
||||
#define _CANIMATIONMANAGER
|
||||
|
||||
#include "Kyoto/Animation/CAnimationDatabase.hpp"
|
||||
#include "Kyoto/TToken.hpp"
|
||||
|
||||
|
||||
class CMetaAnimTreeBuildOrders;
|
||||
class CAnimTreeContext;
|
||||
class CAnimationManager {
|
||||
public:
|
||||
//CAnimationManager(const TToken<CAnimationDatabase>& animDB, const CAnimSysContext& sysCtx);
|
||||
CAnimationManager(const TToken< CAnimationDatabase >& animDB, const CAnimSysContext& sysCtx)
|
||||
: x0_animDB(animDB), x8_sysCtx(sysCtx) {}
|
||||
|
||||
rstl::rc_ptr< CAnimTreeNode > GetAnimationTree(uint a,
|
||||
const CMetaAnimTreeBuildOrders& orders) const;
|
||||
|
||||
private:
|
||||
//TToken< CAnimationDatabase > x0_animDB;
|
||||
//CAnimSysContext x8_sysCtx;
|
||||
TToken< CAnimationDatabase > x0_animDB;
|
||||
const CAnimSysContext& x8_sysCtx;
|
||||
};
|
||||
|
||||
|
||||
#endif // _CANIMATIONMANAGER
|
||||
|
||||
@@ -33,10 +33,9 @@ public:
|
||||
public:
|
||||
CEmitterData() : _50(0), _51(0), _52(kEmitterMedPriority) {};
|
||||
|
||||
private:
|
||||
char data[0x50];
|
||||
char _50;
|
||||
char _51;
|
||||
SND_EMITTER x0_emitter;
|
||||
bool _50;
|
||||
bool _51;
|
||||
uchar _52;
|
||||
};
|
||||
|
||||
@@ -66,10 +65,10 @@ public:
|
||||
|
||||
class CTrkData {};
|
||||
|
||||
CAudioSys(char, char, char, char, uint);
|
||||
CAudioSys(uchar, uchar, uchar, uchar, uint);
|
||||
~CAudioSys();
|
||||
|
||||
static void SysSetVolume(uchar, uint, uchar);
|
||||
static void SysSetVolume(uchar, ushort, uchar);
|
||||
static void SysSetSfxVolume(uchar, ushort, uchar, uchar);
|
||||
static bool SysLoadGroupSet(CSimplePool*, uint);
|
||||
static const rstl::string& SysGetGroupSetName(uint);
|
||||
@@ -80,7 +79,8 @@ public:
|
||||
|
||||
static void SetDefaultVolumeScale(short);
|
||||
static void SetVolumeScale(short);
|
||||
static void SetSurroundMode(ESurroundModes);
|
||||
static void SetStereoMode(const bool mode);
|
||||
static void SetSurroundMode(const ESurroundModes mode);
|
||||
static void TrkSetSampleRate(ETRKSampleRate);
|
||||
|
||||
static short GetDefaultVolumeScale();
|
||||
@@ -91,34 +91,44 @@ public:
|
||||
static void SfxCtrl(SND_VOICEID handle, uchar ctrl, uchar val);
|
||||
static SND_VOICEID SfxCheck(SND_VOICEID handle);
|
||||
static void SfxVolume(SND_VOICEID handle, u8 vol);
|
||||
static uint S3dFindLowerPriorityHandle(uint prio);
|
||||
static uint S3dFindUnusedHandle();
|
||||
static uint S3dAddEmitterParaEx(const C3DEmitterParmData& params, ushort handle,
|
||||
SND_PARAMETER_INFO* paraInfo);
|
||||
static void S3dUpdateEmitter(uint, const CVector3f&, const CVector3f&, uchar);
|
||||
static void S3dRemoveEmitter(uint handle);
|
||||
static const bool S3dUpdateEmitter(const uint a, const CVector3f& b, const CVector3f& c,
|
||||
const uchar d);
|
||||
static const bool S3dRemoveEmitter(uint handle);
|
||||
static const bool S3dCheckEmitter(uint handle);
|
||||
static uint S3dEmitterVoiceID(uint handle);
|
||||
|
||||
static void S3dAddListener(const CVector3f& pos, const CVector3f& dir, const CVector3f& vec1,
|
||||
const CVector3f& vec2, const float f1, const float f2, const float f3,
|
||||
const uint w1, const uchar maxVolume);
|
||||
static void S3dUpdateListener(const CVector3f& pos, const CVector3f& dir, const CVector3f& vec1,
|
||||
const CVector3f& vec2, const uchar maxVolume);
|
||||
static void S3dAddListener(const CVector3f& pos, const CVector3f& dir, const CVector3f& heading,
|
||||
const CVector3f& up, const float frontSur, const float backSur,
|
||||
const float soundSpeed, const uint flags, const uchar voiume);
|
||||
static bool S3dRemoveListener();
|
||||
static bool S3dUpdateListener(const CVector3f& pos, const CVector3f& dir,
|
||||
const CVector3f& heading, const CVector3f& up, const uchar voiume);
|
||||
|
||||
static void S3dAddEmitter(SND_FXID fxid, const CVector3f& pos, const CVector3f& dir,
|
||||
const bool b1, const bool b2, short, int);
|
||||
|
||||
static u32 SeqPlayEx(unsigned short, unsigned short, void*, SND_PLAYPARA*, unsigned char);
|
||||
static void SeqStop(u32);
|
||||
static void S3dFlushAllEmitters();
|
||||
static void S3dFlushUnusedEmitters();
|
||||
|
||||
static uint SeqPlayEx(const ushort gid, const ushort sid, void* arrfile, SND_PLAYPARA* para,
|
||||
const uchar studio);
|
||||
static void SeqStop(u32 seqId);
|
||||
static void SeqVolume(u8, u16, u32, u8);
|
||||
|
||||
static bool mInitialized;
|
||||
static bool mIsListenerActive;
|
||||
static bool mVerbose;
|
||||
static uint mUnusedEmitterHandle;
|
||||
static uchar mMaxNumEmitters;
|
||||
static rstl::map< rstl::string, rstl::ncrc_ptr< CAudioGroupSet > >* mpGroupSetDB;
|
||||
static rstl::map< uint, rstl::string >* mpGroupSetResNameDB;
|
||||
static rstl::map< rstl::string, rstl::ncrc_ptr< CTrkData > >* mpDVDTrackDB;
|
||||
static rstl::vector< CEmitterData >* mpEmitterDB;
|
||||
static unkptr mpListener;
|
||||
static SND_LISTENER* mpListener;
|
||||
|
||||
/* TODO: Remaining globals */
|
||||
|
||||
@@ -126,8 +136,10 @@ public:
|
||||
static uint mMaxAramUsage;
|
||||
static uint mCurrentAramUsage;
|
||||
static bool mProLogic2;
|
||||
static ushort mVolumeScale;
|
||||
static ushort mDefaultVolumeScale;
|
||||
static const uchar kMaxVolume;
|
||||
static uchar kEmitterMedPriority;
|
||||
static const uchar kEmitterMedPriority;
|
||||
};
|
||||
|
||||
#endif // _CAUDIOSYS
|
||||
|
||||
@@ -1,34 +1,7 @@
|
||||
#ifndef _CANIMATIONDATABASEGAME
|
||||
#define _CANIMATIONDATABASEGAME
|
||||
|
||||
#include "Kyoto/TToken.hpp"
|
||||
|
||||
#include "rstl/optional_object.hpp"
|
||||
#include "rstl/rc_ptr.hpp"
|
||||
#include "rstl/set.hpp"
|
||||
#include "rstl/string.hpp"
|
||||
#include "rstl/vector.hpp"
|
||||
|
||||
class CPrimitive;
|
||||
class CAnimation;
|
||||
class IMetaAnim;
|
||||
|
||||
class CAnimationDatabase {
|
||||
public:
|
||||
CAnimationDatabase()
|
||||
: x4_(false ? rstl::optional_object< CToken >() : rstl::optional_object_null()) {}
|
||||
|
||||
virtual ~CAnimationDatabase();
|
||||
virtual const rstl::rc_ptr< IMetaAnim >& GetMetaAnim(uint idx) const = 0;
|
||||
virtual uint GetNumMetaAnims() const = 0;
|
||||
virtual rstl::string GetMetaAnimName(uint idx) const = 0;
|
||||
virtual void GetAllUniquePrimitives(rstl::vector< CPrimitive >& primsOut) const = 0;
|
||||
virtual void GetUniquePrimitivesFromMetaAnim(rstl::set< CPrimitive >& primsOut,
|
||||
const rstl::string& name) const = 0;
|
||||
|
||||
private:
|
||||
rstl::optional_object< CToken > x4_;
|
||||
};
|
||||
#include <Kyoto/Animation/CAnimationDatabase.hpp>
|
||||
|
||||
class CAnimationDatabaseGame : public CAnimationDatabase {
|
||||
public:
|
||||
|
||||
@@ -21,6 +21,8 @@ public:
|
||||
typedef typename rep_type::iterator iterator;
|
||||
typedef typename rep_type::const_iterator const_iterator;
|
||||
|
||||
~map() {}
|
||||
|
||||
iterator insert(const value_type& item) { return inner.insert(item); }
|
||||
|
||||
const_iterator begin() const { return inner.begin(); }
|
||||
@@ -31,7 +33,7 @@ public:
|
||||
|
||||
void erase(iterator it) { inner.erase(it); }
|
||||
|
||||
rep_type& get_inner() { return inner; } // hack for CWeaponMgr inlining depth
|
||||
rep_type& get_inner() { return inner; } // hack for CWeaponMgr inlining depth
|
||||
private:
|
||||
rep_type inner;
|
||||
};
|
||||
|
||||
@@ -107,7 +107,7 @@ public:
|
||||
};
|
||||
|
||||
red_black_tree() : x0_(0), x1_(0), x4_count(0) {}
|
||||
~red_black_tree() { clear(); }
|
||||
~red_black_tree() { destroy(); }
|
||||
|
||||
iterator insert_into(node* n, const P& item);
|
||||
iterator insert(const P& item) { return insert_into(x8_header.get_root(), item); }
|
||||
@@ -228,6 +228,8 @@ private:
|
||||
node* rebalance_for_erase(node* n) {
|
||||
return static_cast< node* >(rbtree_rebalance_for_erase(&x8_header, n));
|
||||
}
|
||||
|
||||
void destroy() { clear(); }
|
||||
};
|
||||
|
||||
static bool kUnknownValueNewRoot = true;
|
||||
|
||||
@@ -46,7 +46,7 @@ public:
|
||||
vector(const Alloc& alloc = Alloc())
|
||||
: x0_allocator(alloc), x4_count(0), x8_capacity(0), xc_items(nullptr) {}
|
||||
vector(int count) : x4_count(0), x8_capacity(0), xc_items(0) { reserve(count); }
|
||||
vector(int count, const T& v) : x4_count(count), x8_capacity(count) {
|
||||
vector(const int count, const T& v) : x4_count(count), x8_capacity(count) {
|
||||
x0_allocator.allocate(xc_items, x4_count);
|
||||
uninitialized_fill_n(xc_items, count, v);
|
||||
}
|
||||
|
||||
@@ -1 +1,6 @@
|
||||
#include "Kyoto/Animation/CAnimationManager.hpp"
|
||||
|
||||
rstl::rc_ptr< CAnimTreeNode >
|
||||
CAnimationManager::GetAnimationTree(uint a, const CMetaAnimTreeBuildOrders& orders) const {
|
||||
// return x0_animDB.NonConstCopy()->GetAnimationTree(x8_sysCtx, orders);
|
||||
}
|
||||
|
||||
@@ -6,8 +6,11 @@
|
||||
#include "dolphin/dtk.h"
|
||||
#include "dolphin/os.h"
|
||||
|
||||
#include "dolphin/types.h"
|
||||
#include "musyx/musyx.h"
|
||||
|
||||
#include <rstl/math.hpp>
|
||||
|
||||
bool CAudioSys::mInitialized = false;
|
||||
bool CAudioSys::mIsListenerActive = false;
|
||||
bool CAudioSys::mVerbose = false;
|
||||
@@ -16,9 +19,11 @@ rstl::map< rstl::string, rstl::ncrc_ptr< CAudioGroupSet > >* CAudioSys::mpGroupS
|
||||
rstl::map< uint, rstl::string >* CAudioSys::mpGroupSetResNameDB = nullptr;
|
||||
rstl::map< rstl::string, rstl::ncrc_ptr< CAudioSys::CTrkData > >* CAudioSys::mpDVDTrackDB = nullptr;
|
||||
|
||||
uchar CAudioSys::kEmitterMedPriority = 0x7f;
|
||||
const uchar CAudioSys::kEmitterMedPriority = 0x7f;
|
||||
const uchar CAudioSys::kMaxVolume = 0x7f;
|
||||
bool CAudioSys::mProLogic2 = true;
|
||||
ushort CAudioSys::mVolumeScale = 0x7f;
|
||||
ushort CAudioSys::mDefaultVolumeScale = 0x7f;
|
||||
|
||||
const rstl::string CAudioSys::mpDefaultInvalidString(rstl::string_l("NULL"));
|
||||
|
||||
@@ -28,11 +33,11 @@ void DoFree(void* ptr) {
|
||||
if (!ptr) {
|
||||
return;
|
||||
}
|
||||
delete[] ptr;
|
||||
delete[] reinterpret_cast< char* >(ptr);
|
||||
}
|
||||
|
||||
CAudioSys::CAudioSys(char numVoices, char numMusic, char numSfx, char maxNumEmitters,
|
||||
uint aramSize) {
|
||||
CAudioSys::CAudioSys(const uchar numVoices, const uchar numMusic, const uchar numSfx,
|
||||
const uchar maxNumEmitters, const uint aramSize) {
|
||||
mInitialized = true;
|
||||
SND_HOOKS hooks = {DoMalloc, DoFree};
|
||||
AIInit(NULL);
|
||||
@@ -48,7 +53,7 @@ CAudioSys::CAudioSys(char numVoices, char numMusic, char numSfx, char maxNumEmit
|
||||
mpGroupSetResNameDB = rs_new rstl::map< uint, rstl::string >();
|
||||
mpDVDTrackDB = rs_new rstl::map< rstl::string, rstl::ncrc_ptr< CTrkData > >();
|
||||
mpEmitterDB = rs_new rstl::vector< CEmitterData >(maxNumEmitters, CEmitterData());
|
||||
mpListener = rs_new u8[0x90]; // TODO: Add actual listener allocation
|
||||
mpListener = rs_new SND_LISTENER;
|
||||
mIsListenerActive = false;
|
||||
mMaxNumEmitters = maxNumEmitters;
|
||||
|
||||
@@ -62,3 +67,283 @@ CAudioSys::CAudioSys(char numVoices, char numMusic, char numSfx, char maxNumEmit
|
||||
|
||||
mMaxAramUsage = aramSize;
|
||||
}
|
||||
|
||||
CAudioSys::~CAudioSys() {
|
||||
S3dFlushAllEmitters();
|
||||
S3dRemoveListener();
|
||||
sndQuit();
|
||||
if (mpGroupSetDB) {
|
||||
delete mpGroupSetDB;
|
||||
}
|
||||
mpGroupSetDB = nullptr;
|
||||
if (mpGroupSetResNameDB) {
|
||||
delete mpGroupSetResNameDB;
|
||||
}
|
||||
mpGroupSetResNameDB = nullptr;
|
||||
if (mpDVDTrackDB) {
|
||||
delete mpDVDTrackDB;
|
||||
}
|
||||
mpDVDTrackDB = nullptr;
|
||||
|
||||
delete mpEmitterDB;
|
||||
mpEmitterDB = nullptr;
|
||||
delete mpListener;
|
||||
mpListener = nullptr;
|
||||
mInitialized = false;
|
||||
}
|
||||
|
||||
void CAudioSys::SysSetVolume(const uchar volume, const ushort time, const uchar group) {
|
||||
sndVolume(volume, time, group);
|
||||
}
|
||||
|
||||
void CAudioSys::SysSetSfxVolume(const uchar volume, const ushort time, const uchar music,
|
||||
const uchar fx) {
|
||||
sndMasterVolume(volume, time, music, fx);
|
||||
}
|
||||
|
||||
void CAudioSys::S3dAddListener(const CVector3f& pos, const CVector3f& dir, const CVector3f& heading,
|
||||
const CVector3f& up, const float frontSur, const float backSur,
|
||||
const float soundSpeed, const uint flags, const uchar voiume) {
|
||||
if (mIsListenerActive) {
|
||||
S3dRemoveListener();
|
||||
}
|
||||
|
||||
SND_FVECTOR _pos;
|
||||
_pos.x = pos.GetX();
|
||||
_pos.y = pos.GetY();
|
||||
_pos.z = pos.GetZ();
|
||||
SND_FVECTOR _dir;
|
||||
_dir.x = dir.GetX();
|
||||
_dir.y = dir.GetY();
|
||||
_dir.z = dir.GetZ();
|
||||
SND_FVECTOR _heading;
|
||||
_heading.x = heading.GetX();
|
||||
_heading.y = heading.GetY();
|
||||
_heading.z = heading.GetZ();
|
||||
SND_FVECTOR _up;
|
||||
_up.x = up.GetX();
|
||||
_up.y = up.GetY();
|
||||
_up.z = up.GetZ();
|
||||
mIsListenerActive = true;
|
||||
sndAddListener(mpListener, &_pos, &_dir, &_heading, &_up, frontSur, backSur, soundSpeed, flags,
|
||||
voiume, nullptr);
|
||||
}
|
||||
|
||||
bool CAudioSys::S3dUpdateListener(const CVector3f& pos, const CVector3f& dir,
|
||||
const CVector3f& heading, const CVector3f& up,
|
||||
const uchar volume) {
|
||||
if (mIsListenerActive) {
|
||||
SND_FVECTOR _pos;
|
||||
_pos.x = pos.GetX();
|
||||
_pos.y = pos.GetY();
|
||||
_pos.z = pos.GetZ();
|
||||
SND_FVECTOR _dir;
|
||||
_dir.x = dir.GetX();
|
||||
_dir.y = dir.GetY();
|
||||
_dir.z = dir.GetZ();
|
||||
SND_FVECTOR _heading;
|
||||
_heading.x = heading.GetX();
|
||||
_heading.y = heading.GetY();
|
||||
_heading.z = heading.GetZ();
|
||||
SND_FVECTOR _up;
|
||||
_up.x = up.GetX();
|
||||
_up.y = up.GetY();
|
||||
_up.z = up.GetZ();
|
||||
return sndUpdateListener(mpListener, &_pos, &_dir, &_heading, &_up, volume, nullptr);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CAudioSys::S3dRemoveListener() {
|
||||
if (mIsListenerActive) {
|
||||
mIsListenerActive = false;
|
||||
return sndRemoveListener(mpListener);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
uint CAudioSys::S3dAddEmitterParaEx(const C3DEmitterParmData& params, ushort groupId,
|
||||
SND_PARAMETER_INFO* paraInfo) {
|
||||
|
||||
uint handle = mUnusedEmitterHandle;
|
||||
if (handle == -1) {
|
||||
handle = S3dFindLowerPriorityHandle(params.x29_prio);
|
||||
if (handle == -1) {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
SND_FVECTOR _pos;
|
||||
_pos.x = params.x0_pos.GetX();
|
||||
_pos.y = params.x0_pos.GetY();
|
||||
_pos.z = params.x0_pos.GetZ();
|
||||
SND_FVECTOR _dir;
|
||||
_dir.x = params.xc_dir.GetX();
|
||||
_dir.y = params.xc_dir.GetY();
|
||||
_dir.z = params.xc_dir.GetZ();
|
||||
|
||||
CEmitterData& data = (*mpEmitterDB)[handle];
|
||||
sndAddEmitterParaEx(&data.x0_emitter, &_pos, &_dir, params.x18_maxDist, params.x1c_distComp,
|
||||
params.x20_flags, params.x24_sfxId, groupId, 0, 0, nullptr, paraInfo);
|
||||
data._50 = true;
|
||||
data._51 = params.x28_important;
|
||||
data._52 = params.x29_prio;
|
||||
mUnusedEmitterHandle = S3dFindUnusedHandle();
|
||||
return handle;
|
||||
}
|
||||
|
||||
const bool CAudioSys::S3dUpdateEmitter(const uint handle, const CVector3f& pos,
|
||||
const CVector3f& dir, const uchar maxVol) {
|
||||
if (handle == -1) {
|
||||
return false;
|
||||
}
|
||||
|
||||
CEmitterData& data = (*mpEmitterDB)[handle];
|
||||
|
||||
SND_FVECTOR _pos;
|
||||
_pos.x = pos.GetX();
|
||||
_pos.y = pos.GetY();
|
||||
_pos.z = pos.GetZ();
|
||||
SND_FVECTOR _dir;
|
||||
_dir.x = dir.GetX();
|
||||
_dir.y = dir.GetY();
|
||||
_dir.z = dir.GetZ();
|
||||
return sndUpdateEmitter(&data.x0_emitter, &_pos, &_dir, maxVol, nullptr);
|
||||
}
|
||||
const bool CAudioSys::S3dRemoveEmitter(uint handle) {
|
||||
if (handle == -1) {
|
||||
return false;
|
||||
}
|
||||
|
||||
CEmitterData& data = (*mpEmitterDB)[handle];
|
||||
if (data._50) {
|
||||
data._50 = false;
|
||||
mUnusedEmitterHandle = handle;
|
||||
return sndRemoveEmitter(&data.x0_emitter);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void CAudioSys::S3dFlushAllEmitters() {
|
||||
rstl::vector< CEmitterData >::iterator iter = mpEmitterDB->begin();
|
||||
for (; iter != mpEmitterDB->end(); ++iter) {
|
||||
if (!iter->_50) {
|
||||
continue;
|
||||
}
|
||||
|
||||
iter->_50 = false;
|
||||
sndRemoveEmitter(&iter->x0_emitter);
|
||||
}
|
||||
mUnusedEmitterHandle = 0;
|
||||
}
|
||||
|
||||
void CAudioSys::S3dFlushUnusedEmitters() {
|
||||
rstl::vector< CEmitterData >::iterator iter = mpEmitterDB->begin();
|
||||
for (; iter != mpEmitterDB->end(); ++iter) {
|
||||
if (!iter->_50 || sndCheckEmitter(&iter->x0_emitter) || iter->_51) {
|
||||
continue;
|
||||
}
|
||||
|
||||
iter->_50 = false;
|
||||
sndRemoveEmitter(&iter->x0_emitter);
|
||||
}
|
||||
}
|
||||
|
||||
const bool CAudioSys::S3dCheckEmitter(const uint handle) {
|
||||
if (handle == -1) {
|
||||
return false;
|
||||
}
|
||||
|
||||
CEmitterData& data = (*mpEmitterDB)[handle];
|
||||
if (data._50) {
|
||||
return sndCheckEmitter(&data.x0_emitter);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
uint CAudioSys::S3dEmitterVoiceID(const uint handle) {
|
||||
if (handle == -1) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
CEmitterData& data = (*mpEmitterDB)[handle];
|
||||
if (data._50) {
|
||||
return sndEmitterVoiceID(&data.x0_emitter);
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
uint CAudioSys::S3dFindUnusedHandle() {
|
||||
int i = 0;
|
||||
do {
|
||||
if (!(*mpEmitterDB)[i]._50) {
|
||||
break;
|
||||
}
|
||||
++i;
|
||||
} while (i < mMaxNumEmitters);
|
||||
|
||||
if (i < mMaxNumEmitters) {
|
||||
return i;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
uint CAudioSys::S3dFindLowerPriorityHandle(const uint prio) {
|
||||
int max = mMaxNumEmitters;
|
||||
int i = 0;
|
||||
do {
|
||||
CEmitterData& data = (*mpEmitterDB)[i];
|
||||
if (!data._50) {
|
||||
break;
|
||||
}
|
||||
|
||||
if (data._52 <= prio && !data._51) {
|
||||
S3dRemoveEmitter(i);
|
||||
break;
|
||||
}
|
||||
++i;
|
||||
} while (i < max);
|
||||
return i < max ? i : -1;
|
||||
}
|
||||
|
||||
uint CAudioSys::SeqPlayEx(const ushort gid, const ushort sid, void* arrfile, SND_PLAYPARA* para,
|
||||
const uchar studio) {
|
||||
return sndSeqPlayEx(gid, sid, arrfile, para, studio);
|
||||
}
|
||||
|
||||
void CAudioSys::SeqStop(u32 seqId) { sndSeqStop(seqId); }
|
||||
|
||||
void CAudioSys::SeqVolume(const u8 volume, const u16 time, const u32 seqId, const u8 mode) {
|
||||
sndSeqVolume(volume, time, seqId, mode);
|
||||
}
|
||||
|
||||
void CAudioSys::SetStereoMode(const bool mode) {
|
||||
if (mode) {
|
||||
sndOutputMode(SND_OUTPUTMODE_STEREO);
|
||||
OSSetSoundMode(OS_SOUND_MODE_STEREO);
|
||||
} else {
|
||||
sndOutputMode(SND_OUTPUTMODE_MONO);
|
||||
OSSetSoundMode(OS_SOUND_MODE_MONO);
|
||||
}
|
||||
}
|
||||
|
||||
void CAudioSys::SetSurroundMode(const ESurroundModes mode) {
|
||||
switch (mode) {
|
||||
case kSM_Mono:
|
||||
SetStereoMode(false);
|
||||
break;
|
||||
case kSM_Stereo:
|
||||
SetStereoMode(true);
|
||||
break;
|
||||
case kSM_Surround:
|
||||
SetStereoMode(true);
|
||||
sndOutputMode(SND_OUTPUTMODE_SURROUND);
|
||||
break;
|
||||
}
|
||||
|
||||
mSurroundMode = mode;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user