mirror of
https://github.com/isledecomp/isle.git
synced 2025-03-23 21:20:11 -04:00
Implement/match LegoCacheSound::Create and LegoLoadCacheSoundPresenter::StreamingTickle (#986)
* Implement/match LegoCacheSound::Create * Naming * Fix naming * Fix parens
This commit is contained in:
parent
1423eb56fc
commit
03ffb9c5de
9 changed files with 165 additions and 54 deletions
LEGO1
lego/legoomni
include
src/audio
omni
|
@ -12,7 +12,7 @@
|
|||
struct LegoCacheSoundEntry {
|
||||
LegoCacheSoundEntry() : m_sound(NULL), m_name(NULL) {}
|
||||
LegoCacheSoundEntry(LegoCacheSound* p_sound, const char* p_name) : m_sound(p_sound), m_name(p_name) {}
|
||||
LegoCacheSoundEntry(LegoCacheSound* p_sound) : m_sound(p_sound), m_name(p_sound->GetString0x48().GetData()) {}
|
||||
LegoCacheSoundEntry(LegoCacheSound* p_sound) : m_sound(p_sound), m_name(p_sound->GetUnknown0x48().GetData()) {}
|
||||
|
||||
// FUNCTION: LEGO1 0x1003d030
|
||||
~LegoCacheSoundEntry()
|
||||
|
|
|
@ -26,12 +26,18 @@ public:
|
|||
return !strcmp(p_name, LegoCacheSound::ClassName()) || MxCore::IsA(p_name);
|
||||
}
|
||||
|
||||
virtual MxResult FUN_10006710(); // vtable+0x14
|
||||
virtual MxResult Create(
|
||||
LPPCMWAVEFORMAT p_pwfx,
|
||||
MxString p_mediaSrcPath,
|
||||
MxS32 p_volume,
|
||||
MxU8* p_data,
|
||||
MxU32 p_dataSize
|
||||
); // vtable+0x14
|
||||
virtual void Destroy(); // vtable+0x18
|
||||
virtual void FUN_10006cd0(undefined4, undefined4); // vtable+0x1c
|
||||
|
||||
inline const MxString& GetString0x48() const { return m_string0x48; }
|
||||
inline const undefined GetUnk0x58() const { return m_unk0x58; }
|
||||
inline const MxString& GetUnknown0x48() const { return m_unk0x48; }
|
||||
inline const undefined GetUnknown0x58() const { return m_unk0x58; }
|
||||
|
||||
LegoCacheSound* FUN_10006960();
|
||||
MxResult FUN_10006a30(const char* p_str, MxBool);
|
||||
|
@ -44,20 +50,22 @@ public:
|
|||
|
||||
private:
|
||||
void Init();
|
||||
void CopyData(MxU8* p_data, MxU32 p_dataSize);
|
||||
MxString FUN_10006d80(const MxString& p_str);
|
||||
|
||||
LPDIRECTSOUNDBUFFER m_dsBuffer; // 0x08
|
||||
undefined m_unk0xc[4]; // 0x0c
|
||||
undefined m_unk0x0c[4]; // 0x0c
|
||||
Lego3DSound m_sound; // 0x10
|
||||
undefined* m_unk0x40; // 0x40
|
||||
undefined4 m_unk0x44; // 0x44
|
||||
MxString m_string0x48; // 0x48
|
||||
MxU8* m_data; // 0x40
|
||||
MxU32 m_dataSize; // 0x44
|
||||
MxString m_unk0x48; // 0x48
|
||||
undefined m_unk0x58; // 0x58
|
||||
PCMWAVEFORMAT m_unk0x59; // 0x59
|
||||
PCMWAVEFORMAT m_wfx; // 0x59
|
||||
MxBool m_isLooping; // 0x69
|
||||
MxBool m_unk0x6a; // 0x6a
|
||||
undefined4 m_unk0x6c; // 0x6c
|
||||
MxS32 m_volume; // 0x6c
|
||||
undefined m_unk0x70; // 0x70
|
||||
MxString m_string0x74; // 0x74
|
||||
MxString m_unk0x74; // 0x74
|
||||
undefined m_unk0x84; // 0x84
|
||||
};
|
||||
|
||||
|
|
|
@ -37,10 +37,10 @@ private:
|
|||
void Destroy(MxBool p_fromDestructor);
|
||||
|
||||
LegoCacheSound* m_cacheSound; // 0x6c
|
||||
undefined* m_unk0x70; // 0x70
|
||||
undefined* m_unk0x74; // 0x74
|
||||
undefined4 m_unk0x78; // 0x78
|
||||
undefined m_unk0x7c; // 0x7c
|
||||
MxU8* m_data; // 0x70
|
||||
MxU8* m_pData; // 0x74
|
||||
MxU32 m_dataSize; // 0x78
|
||||
MxBool m_unk0x7c; // 0x7c
|
||||
PCMWAVEFORMAT m_pcmWaveFormat; // 0x7d
|
||||
};
|
||||
|
||||
|
|
|
@ -37,7 +37,7 @@ MxResult LegoCacheSoundManager::Tickle()
|
|||
for (Set100d6b4c::iterator setIter = m_set.begin(); setIter != m_set.end(); setIter++) {
|
||||
#endif
|
||||
LegoCacheSound* sound = (*setIter).GetSound();
|
||||
if (sound->GetUnk0x58()) {
|
||||
if (sound->GetUnknown0x58()) {
|
||||
sound->FUN_10006be0();
|
||||
}
|
||||
}
|
||||
|
@ -46,7 +46,7 @@ MxResult LegoCacheSoundManager::Tickle()
|
|||
while (listIter != m_list.end()) {
|
||||
LegoCacheSound* sound = (*listIter).GetSound();
|
||||
|
||||
if (sound->GetUnk0x58()) {
|
||||
if (sound->GetUnknown0x58()) {
|
||||
sound->FUN_10006be0();
|
||||
listIter++;
|
||||
}
|
||||
|
@ -84,7 +84,7 @@ LegoCacheSound* LegoCacheSoundManager::ManageSoundEntry(LegoCacheSound* p_sound)
|
|||
if (it != m_set.end()) {
|
||||
LegoCacheSound* sound = (*it).GetSound();
|
||||
|
||||
if (sound->GetUnk0x58()) {
|
||||
if (sound->GetUnknown0x58()) {
|
||||
m_list.push_back(LegoCacheSoundEntry(p_sound));
|
||||
return p_sound;
|
||||
}
|
||||
|
@ -117,7 +117,7 @@ LegoCacheSound* LegoCacheSoundManager::FUN_1003db10(LegoCacheSound* p_one, const
|
|||
return NULL;
|
||||
}
|
||||
|
||||
if (p_one->GetUnk0x58()) {
|
||||
if (p_one->GetUnknown0x58()) {
|
||||
LegoCacheSound* result = p_one->FUN_10006960();
|
||||
|
||||
if (result) {
|
||||
|
|
|
@ -12,10 +12,9 @@ LegoCacheSound::LegoCacheSound()
|
|||
Init();
|
||||
}
|
||||
|
||||
// STUB: LEGO1 0x10006630
|
||||
// FUNCTION: LEGO1 0x10006630
|
||||
LegoCacheSound::~LegoCacheSound()
|
||||
{
|
||||
// TODO
|
||||
Destroy();
|
||||
}
|
||||
|
||||
|
@ -23,39 +22,85 @@ LegoCacheSound::~LegoCacheSound()
|
|||
void LegoCacheSound::Init()
|
||||
{
|
||||
m_dsBuffer = NULL;
|
||||
m_unk0x40 = NULL;
|
||||
m_data = NULL;
|
||||
m_unk0x58 = 0;
|
||||
memset(&m_unk0x59, 0, sizeof(m_unk0x59));
|
||||
memset(&m_wfx, 0, sizeof(m_wfx));
|
||||
m_unk0x6a = FALSE;
|
||||
m_unk0x70 = 0;
|
||||
m_isLooping = TRUE;
|
||||
m_unk0x6c = 79;
|
||||
m_volume = 79;
|
||||
m_unk0x84 = 0;
|
||||
}
|
||||
|
||||
// STUB: LEGO1 0x10006710
|
||||
// FUNCTION: LEGO1 0x10006710
|
||||
// FUNCTION: BETA10 0x10066505
|
||||
MxResult LegoCacheSound::FUN_10006710()
|
||||
MxResult LegoCacheSound::Create(
|
||||
LPPCMWAVEFORMAT p_pwfx,
|
||||
MxString p_mediaSrcPath,
|
||||
MxS32 p_volume,
|
||||
MxU8* p_data,
|
||||
MxU32 p_dataSize
|
||||
)
|
||||
{
|
||||
// TODO
|
||||
WAVEFORMATEX wfx;
|
||||
wfx.wFormatTag = p_pwfx->wf.wFormatTag;
|
||||
wfx.nChannels = p_pwfx->wf.nChannels;
|
||||
wfx.nSamplesPerSec = p_pwfx->wf.nSamplesPerSec;
|
||||
wfx.nAvgBytesPerSec = p_pwfx->wf.nAvgBytesPerSec;
|
||||
wfx.nBlockAlign = p_pwfx->wf.nBlockAlign;
|
||||
wfx.wBitsPerSample = p_pwfx->wBitsPerSample;
|
||||
wfx.cbSize = 0;
|
||||
|
||||
DSBUFFERDESC desc;
|
||||
memset(&desc, 0, sizeof(desc));
|
||||
desc.dwSize = sizeof(desc);
|
||||
|
||||
if (MxOmni::IsSound3D()) {
|
||||
desc.dwFlags = DSBCAPS_PRIMARYBUFFER | DSBCAPS_CTRL3D;
|
||||
desc.dwFlags =
|
||||
DSBCAPS_STATIC | DSBCAPS_LOCSOFTWARE | DSBCAPS_CTRL3D | DSBCAPS_CTRLFREQUENCY | DSBCAPS_CTRLVOLUME;
|
||||
}
|
||||
else {
|
||||
desc.dwFlags = DSBCAPS_PRIMARYBUFFER | DSBCAPS_CTRLVOLUME;
|
||||
desc.dwFlags = DSBCAPS_CTRLFREQUENCY | DSBCAPS_CTRLPAN | DSBCAPS_CTRLVOLUME;
|
||||
}
|
||||
|
||||
desc.dwBufferBytes = p_dataSize;
|
||||
desc.lpwfxFormat = &wfx;
|
||||
|
||||
if (SoundManager()->GetDirectSound()->CreateSoundBuffer(&desc, &m_dsBuffer, NULL) != DS_OK) {
|
||||
return FAILURE;
|
||||
}
|
||||
|
||||
m_volume = p_volume;
|
||||
|
||||
MxS32 volume = m_volume * SoundManager()->GetVolume() / 100;
|
||||
MxS32 attenuation = SoundManager()->GetAttenuation(volume);
|
||||
m_dsBuffer->SetVolume(attenuation);
|
||||
|
||||
if (m_sound.Create(m_dsBuffer, NULL, m_volume) != SUCCESS) {
|
||||
m_dsBuffer->Release();
|
||||
m_dsBuffer = NULL;
|
||||
return FAILURE;
|
||||
}
|
||||
|
||||
if (p_data != NULL && p_dataSize != 0) {
|
||||
CopyData(p_data, p_dataSize);
|
||||
}
|
||||
|
||||
m_unk0x48 = FUN_10006d80(p_mediaSrcPath);
|
||||
m_wfx = *p_pwfx;
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
// FUNCTION: LEGO1 0x100068e0
|
||||
// FUNCTION: BETA10 0x100667a0
|
||||
void LegoCacheSound::CopyData(MxU8* p_data, MxU32 p_dataSize)
|
||||
{
|
||||
delete[] m_data;
|
||||
m_dataSize = p_dataSize;
|
||||
m_data = new MxU8[m_dataSize];
|
||||
memcpy(m_data, p_data, m_dataSize);
|
||||
}
|
||||
|
||||
// FUNCTION: LEGO1 0x10006920
|
||||
void LegoCacheSound::Destroy()
|
||||
{
|
||||
|
@ -65,7 +110,7 @@ void LegoCacheSound::Destroy()
|
|||
m_dsBuffer = NULL;
|
||||
}
|
||||
|
||||
delete m_unk0x40;
|
||||
delete[] m_data;
|
||||
Init();
|
||||
}
|
||||
|
||||
|
@ -81,7 +126,7 @@ MxResult LegoCacheSound::FUN_10006a30(const char* p_str, MxBool)
|
|||
{
|
||||
// TODO
|
||||
// gets param2 from FUN_1003db10
|
||||
if (!m_unk0x40 && !m_unk0x44) {
|
||||
if (m_data == NULL && m_dataSize == 0) {
|
||||
return FAILURE;
|
||||
}
|
||||
|
||||
|
@ -102,8 +147,8 @@ void LegoCacheSound::FUN_10006b80()
|
|||
m_unk0x6a = FALSE;
|
||||
|
||||
m_sound.Reset();
|
||||
if (m_string0x74.GetLength() != 0) {
|
||||
m_string0x74 = "";
|
||||
if (m_unk0x74.GetLength() != 0) {
|
||||
m_unk0x74 = "";
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -125,8 +170,8 @@ void LegoCacheSound::FUN_10006be0()
|
|||
if (dwStatus == 0) {
|
||||
m_dsBuffer->Stop();
|
||||
m_sound.Reset();
|
||||
if (m_string0x74.GetLength() != 0) {
|
||||
m_string0x74 = "";
|
||||
if (m_unk0x74.GetLength() != 0) {
|
||||
m_unk0x74 = "";
|
||||
}
|
||||
|
||||
m_unk0x58 = 0;
|
||||
|
@ -134,7 +179,7 @@ void LegoCacheSound::FUN_10006be0()
|
|||
}
|
||||
}
|
||||
|
||||
if (m_string0x74.GetLength() != 0 && !m_unk0x84) {
|
||||
if (m_unk0x74.GetLength() != 0 && !m_unk0x84) {
|
||||
if (!m_sound.UpdatePosition(m_dsBuffer)) {
|
||||
if (m_unk0x6a) {
|
||||
return;
|
||||
|
@ -160,3 +205,36 @@ void LegoCacheSound::SetDistance(MxS32 p_min, MxS32 p_max)
|
|||
void LegoCacheSound::FUN_10006cd0(undefined4, undefined4)
|
||||
{
|
||||
}
|
||||
|
||||
// FUNCTION: LEGO1 0x10006d80
|
||||
// FUNCTION: BETA10 0x100670e7
|
||||
MxString LegoCacheSound::FUN_10006d80(const MxString& p_str)
|
||||
{
|
||||
// TODO: Clean up code
|
||||
char* str = p_str.GetData();
|
||||
MxU32 length = strlen(str);
|
||||
|
||||
char* local28 = str + length;
|
||||
char* local14 = local28;
|
||||
char* pVar1 = local28;
|
||||
|
||||
do {
|
||||
local14 = pVar1;
|
||||
pVar1 = local14 + -1;
|
||||
|
||||
if (str == local14) {
|
||||
break;
|
||||
}
|
||||
|
||||
if (*pVar1 == '.') {
|
||||
local28 = pVar1;
|
||||
}
|
||||
} while (*pVar1 != '\\');
|
||||
|
||||
local14 = pVar1;
|
||||
|
||||
MxString local24;
|
||||
local14++;
|
||||
*local28 = '\0';
|
||||
return local24 = local14;
|
||||
}
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
#include "legocachsound.h"
|
||||
#include "legosoundmanager.h"
|
||||
#include "misc.h"
|
||||
#include "mxdssound.h"
|
||||
#include "mxdssubscriber.h"
|
||||
#include "mxstreamchunk.h"
|
||||
#include "mxwavepresenter.h"
|
||||
|
@ -25,50 +26,71 @@ LegoLoadCacheSoundPresenter::~LegoLoadCacheSoundPresenter()
|
|||
// FUNCTION: LEGO1 0x100184e0
|
||||
void LegoLoadCacheSoundPresenter::Init()
|
||||
{
|
||||
this->m_unk0x70 = NULL;
|
||||
this->m_unk0x78 = 0;
|
||||
this->m_unk0x7c = 0;
|
||||
m_data = NULL;
|
||||
m_dataSize = 0;
|
||||
m_unk0x7c = FALSE;
|
||||
}
|
||||
|
||||
// FUNCTION: LEGO1 0x100184f0
|
||||
void LegoLoadCacheSoundPresenter::Destroy(MxBool p_fromDestructor)
|
||||
{
|
||||
delete[] this->m_unk0x70;
|
||||
delete[] m_data;
|
||||
MxWavePresenter::Destroy(p_fromDestructor);
|
||||
}
|
||||
|
||||
// FUNCTION: LEGO1 0x10018510
|
||||
// FUNCTION: BETA10 0x1008c305
|
||||
void LegoLoadCacheSoundPresenter::ReadyTickle()
|
||||
{
|
||||
MxStreamChunk* chunk = NextChunk();
|
||||
|
||||
if (chunk) {
|
||||
WaveFormat* header = (WaveFormat*) chunk->GetData();
|
||||
m_unk0x78 = 0;
|
||||
m_dataSize = 0;
|
||||
|
||||
MxU8* data = new MxU8[header->m_dataSize];
|
||||
m_unk0x70 = data;
|
||||
m_unk0x74 = data;
|
||||
m_data = data;
|
||||
m_pData = data;
|
||||
|
||||
m_cacheSound = new LegoCacheSound;
|
||||
memcpy(&m_pcmWaveFormat, &header->m_pcmWaveFormat, sizeof(m_pcmWaveFormat));
|
||||
m_cacheSound = new LegoCacheSound();
|
||||
m_pcmWaveFormat = header->m_pcmWaveFormat;
|
||||
|
||||
m_subscriber->FreeDataChunk(chunk);
|
||||
ProgressTickleState(e_streaming);
|
||||
}
|
||||
}
|
||||
|
||||
// STUB: LEGO1 0x100185f0
|
||||
// FUNCTION: LEGO1 0x100185f0
|
||||
// FUNCTION: BETA10 0x1008c48f
|
||||
void LegoLoadCacheSoundPresenter::StreamingTickle()
|
||||
{
|
||||
// TODO
|
||||
EndAction();
|
||||
MxStreamChunk* chunk = NextChunk();
|
||||
|
||||
if (chunk) {
|
||||
if (chunk->GetChunkFlags() & DS_CHUNK_END_OF_STREAM) {
|
||||
m_cacheSound->Create(
|
||||
&m_pcmWaveFormat,
|
||||
((MxDSSound*) m_action)->GetMediaSrcPath(),
|
||||
((MxDSSound*) m_action)->GetVolume(),
|
||||
m_data + 2,
|
||||
m_dataSize - 2
|
||||
);
|
||||
ProgressTickleState(e_done);
|
||||
}
|
||||
else {
|
||||
memcpy(m_pData, chunk->GetData(), chunk->GetLength());
|
||||
m_dataSize += chunk->GetLength();
|
||||
m_pData += chunk->GetLength();
|
||||
}
|
||||
|
||||
m_subscriber->FreeDataChunk(chunk);
|
||||
}
|
||||
}
|
||||
|
||||
// FUNCTION: LEGO1 0x100186f0
|
||||
void LegoLoadCacheSoundPresenter::DoneTickle()
|
||||
{
|
||||
if (m_unk0x7c != 0) {
|
||||
if (m_unk0x7c) {
|
||||
EndAction();
|
||||
}
|
||||
}
|
||||
|
@ -80,7 +102,7 @@ MxResult LegoLoadCacheSoundPresenter::PutData()
|
|||
|
||||
if (m_currentTickleState == e_done) {
|
||||
m_cacheSound = SoundManager()->GetCacheSoundManager()->ManageSoundEntry(m_cacheSound);
|
||||
m_unk0x7c = 1;
|
||||
m_unk0x7c = TRUE;
|
||||
}
|
||||
|
||||
m_criticalSection.Leave();
|
||||
|
|
|
@ -42,6 +42,9 @@ public:
|
|||
|
||||
void CopyMediaSrcPath(const char* p_mediaSrcPath);
|
||||
|
||||
// FUNCTION: LEGO1 0x100186e0
|
||||
inline const char* GetMediaSrcPath() { return m_mediaSrcPath; }
|
||||
|
||||
// FUNCTION: BETA10 0x1013c2e0
|
||||
inline MxS32 GetFramesPerSecond() const { return m_framesPerSecond; }
|
||||
|
||||
|
|
|
@ -36,8 +36,8 @@ public:
|
|||
// MxDSSound::`scalar deleting destructor'
|
||||
|
||||
private:
|
||||
MxU32 m_sizeOnDisk;
|
||||
MxS32 m_volume; // 0xbc
|
||||
MxU32 m_sizeOnDisk; // 0xb8
|
||||
MxS32 m_volume; // 0xbc
|
||||
};
|
||||
|
||||
#endif // MXDSSOUND_H
|
||||
|
|
|
@ -299,8 +299,8 @@ void MxWavePresenter::SetVolume(MxS32 p_volume)
|
|||
m_volume = p_volume;
|
||||
if (m_dsBuffer != NULL) {
|
||||
MxS32 volume = p_volume * MxOmni::GetInstance()->GetSoundManager()->GetVolume() / 100;
|
||||
MxS32 otherVolume = MxOmni::GetInstance()->GetSoundManager()->GetAttenuation(volume);
|
||||
m_dsBuffer->SetVolume(otherVolume);
|
||||
MxS32 attenuation = MxOmni::GetInstance()->GetSoundManager()->GetAttenuation(volume);
|
||||
m_dsBuffer->SetVolume(attenuation);
|
||||
}
|
||||
|
||||
m_criticalSection.Leave();
|
||||
|
|
Loading…
Add table
Reference in a new issue