A bit of dSndSmallEffectMgr_c

This commit is contained in:
robojumper
2025-06-06 14:43:21 +02:00
parent ed0f2fed88
commit 03e518622a
13 changed files with 316 additions and 44 deletions
+12 -1
View File
@@ -2419,9 +2419,20 @@ d/snd/d_snd_control_player.cpp:
d/snd/d_snd_bgm_mgr.cpp:
.text start:0x8036C6B0 end:0x803739CC align:16
.sbss start:0x80575D80 end:0x80575D88
.sdata2 start:0x8057D940 end:0x8057D970
d/snd/d_snd_bgm_sound_callbacks.cpp:
.text start:0x803739D0 end:0x80378ECC align:16
.sdata2 start:0x8057D970 end:0x8057DA50
d/snd/d_snd_bgm_sound_boss_callbacks.cpp:
.text start:0x80378ED0 end:0x80379D20 align:16
.sdata2 start:0x8057DA50 end:0x8057DA58
d/snd/d_snd_bgm_sound.cpp:
.text start:0x803739D0 end:0x8037BA68 align:16
.text start:0x80379D20 end:0x8037BA68 align:16
.sbss start:0x80575D88 end:0x80575D90
d/snd/d_snd_unk_15.cpp:
.text start:0x8037BA70 end:0x8037D800 align:16
+12 -12
View File
@@ -20843,9 +20843,9 @@ fn_8037DC50 = .text:0x8037DC50; // type:function size:0x70
fn_8037DCC0 = .text:0x8037DCC0; // type:function size:0x48
fn_8037DD10 = .text:0x8037DD10; // type:function size:0x1BC
playSound__20dSndSmallEffectMgr_cFUl = .text:0x8037DED0; // type:function size:0x2D0
fn_8037E1A0 = .text:0x8037E1A0; // type:function size:0x90
playSoundWithPan__20dSndSmallEffectMgr_cFUlf = .text:0x8037E1A0; // type:function size:0x90
fn_8037E230 = .text:0x8037E230; // type:function size:0xEC
fn_8037E320 = .text:0x8037E320; // type:function size:0x78
playSoundInternal__20dSndSmallEffectMgr_cFUl = .text:0x8037E320; // type:function size:0x78
fn_8037E3A0 = .text:0x8037E3A0; // type:function size:0x158
fn_8037E500 = .text:0x8037E500; // type:function size:0x58
playSoundWithPitch__20dSndSmallEffectMgr_cFUlf = .text:0x8037E560; // type:function size:0xBC
@@ -20867,14 +20867,14 @@ fn_8037EC30 = .text:0x8037EC30; // type:function size:0x8
fn_8037EC40 = .text:0x8037EC40; // type:function size:0x3C
fn_8037EC80 = .text:0x8037EC80; // type:function size:0xB0
fn_8037ED30 = .text:0x8037ED30; // type:function size:0x68
fn_8037EDA0 = .text:0x8037EDA0; // type:function size:0xA0
fn_8037EE40 = .text:0x8037EE40; // type:function size:0x3C
fn_8037EE80 = .text:0x8037EE80; // type:function size:0x64
playSound = .text:0x8037EEF0; // type:function size:0xAC
fn_8037EFA0 = .text:0x8037EFA0; // type:function size:0x80
stopSounds__20dSndSmallEffectMgr_cFUlUll = .text:0x8037EDA0; // type:function size:0xA0
__cl__12SoundStopperFRQ34nw4r3snd11SoundHandle = .text:0x8037EE40; // type:function size:0x3C
stopSounds__20dSndSmallEffectMgr_cFUll = .text:0x8037EE80; // type:function size:0x64
isPlayingSound__20dSndSmallEffectMgr_cFUlUl = .text:0x8037EEF0; // type:function size:0xAC
isPlayingSound__20dSndSmallEffectMgr_cFUl = .text:0x8037EFA0; // type:function size:0x80
playButtonPressSoundWhenAdvancingTextBoxes__20dSndSmallEffectMgr_cFf = .text:0x8037F020; // type:function size:0xB4
fn_8037F0E0 = .text:0x8037F0E0; // type:function size:0xC
fn_8037F0F0 = .text:0x8037F0F0; // type:function size:0x60
resetButtonPressSound__20dSndSmallEffectMgr_cFv = .text:0x8037F0E0; // type:function size:0xC
setButtonPressSound__20dSndSmallEffectMgr_cFP14dSoundSource_c = .text:0x8037F0F0; // type:function size:0x60
fn_8037F150 = .text:0x8037F150; // type:function size:0x6D0
d_s_vt_0x17C__14dSoundSource_cFv = .text:0x8037F820; // type:function size:0x8
vt_0x18__14dSoundSource_cFv = .text:0x8037F830; // type:function size:0x8
@@ -21225,7 +21225,7 @@ vt_0xFC__14dSoundSource_cFv = .text:0x8038BD40; // type:function size:0x20
vt_0x110__14dSoundSource_cFv = .text:0x8038BD60; // type:function size:0xC
d_s_vt_0x1E4__14dSoundSource_cFv = .text:0x8038BD70; // type:function size:0x4
fn_8038BD80 = .text:0x8038BD80; // type:function size:0xB8
fn_8038BE40 = .text:0x8038BE40; // type:function size:0xC4
getCharacterTalkSoundId__14dSoundSource_cFUlP14dSoundSource_c = .text:0x8038BE40; // type:function size:0xC4
fn_8038BF10 = .text:0x8038BF10; // type:function size:0x104
d_s_vt_0x1E8__14dSoundSource_cFv = .text:0x8038C020; // type:function size:0x8
getRemoConSoundVariant__14dSoundSource_cCFUl = .text:0x8038C030; // type:function size:0x58
@@ -37732,7 +37732,7 @@ lbl_80549178 = .data:0x80549178; // type:object size:0x10
lbl_80549188 = .data:0x80549188; // type:object size:0x10
lbl_80549198 = .data:0x80549198; // type:object size:0x10
lbl_805491A8 = .data:0x805491A8; // type:object size:0x10
lbl_805491B8 = .data:0x805491B8; // type:object size:0xC
__vt__12SoundStopper = .data:0x805491B8; // type:object size:0xC
__vt__38SndMgrDisposer<20dSndSmallEffectMgr_c> = .data:0x805491C4; // type:object size:0xC
lbl_805491D0 = .data:0x805491D0; // type:object size:0x10
jumptable_805491E0 = .data:0x805491E0; // type:object size:0x20 scope:local
@@ -49197,7 +49197,7 @@ lbl_8057E5BC = .sdata2:0x8057E5BC; // type:object size:0x4 align:4 data:float
lbl_8057E5C0 = .sdata2:0x8057E5C0; // type:object size:0x4 data:4byte
lbl_8057E5C4 = .sdata2:0x8057E5C4; // type:object size:0x4 align:4 data:float
sNumPlayers__22dSndControlPlayerMgr_c = .sdata2:0x8057E5C8; // type:object size:0x4 data:4byte
lbl_8057E5CC = .sdata2:0x8057E5CC; // type:object size:0x4 data:4byte
sPlayerMax__22dSndControlPlayerMgr_c = .sdata2:0x8057E5CC; // type:object size:0x4 data:4byte
sEventMuteFlagsMask__15dSndPlayerMgr_c = .sdata2:0x8057E5D0; // type:object size:0x8 data:4byte
lbl_8057E5D8 = .sdata2:0x8057E5D8; // type:object size:0x4 align:4 data:float
lbl_8057E5DC = .sdata2:0x8057E5DC; // type:object size:0x4 align:4 data:float
+6 -4
View File
@@ -700,8 +700,6 @@ config.libs = [
"progress_category": "game",
"host": False,
"objects": [
# These are very low quality splits since nobody has figured
# out enough detail. Need to look into nw4r::snd first
Object(NonMatching, "d/snd/d_snd_mgr.cpp"),
Object(Matching, "d/snd/d_snd_actor.cpp"),
Object(NonMatching, "d/snd/d_snd_3d_actor.cpp"),
@@ -710,14 +708,18 @@ config.libs = [
Object(NonMatching, "d/snd/d_snd_player_mgr.cpp"),
Object(NonMatching, "d/snd/d_snd_control_player_mgr.cpp"),
Object(Matching, "d/snd/d_snd_3d_manager.cpp"),
# this one is a bit weird. it deals with all the stage definitions,
# but it's not actually the bgm manager?
Object(NonMatching, "d/snd/d_snd_stage_mgr.cpp"),
Object(NonMatching, "d/snd/d_snd_bgm_mgr.cpp"),
Object(NonMatching, "d/snd/d_snd_bgm_sound.cpp"),
Object(NonMatching, "d/snd/d_snd_unk_component_2.cpp"),
Object(NonMatching, "d/snd/d_snd_area_sound_effect_mgr.cpp"),
Object(NonMatching, "d/snd/d_snd_area_sound.cpp"),
Object(Matching, "d/snd/d_snd_control_sound.cpp"),
Object(Matching, "d/snd/d_snd_control_player.cpp"),
Object(NonMatching, "d/snd/d_snd_bgm_mgr.cpp"),
Object(NonMatching, "d/snd/d_snd_bgm_sound_callbacks.cpp"),
Object(NonMatching, "d/snd/d_snd_bgm_sound_boss_callbacks.cpp"),
Object(NonMatching, "d/snd/d_snd_bgm_sound.cpp"),
Object(NonMatching, "d/snd/d_snd_unk_15.cpp"),
Object(NonMatching, "d/snd/d_snd_small_effect_mgr.cpp"),
Object(NonMatching, "d/snd/d_snd_harp_mgr.cpp"),
-18
View File
@@ -4,7 +4,6 @@
#include "common.h"
#include "nw4r/math/math_types.h"
#include "nw4r/snd/snd_Sound3DActor.h"
#include "nw4r/snd/snd_SoundHandle.h"
class dSnd3DActor_c : public nw4r::snd::Sound3DActor {
static const u32 NUM_SOUNDS = 4;
@@ -90,21 +89,4 @@ protected:
/* 0xE0 */ f32 a_field_0xE0;
};
// used at the very least when trying to finish Demise
class IsCurrentSoundIdChecker {
public:
IsCurrentSoundIdChecker(u32 id, bool *pResult) : mSoundId(id), mpResult(pResult) {}
~IsCurrentSoundIdChecker() {}
virtual void operator()(nw4r::snd::SoundHandle &pHandle) {
if (mSoundId == pHandle.GetId()) {
*mpResult = true;
}
}
private:
/* 0x04 */ u32 mSoundId;
/* 0x08 */ bool *mpResult;
};
#endif
+34
View File
@@ -70,4 +70,38 @@ private:
/* 0x24 */ u32 *mpCounter4;
};
// used at the very least when trying to finish Demise
class IsCurrentSoundIdChecker {
public:
IsCurrentSoundIdChecker(u32 id, bool *pResult) : mSoundId(id), mpResult(pResult) {}
~IsCurrentSoundIdChecker() {}
virtual void operator()(nw4r::snd::SoundHandle &pHandle) {
if (mSoundId == pHandle.GetId()) {
*mpResult = true;
}
}
private:
/* 0x04 */ u32 mSoundId;
/* 0x08 */ bool *mpResult;
};
class SoundStopper {
public:
SoundStopper(u32 id, s32 fadeFrames) : mSoundId(id), mFadeFrames(fadeFrames) {}
~SoundStopper() {}
virtual void operator()(nw4r::snd::SoundHandle &pHandle) {
if (mSoundId == pHandle.GetId()) {
pHandle.Stop(mFadeFrames);
}
}
private:
/* 0x04 */ u32 mSoundId;
/* 0x08 */ s32 mFadeFrames;
};
#endif
+1
View File
@@ -25,6 +25,7 @@ public:
void calc();
static const s32 sNumPlayers;
static const s32 sPlayerMax;
nw4r::snd::SoundPlayer *getPlayer1(u32) const;
nw4r::snd::SoundPlayer *getPlayer2(u32) const;
+31 -6
View File
@@ -1,6 +1,7 @@
#ifndef D_SND_SMALL_EFFECT_MGR_H
#define D_SND_SMALL_EFFECT_MGR_H
#include "d/snd/d_snd_source.h"
#include "d/snd/d_snd_util.h"
#include "d/snd/d_snd_wzsound.h" // IWYU pragma: export
#include "nw4r/snd/snd_SoundHandle.h"
@@ -17,15 +18,39 @@ class dSndSmallEffectMgr_c {
public:
dSndSmallEffectMgr_c();
void playSound(u32 soundId);
bool playSound(u32 soundId);
bool playSoundWithPan(u32 soundId, f32 pan);
void playSoundWithPitch(u32 soundId, f32 pitch);
void playButtonPressSoundWhenAdvancingTextBoxes(f32);
bool playButtonPressSoundWhenAdvancingTextBoxes(f32);
void resetButtonPressSound();
void setButtonPressSound(dSoundSource_c *source);
private:
/* 0x10 */ void *field_0x10;
/* 0x14 */ void *field_0x14;
/* 0x18 */ void *field_0x18;
/* 0x1C */ nw4r::snd::SoundHandle mHandles[3];
bool playSoundInternal(u32 soundId);
void stopSounds(u32 playerIdx, u32 soundId, s32 fadeFrames);
void stopSounds(u32 soundId, s32 fadeFrames);
bool isPlayingSound(u32 playerIdx, u32 soundId);
bool isPlayingSound(u32 soundId);
/* 0x10 */ nw4r::snd::SoundHandle mHandle1;
// used for most sounds
/* 0x14 */ nw4r::snd::SoundHandle mNormalSound;
/* 0x18 */ nw4r::snd::SoundHandle mHandle3;
// apparently used for shield gauge sounds, but maybe not given
// that the callers appear unreachable
/* 0x1C */ nw4r::snd::SoundHandle mShieldGaugeHandles[3];
/* 0x28 */ s32 field_0x28;
/* 0x2C */ s32 field_0x2C;
/* 0x30 */ s32 field_0x30;
/* 0x34 */ s32 field_0x34;
/* 0x38 */ u32 mTextboxAdvanceSound;
/* 0x3C */ nw4r::snd::SoundHandle mHandle4;
/* 0x40 */ u16 field_0x40;
/* 0x42 */ u16 field_0x42;
/* 0x44 */ s32 field_0x44;
};
#endif
+2 -1
View File
@@ -12,12 +12,13 @@ public:
dSoundSource_c(u8, dAcBase_c *, UNKWORD, UNKWORD);
virtual ~dSoundSource_c();
static u32 getCharacterTalkSoundId(u32 baseSoundId, dSoundSource_c* source);
u32 getRemoConSoundVariant(u32 soundId) const;
// This is where it gets a bit wild and this class starts mixing in overrides between
// new virtual functions, which causes the vtable to list these functions in exactly this
// order.
virtual void d_s_vt_0x17C();
virtual const char *d_s_vt_0x17C() const;
virtual void d_s_vt_0x180();
virtual void d_s_vt_0x184();
virtual void d_s_vt_0x188();
+5
View File
@@ -60,6 +60,11 @@ namespace nw4r { namespace snd
mSound->Pause(flag, fadeFrames);
}
void SetPan(f32 pan) {
if (IsAttachedSound())
mSound->SetPan(pan);
}
bool IsPause() const {
return IsAttachedSound() && mSound->IsPause();
}
+3
View File
@@ -26,9 +26,12 @@ extern "C" void fn_80365D20(void *);
extern "C" void fn_803624F0(void *);
extern "C" void fn_80364FD0(void *, s32);
extern "C" bool fn_80364DA0(void *);
extern "C" void fn_80365020(void *);
extern "C" void fn_80364D00(void *, s32);
// ENEMY_BGM_RELATED_MGR -> dSndSourceMgr_c
// 0x3870 = player sound source
// 0x3874 = Fi
extern "C" void *ENEMY_BGM_RELATED_MGR;
extern "C" void fn_80384570(void *, bool);
extern "C" void fn_803858D0(void *);
+1
View File
@@ -3,6 +3,7 @@
#include "common.h"
#include "d/a/d_a_player.h"
#include "d/snd/d_snd_3d_manager.h"
#include "d/snd/d_snd_checkers.h"
#include "d/snd/d_snd_player_mgr.h"
#include "nw4r/math/math_types.h"
+187 -2
View File
@@ -1,8 +1,193 @@
#include "d/snd/d_snd_small_effect_mgr.h"
#include "common.h"
#include "d/snd/d_snd_checkers.h"
#include "d/snd/d_snd_control_player_mgr.h"
#include "d/snd/d_snd_player_mgr.h"
#include "d/snd/d_snd_source.h"
#include "d/snd/d_snd_source_if.h"
#include "d/snd/d_snd_util.h"
#include "d/snd/d_snd_wzsound.h"
#include "nw4r/snd/snd_SeqSoundHandle.h"
#include "rvl/OS/OSFastCast.h"
#include "toBeSorted/music_mgrs.h"
SND_DISPOSER_DEFINE(dSndSmallEffectMgr_c)
dSndSmallEffectMgr_c::dSndSmallEffectMgr_c() {}
dSndSmallEffectMgr_c::dSndSmallEffectMgr_c() : mTextboxAdvanceSound(-1), field_0x40(0), field_0x42(0), field_0x44(0) {
// probably arrays
field_0x28 = -1;
field_0x30 = 0;
field_0x2C = -1;
field_0x34 = 0;
}
bool dSndSmallEffectMgr_c::playSound(u32 soundId) {
if (soundId >= SE_S_BUTTON_CALL_L && soundId <= SE_S_PLAY_GUIDE_BUTTON_BLINK) {
soundId = SE_S_BUTTON_CALL_L;
} else if (soundId >= SE_S_BUTTON_CALL_R && soundId <= SE_S_2_BUTTON_BLINK) {
soundId = SE_S_BUTTON_CALL_R;
} else {
switch (soundId) {
case SE_S_BOSS_KEY_TRANS: {
stopSounds(dSndPlayerMgr_c::PLAYER_SMALL_NORMAL, SE_S_BOSS_KEY_TRANS_OFF, 5);
break;
}
case SE_S_BOSS_KEY_TRANS_OFF: {
stopSounds(dSndPlayerMgr_c::PLAYER_SMALL_NORMAL, SE_S_BOSS_KEY_TRANS, 5);
break;
}
case SE_S_HP_GAUGE_UP: {
if (isPlayingSound(dSndPlayerMgr_c::PLAYER_SMALL_NORMAL, SE_S_HEART_PIECE_GET)) {
return false;
}
break;
}
case SE_S_HEART_PIECE_GET: {
if (isPlayingSound(dSndPlayerMgr_c::PLAYER_SMALL_NORMAL, SE_S_HP_GAUGE_UP)) {
return false;
}
break;
}
case SE_S_MAP_OPEN:
case SE_S_MENU_IN: {
stopSounds(dSndPlayerMgr_c::PLAYER_SMALL_NORMAL, SE_S_HELP_OUT, 1);
break;
}
case SE_S_HELP_OUT: {
if (isPlayingSound(dSndPlayerMgr_c::PLAYER_SMALL_NORMAL, SE_S_MENU_IN) ||
isPlayingSound(dSndPlayerMgr_c::PLAYER_SMALL_NORMAL, SE_S_MAP_OPEN)) {
return false;
}
break;
}
case SE_S_MENU_SELECT_TURN_PAGE_LEFT: {
if (isPlayingSound(dSndPlayerMgr_c::PLAYER_SMALL_NORMAL, SE_S_SHOP_STK_STOCK_SELECT_TURN_PAGE_LEFT)) {
return 0;
}
break;
}
case SE_S_MENU_SELECT_TURN_PAGE_RIGHT: {
if (isPlayingSound(dSndPlayerMgr_c::PLAYER_SMALL_NORMAL, SE_S_SHOP_STK_STOCK_SELECT_TURN_PAGE_RIGHT)) {
return 0;
}
break;
}
case SE_S_ITEM_SELECT_START: {
if (isPlayingSound(dSndPlayerMgr_c::PLAYER_SMALL_NORMAL, SE_S_BM_KEEP_ERROR)) {
soundId = SE_S_ITEM_SELECT_START_WAIT;
}
break;
}
case SE_S_SKIP: {
if (fn_80364DA0(ENEMY_SOUND_MGR)) {
fn_80365020(ENEMY_SOUND_MGR);
}
break;
}
case SE_S_WINDOW_PRESS_A: {
if (isPlayingSound(dSndPlayerMgr_c::PLAYER_SMALL_IMPORTANT, SE_S_POINTER_OK)) {
return 0;
}
break;
}
case SE_S_MENU_P1_HOLD_POINTER: {
stopSounds(dSndPlayerMgr_c::PLAYER_SMALL_NORMAL, SE_S_MENU_P1_POINT_ITEM, 0);
break;
}
case SE_S_MENU_P1_POINT_ITEM: {
if (isPlayingSound(dSndPlayerMgr_c::PLAYER_SMALL_NORMAL, SE_S_MENU_P1_HOLD_POINTER)) {
return 0;
}
break;
}
case SE_S_FIRST_PERSON_ON:
case SE_S_FIRST_PERSON_OFF: {
if (!isPlayingSound(dSndPlayerMgr_c::PLAYER_SMALL_NORMAL, SE_S_DOWSING_SELECT_START)) {
playSound(SE_S_DOWSING_SELECT_START);
}
break;
}
case 0x13EF:
if (isPlayingSound(dSndPlayerMgr_c::PLAYER_SMALL_NORMAL, SE_S_FIRST_PERSON_ON)) {
return 0;
}
break;
}
}
return playSoundInternal(soundId);
}
bool dSndSmallEffectMgr_c::playSoundWithPan(u32 soundId, f32 pan) {
bool ok = playSoundInternal(soundId);
if (ok) {
if (pan > 1.0f) {
pan = 1.0f;
} else if (pan < -1.0f) {
pan = -1.0f;
}
mNormalSound.SetPan(pan);
}
return ok;
}
void dSndSmallEffectMgr_c::stopSounds(u32 playerIdx, u32 soundId, s32 fadeFrames) {
SoundStopper stopper(soundId, fadeFrames);
dSndControlPlayerMgr_c::GetInstance()->getPlayer1(playerIdx)->ForEachSound(stopper, false);
}
void dSndSmallEffectMgr_c::stopSounds(u32 soundId, s32 fadeFrames) {
for (s32 playerId = dSndPlayerMgr_c::PLAYER_SMALL_IMPORTANT; playerId <= dSndControlPlayerMgr_c::sPlayerMax;
playerId++) {
stopSounds(playerId, soundId, fadeFrames);
}
}
bool dSndSmallEffectMgr_c::isPlayingSound(u32 playerIdx, u32 soundId) {
bool isPlaying = false;
IsCurrentSoundIdChecker check(soundId, &isPlaying);
dSndControlPlayerMgr_c::GetInstance()->getPlayer1(playerIdx)->ForEachSound(check, false);
return isPlaying;
}
bool dSndSmallEffectMgr_c::isPlayingSound(u32 soundId) {
for (s32 playerId = dSndPlayerMgr_c::PLAYER_SMALL_IMPORTANT; playerId <= dSndControlPlayerMgr_c::sPlayerMax;
playerId++) {
if (isPlayingSound(playerId, soundId)) {
return true;
}
}
return false;
}
bool dSndSmallEffectMgr_c::playButtonPressSoundWhenAdvancingTextBoxes(f32 ratio) {
if (mTextboxAdvanceSound == -1) {
return false;
}
bool ok = playSound(mTextboxAdvanceSound);
if (ok) {
s16 varValue;
f32 value = ratio * 100.0f;
OSf32tos16(&value, &varValue);
nw4r::snd::SeqSoundHandle handle(&mNormalSound);
handle.WriteVariable(10, varValue);
}
return ok;
}
void dSndSmallEffectMgr_c::resetButtonPressSound() {
mTextboxAdvanceSound = -1;
}
void dSndSmallEffectMgr_c::setButtonPressSound(dSoundSource_c *source) {
resetButtonPressSound();
if (source != nullptr) {
mTextboxAdvanceSound = dSoundSource_c::getCharacterTalkSoundId(SE_S_TALK_CHAR, source);
if (mTextboxAdvanceSound == SE_S_TALK_CHAR) {
resetButtonPressSound();
}
}
}
+22
View File
@@ -3,6 +3,8 @@
#include "common.h"
#include "d/snd/d_snd_3d_actor.h"
#include "d/snd/d_snd_3d_manager.h"
#include "d/snd/d_snd_mgr.h"
#include "d/snd/d_snd_player_mgr.h"
#include "nw4r/snd/snd_SoundStartable.h"
#include "nw4r/ut/ut_list.h"
#include "sized_string.h"
@@ -99,6 +101,26 @@ void dSoundSource_c::d_vt_0x5C() {
// noop
}
u32 dSoundSource_c::getCharacterTalkSoundId(u32 baseSoundId, dSoundSource_c *source) {
if (baseSoundId != -1 && source != nullptr) {
SizedString<64> label;
// maybe an inline
const char *baseLabel = nullptr;
if (dSndMgr_c::GetInstance()->getArchive() != nullptr) {
baseLabel = dSndMgr_c::GetInstance()->getArchive()->GetSoundLabelString(baseSoundId);
}
const char *charLabel = source->d_s_vt_0x17C();
label.sprintf("%s_%s", baseLabel, charLabel);
u32 newLabel = dSndPlayerMgr_c::GetInstance()->convertLabelStringToSoundId(label);
if (newLabel != -1) {
return newLabel;
}
}
return baseSoundId;
}
u32 dSoundSource_c::getRemoConSoundVariant(u32 soundId) const {
const char *label = soundIdToSoundLabel(soundId);
SizedString<64> str;