CAudioSys progress

This commit is contained in:
Phillip Stephens
2026-01-05 18:21:29 -08:00
parent 9625a8619d
commit 2854f9295a
10 changed files with 362 additions and 78 deletions
+18 -18
View File
@@ -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
+1 -1
View File
@@ -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
+10 -5
View File
@@ -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
+30 -18
View File
@@ -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:
+3 -1
View File
@@ -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;
};
+3 -1
View File
@@ -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;
+1 -1
View File
@@ -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);
}
+290 -5
View File
@@ -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;
}