mirror of
https://github.com/isledecomp/isle.git
synced 2025-10-25 09:24:17 +00:00
LegoCacheSound and related STL (#560)
* LegoCacheSound and related STL * Changes/annotations --------- Co-authored-by: Christian Semmler <mail@csemmler.com>
This commit is contained in:
@@ -2,6 +2,8 @@
|
||||
|
||||
#include "mxomni.h"
|
||||
|
||||
DECOMP_SIZE_ASSERT(Lego3DWavePresenter, 0xa0)
|
||||
|
||||
// FUNCTION: LEGO1 0x1004a7c0
|
||||
MxResult Lego3DWavePresenter::AddToManager()
|
||||
{
|
||||
|
||||
@@ -1,5 +1,9 @@
|
||||
#include "legocachesound.h"
|
||||
|
||||
#include "legoomni.h"
|
||||
#include "legosoundmanager.h"
|
||||
#include "mxomni.h"
|
||||
|
||||
DECOMP_SIZE_ASSERT(LegoCacheSound, 0x88)
|
||||
|
||||
// FUNCTION: LEGO1 0x100064d0
|
||||
@@ -12,10 +16,140 @@ LegoCacheSound::LegoCacheSound()
|
||||
LegoCacheSound::~LegoCacheSound()
|
||||
{
|
||||
// TODO
|
||||
Destroy();
|
||||
}
|
||||
|
||||
// STUB: LEGO1 0x100066d0
|
||||
// FUNCTION: LEGO1 0x100066d0
|
||||
void LegoCacheSound::Init()
|
||||
{
|
||||
// TODO
|
||||
m_dsBuffer = NULL;
|
||||
m_unk0x40 = NULL;
|
||||
m_unk0x58 = 0;
|
||||
memset(&m_unk0x59, 0, sizeof(m_unk0x59));
|
||||
m_unk0x6a = FALSE;
|
||||
m_unk0x70 = 0;
|
||||
m_isLooping = TRUE;
|
||||
m_unk0x6c = 79;
|
||||
m_unk0x84 = 0;
|
||||
}
|
||||
|
||||
// STUB: LEGO1 0x10006710
|
||||
MxResult LegoCacheSound::FUN_10006710()
|
||||
{
|
||||
// TODO
|
||||
DSBUFFERDESC desc;
|
||||
memset(&desc, 0, sizeof(desc));
|
||||
desc.dwSize = sizeof(desc);
|
||||
|
||||
if (MxOmni::IsSound3D()) {
|
||||
desc.dwFlags = DSBCAPS_PRIMARYBUFFER | DSBCAPS_CTRL3D;
|
||||
}
|
||||
else {
|
||||
desc.dwFlags = DSBCAPS_PRIMARYBUFFER | DSBCAPS_CTRLVOLUME;
|
||||
}
|
||||
|
||||
if (SoundManager()->GetDirectSound()->CreateSoundBuffer(&desc, &m_dsBuffer, NULL) != DS_OK) {
|
||||
return FAILURE;
|
||||
}
|
||||
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
// FUNCTION: LEGO1 0x10006920
|
||||
void LegoCacheSound::Destroy()
|
||||
{
|
||||
if (m_dsBuffer) {
|
||||
m_dsBuffer->Stop();
|
||||
m_dsBuffer->Release();
|
||||
m_dsBuffer = NULL;
|
||||
}
|
||||
|
||||
delete m_unk0x40;
|
||||
Init();
|
||||
}
|
||||
|
||||
// STUB: LEGO1 0x10006960
|
||||
LegoCacheSound* LegoCacheSound::FUN_10006960()
|
||||
{
|
||||
// TODO
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// STUB: LEGO1 0x10006a30
|
||||
MxResult LegoCacheSound::FUN_10006a30(char* p_str, MxBool)
|
||||
{
|
||||
// TODO
|
||||
// gets param2 from FUN_1003db10
|
||||
if (!m_unk0x40 && !m_unk0x44) {
|
||||
return FAILURE;
|
||||
}
|
||||
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
// FUNCTION: LEGO1 0x10006b80
|
||||
void LegoCacheSound::FUN_10006b80()
|
||||
{
|
||||
DWORD dwStatus;
|
||||
|
||||
m_dsBuffer->GetStatus(&dwStatus);
|
||||
if (dwStatus) {
|
||||
m_dsBuffer->Stop();
|
||||
}
|
||||
|
||||
m_unk0x58 = 0;
|
||||
m_unk0x6a = FALSE;
|
||||
|
||||
m_unk0x10.FUN_10011ca0();
|
||||
if (m_string0x74.GetLength() != 0) {
|
||||
m_string0x74 = "";
|
||||
}
|
||||
}
|
||||
|
||||
// FUNCTION: LEGO1 0x10006be0
|
||||
void LegoCacheSound::FUN_10006be0()
|
||||
{
|
||||
if (!m_isLooping) {
|
||||
DWORD dwStatus;
|
||||
m_dsBuffer->GetStatus(&dwStatus);
|
||||
|
||||
if (m_unk0x70) {
|
||||
if (dwStatus == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
m_unk0x70 = 0;
|
||||
}
|
||||
|
||||
if (dwStatus == 0) {
|
||||
m_dsBuffer->Stop();
|
||||
m_unk0x10.FUN_10011ca0();
|
||||
if (m_string0x74.GetLength() != 0) {
|
||||
m_string0x74 = "";
|
||||
}
|
||||
|
||||
m_unk0x58 = 0;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (m_string0x74.GetLength() != 0 && !m_unk0x84) {
|
||||
if (!m_unk0x10.FUN_100118e0(m_dsBuffer)) {
|
||||
if (m_unk0x6a) {
|
||||
return;
|
||||
}
|
||||
|
||||
m_dsBuffer->Stop();
|
||||
m_unk0x6a = TRUE;
|
||||
}
|
||||
else if (m_unk0x6a) {
|
||||
m_dsBuffer->Play(0, 0, m_isLooping);
|
||||
m_unk0x6a = FALSE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// FUNCTION: LEGO1 0x10006cd0
|
||||
void LegoCacheSound::FUN_10006cd0(undefined4, undefined4)
|
||||
{
|
||||
}
|
||||
|
||||
82
LEGO1/lego/legoomni/src/audio/legounknown100d5778.cpp
Normal file
82
LEGO1/lego/legoomni/src/audio/legounknown100d5778.cpp
Normal file
@@ -0,0 +1,82 @@
|
||||
#include "legounknown100d5778.h"
|
||||
|
||||
#include "legoomni.h"
|
||||
#include "legounksavedatawriter.h"
|
||||
|
||||
DECOMP_SIZE_ASSERT(LegoUnknown100d5778, 0x30)
|
||||
|
||||
// FUNCTION: LEGO1 0x10011630
|
||||
LegoUnknown100d5778::LegoUnknown100d5778()
|
||||
{
|
||||
Init();
|
||||
}
|
||||
|
||||
// FUNCTION: LEGO1 0x10011670
|
||||
LegoUnknown100d5778::~LegoUnknown100d5778()
|
||||
{
|
||||
Destroy();
|
||||
}
|
||||
|
||||
// FUNCTION: LEGO1 0x10011680
|
||||
void LegoUnknown100d5778::Init()
|
||||
{
|
||||
m_dsBuffer = NULL;
|
||||
m_unk0xc = NULL;
|
||||
m_unk0x10 = 0;
|
||||
m_unk0x18 = 0;
|
||||
m_unk0x14 = FALSE;
|
||||
m_unk0x15 = FALSE;
|
||||
m_unk0x2c = 79;
|
||||
}
|
||||
|
||||
// STUB: LEGO1 0x100116a0
|
||||
MxResult LegoUnknown100d5778::FUN_100116a0(LPDIRECTSOUND p_dsound, undefined4, undefined4 p_unk0x2c)
|
||||
{
|
||||
m_unk0x2c = p_unk0x2c;
|
||||
|
||||
if (MxOmni::IsSound3D()) {
|
||||
p_dsound->QueryInterface(IID_IDirectSoundBuffer, (LPVOID*) &m_dsBuffer);
|
||||
if (m_dsBuffer == NULL) {
|
||||
return FAILURE;
|
||||
}
|
||||
|
||||
// TODO
|
||||
}
|
||||
|
||||
// TODO
|
||||
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
// FUNCTION: LEGO1 0x10011880
|
||||
void LegoUnknown100d5778::Destroy()
|
||||
{
|
||||
if (m_dsBuffer) {
|
||||
m_dsBuffer->Release();
|
||||
m_dsBuffer = NULL;
|
||||
}
|
||||
|
||||
if (m_unk0x14 && m_unk0xc && UnkSaveDataWriter()) {
|
||||
if (m_unk0x15) {
|
||||
UnkSaveDataWriter()->FUN_10083db0(m_unk0xc);
|
||||
}
|
||||
else {
|
||||
UnkSaveDataWriter()->FUN_10083f10(m_unk0xc);
|
||||
}
|
||||
}
|
||||
|
||||
Init();
|
||||
}
|
||||
|
||||
// STUB: LEGO1 0x100118e0
|
||||
undefined4 LegoUnknown100d5778::FUN_100118e0(LPDIRECTSOUNDBUFFER p_dsBuffer)
|
||||
{
|
||||
// TODO
|
||||
return 0;
|
||||
}
|
||||
|
||||
// STUB: LEGO1 0x10011ca0
|
||||
void LegoUnknown100d5778::FUN_10011ca0()
|
||||
{
|
||||
// TODO
|
||||
}
|
||||
@@ -1,25 +1,178 @@
|
||||
#include "legounknown100d6b4c.h"
|
||||
|
||||
// Inline constructor at 0x10029adb
|
||||
LegoUnknown100d6b4c::LegoUnknown100d6b4c()
|
||||
{
|
||||
// TODO
|
||||
}
|
||||
#include "legoomni.h"
|
||||
#include "legoworld.h"
|
||||
|
||||
// STUB: LEGO1 0x1003cf20
|
||||
DECOMP_SIZE_ASSERT(Element100d6b4c, 0x08)
|
||||
DECOMP_SIZE_ASSERT(LegoUnknown100d6b4c, 0x20)
|
||||
|
||||
// FUNCTION: LEGO1 0x1003cf20
|
||||
LegoUnknown100d6b4c::~LegoUnknown100d6b4c()
|
||||
{
|
||||
// TODO
|
||||
LegoCacheSound* sound;
|
||||
|
||||
while (!m_set.empty()) {
|
||||
sound = (*m_set.begin()).GetSound();
|
||||
m_set.erase(m_set.begin());
|
||||
sound->FUN_10006b80();
|
||||
delete sound;
|
||||
}
|
||||
|
||||
while (!m_list.empty()) {
|
||||
sound = (*m_list.begin()).GetSound();
|
||||
m_list.erase(m_list.begin());
|
||||
sound->FUN_10006b80();
|
||||
// DECOMP: delete should not be inlined here
|
||||
delete sound;
|
||||
}
|
||||
}
|
||||
|
||||
// STUB: LEGO1 0x1003d050
|
||||
// FUNCTION: LEGO1 0x1003d050
|
||||
MxResult LegoUnknown100d6b4c::Tickle()
|
||||
{
|
||||
#ifdef COMPAT_MODE
|
||||
Set100d6b4c::iterator setIter;
|
||||
for (setIter = m_set.begin(); setIter != m_set.end(); setIter++) {
|
||||
#else
|
||||
for (Set100d6b4c::iterator setIter = m_set.begin(); setIter != m_set.end(); setIter++) {
|
||||
#endif
|
||||
LegoCacheSound* sound = (*setIter).GetSound();
|
||||
if (sound->GetUnk0x58()) {
|
||||
sound->FUN_10006be0();
|
||||
}
|
||||
}
|
||||
|
||||
List100d6b4c::iterator listIter = m_list.begin();
|
||||
while (listIter != m_list.end()) {
|
||||
LegoCacheSound* sound = (*listIter).GetSound();
|
||||
|
||||
if (sound->GetUnk0x58()) {
|
||||
sound->FUN_10006be0();
|
||||
listIter++;
|
||||
}
|
||||
else {
|
||||
sound->FUN_10006b80();
|
||||
m_list.erase(listIter++);
|
||||
delete sound;
|
||||
}
|
||||
}
|
||||
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
// STUB: LEGO1 0x1003dc40
|
||||
void LegoUnknown100d6b4c::FUN_1003dc40(LegoCacheSound** p_und)
|
||||
// STUB: LEGO1 0x1003d170
|
||||
LegoCacheSound* LegoUnknown100d6b4c::FUN_1003d170(const char* p_key)
|
||||
{
|
||||
// TODO
|
||||
char* x = new char[strlen(p_key) + 1];
|
||||
strcpy(x, p_key);
|
||||
|
||||
Set100d6b4c::iterator setIter;
|
||||
for (setIter = m_set.begin(); setIter != m_set.end(); setIter++) {
|
||||
if (!strcmpi((*setIter).GetName(), x)) {
|
||||
return (*setIter).GetSound();
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// FUNCTION: LEGO1 0x1003d290
|
||||
LegoCacheSound* LegoUnknown100d6b4c::FUN_1003d290(LegoCacheSound* p_sound)
|
||||
{
|
||||
Set100d6b4c::iterator it = m_set.find(Element100d6b4c(p_sound));
|
||||
if (it != m_set.end()) {
|
||||
LegoCacheSound* sound = (*it).GetSound();
|
||||
|
||||
if (sound->GetUnk0x58()) {
|
||||
m_list.push_back(Element100d6b4c(p_sound));
|
||||
return p_sound;
|
||||
}
|
||||
else {
|
||||
delete p_sound;
|
||||
return sound;
|
||||
}
|
||||
}
|
||||
|
||||
m_set.insert(Element100d6b4c(p_sound));
|
||||
LegoWorld* world = CurrentWorld();
|
||||
if (world) {
|
||||
world->Add(p_sound);
|
||||
}
|
||||
|
||||
return p_sound;
|
||||
}
|
||||
|
||||
// FUNCTION: LEGO1 0x1003dae0
|
||||
void LegoUnknown100d6b4c::FUN_1003dae0(char* p_one, char* p_two, MxBool p_three)
|
||||
{
|
||||
// DECOMP: Second parameter is 0xe4 member of LegoPathActor subclass
|
||||
FUN_1003db10(FUN_1003d170(p_one), p_two, p_three);
|
||||
}
|
||||
|
||||
// FUNCTION: LEGO1 0x1003db10
|
||||
LegoCacheSound* LegoUnknown100d6b4c::FUN_1003db10(LegoCacheSound* p_one, char* p_two, MxBool p_three)
|
||||
{
|
||||
if (!p_one) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (p_one->GetUnk0x58()) {
|
||||
LegoCacheSound* result = p_one->FUN_10006960();
|
||||
|
||||
if (result) {
|
||||
LegoCacheSound* t = FUN_1003d290(result);
|
||||
t->FUN_10006a30(p_two, p_three);
|
||||
return t;
|
||||
}
|
||||
}
|
||||
else {
|
||||
p_one->FUN_10006a30(p_two, p_three);
|
||||
return p_one;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// FUNCTION: LEGO1 0x1003dc40
|
||||
void LegoUnknown100d6b4c::FUN_1003dc40(LegoCacheSound** p_und)
|
||||
{
|
||||
// Called during LegoWorld::Destroy like this:
|
||||
// SoundManager()->GetUnknown0x40()->FUN_1003dc40(&sound);
|
||||
// LegoCacheSound*& p_sound?
|
||||
|
||||
#ifdef COMPAT_MODE
|
||||
Set100d6b4c::iterator setIter;
|
||||
for (setIter = m_set.begin(); setIter != m_set.end(); setIter++) {
|
||||
#else
|
||||
for (Set100d6b4c::iterator setIter = m_set.begin(); setIter != m_set.end(); setIter++) {
|
||||
#endif
|
||||
if ((*setIter).GetSound() == *p_und) {
|
||||
(*p_und)->FUN_10006b80();
|
||||
|
||||
delete *p_und;
|
||||
m_set.erase(setIter);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef COMPAT_MODE
|
||||
List100d6b4c::iterator listIter;
|
||||
for (listIter = m_list.begin();; listIter++) {
|
||||
#else
|
||||
for (List100d6b4c::iterator listIter = m_list.begin();; listIter++) {
|
||||
#endif
|
||||
if (listIter == m_list.end()) {
|
||||
return;
|
||||
}
|
||||
|
||||
LegoCacheSound* sound = (*listIter).GetSound();
|
||||
if (sound == *p_und) {
|
||||
(*p_und)->FUN_10006b80();
|
||||
|
||||
delete sound;
|
||||
m_list.erase(listIter);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -83,3 +83,9 @@ void LegoUnkSaveDataWriter::FUN_10083db0(LegoROI* p_roi)
|
||||
{
|
||||
// TODO
|
||||
}
|
||||
|
||||
// STUB: LEGO1 0x10083f10
|
||||
void LegoUnkSaveDataWriter::FUN_10083f10(LegoROI* p_roi)
|
||||
{
|
||||
// TODO
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user