1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-16 19:43:06 +01:00

Merge pull request #380 from zsilencer/master

couple functions decompiled
This commit is contained in:
Ted John
2014-08-29 07:41:44 +01:00
2 changed files with 323 additions and 7 deletions

View File

@@ -187,6 +187,18 @@ int sound_load3dparameters()
return 0;
}
/**
*
* rct2: 0x00404F3F
*/
int sound_load3dposition()
{
/*if (SUCCEEDED(RCT2_GLOBAL(0x009E2BA4, LPDIRECTSOUND3DBUFFER)->lpVtbl->GetPosition(RCT2_GLOBAL(0x009E2BA4, LPDIRECTSOUND3DBUFFER), &RCT2_GLOBAL(0x009A6084, DS3DBUFFER), 1))) {
return 1;
}*/
return 0;
}
/**
*
* rct2: 0x00404932
@@ -240,7 +252,7 @@ int dsound_create_primary_buffer(int a, int device, int channels, int samples, i
RCT2_GLOBAL(0x009A6084, DS3DBUFFER).vPosition.x = -1.0f;
RCT2_GLOBAL(0x009A6084, DS3DBUFFER).flMaxDistance = 9.8999996f;
RCT2_GLOBAL(0x009A6084, DS3DBUFFER).flMinDistance = 0.25f;
if (RCT2_CALLFUNC(0x00404F3F, int)) {
if (sound_load3dposition()) {
if (SUCCEEDED(RCT2_GLOBAL(0x009E2BA4, LPDIRECTSOUND3DBUFFER)->lpVtbl->SetMinDistance(RCT2_GLOBAL(0x009E2BA4, LPDIRECTSOUND3DBUFFER), RCT2_GLOBAL(0x009A6084, DS3DBUFFER).flMinDistance, 1))) {
if (sound_load3dparameters()) {
return 1;
@@ -338,13 +350,305 @@ int map_sound_info(const char* filename)
}
}
/**
*
* rct2: 0x00405383
*/
MMRESULT sub_405383(HMMIO hmmio, uint32 size, char* buffer, LPMMCKINFO a4, int* read)
{
MMIOINFO mmioinfo;
MMRESULT result;
result = mmioGetInfo(hmmio, &mmioinfo, 0);
if (result != 0) {
*read = 0;
return 1;
}
int size2 = size;
if (size > a4->cksize) {
size2 = a4->cksize;
}
int v8 = 0;
a4->cksize -= size2;
if (size2) {
while (1) {
HPSTR p = mmioinfo.pchEndRead;
if (mmioinfo.pchNext == mmioinfo.pchEndRead) {
result = mmioAdvance(hmmio, &mmioinfo, 0);
if (result != 0) {
*read = 0;
return result;
}
p = mmioinfo.pchEndRead;
if (mmioinfo.pchNext == mmioinfo.pchEndRead) {
break;
}
}
int q = p - mmioinfo.pchNext;
if (size2 - v8 < p - mmioinfo.pchNext) {
q = size2 - v8;
}
memcpy(&buffer[v8], mmioinfo.pchNext, q);
mmioinfo.pchNext += q;
v8 += q;
if (v8 >= size2) {
result = mmioSetInfo(hmmio, &mmioinfo, 0);
if (result != 0) {
*read = 0;
return result;
} else {
*read = size2;
return result;
}
}
}
*read = 0;
return 57603;
}
result = mmioSetInfo(hmmio, &mmioinfo, 0);
if (result != 0) {
*read = 0;
return result;
} else {
*read = size2;
return result;
}
}
/**
*
* rct2: 0x00401822
*/
int sub_401822(int channel, HMMIO* hmmio, LONG offset)
{
rct_sound_channel* sound_channel = &RCT2_ADDRESS(0x014262E0, rct_sound_channel)[channel];
LPMMCKINFO v4 = &sound_channel->mmckinfo2;
HMMIO* v5 = &sound_channel->hmmio;
if (RCT2_CALLFUNC_4(0x00405222, int, HMMIO*, HMMIO*, HGLOBAL*, LPMMCKINFO, hmmio, &sound_channel->hmmio, &sound_channel->hmem, &sound_channel->mmckinfo2)) {
return -100;
}
if (*(uint16*)sound_channel->hmem != 1) {
sound_channel_free(&sound_channel->hmmio, &sound_channel->hmem);
return -101;
}
if (RCT2_CALLFUNC_4(0x00405465, int, HMMIO*, LPMMCKINFO, LPMMCKINFO, int, &sound_channel->hmmio, &sound_channel->mmckinfo1, &sound_channel->mmckinfo2, offset)) {
sound_channel_free(&sound_channel->hmmio, &sound_channel->hmem);
return -103;
}
sound_channel->var_158 = offset;
return 0;
}
/**
*
* rct2: 0x0040153B
*/
int sub_40153B(int channel)
{
rct_sound_channel* sound_channel = &RCT2_ADDRESS(0x014262E0, rct_sound_channel)[channel];
if (sound_channel->var_4) {
if (sound_channel->hmmio) {
sound_channel_free(&sound_channel->hmmio, &sound_channel->hmem);
}
if (sub_401822(channel, (HMMIO*)&sound_channel->var_8, sound_channel->var_110)) {
return 0;
}
sound_channel->var_164 = sound_channel->var_114;
sound_channel->var_118 = sound_channel->var_110;
sound_channel->var_4 = 0;
} else {
int result = RCT2_CALLFUNC_4(0x00405465, int, HMMIO*, LPMMCKINFO, LPMMCKINFO, int, &sound_channel->hmmio, &sound_channel->mmckinfo1, &sound_channel->mmckinfo2, sound_channel->var_118);
sound_channel->var_158 = sound_channel->var_118;
if (result) {
return 0;
}
}
return 1;
}
/**
*
* rct2: 0x00401000
*/
void sub_401000(UINT uTimerID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2, int channel)
{
RCT2_CALLFUNC_6(0x00401000, void, UINT, UINT, DWORD_PTR, DWORD_PTR, DWORD_PTR, int, uTimerID, uMsg, dwUser, dw1, dw2, channel);
rct_sound_channel* sound_channel = &RCT2_ADDRESS(0x014262E0, rct_sound_channel)[channel];
DWORD status;
DWORD dwCurrentPlayCursor;
DWORD dwCurrentWriteCursor;
uint32 var1;
int var2;
int bufferlost = 0;
char* buf1;
int buf1size;
char* buf2;
int buf2size;
sound_channel->dsbuffer->lpVtbl->GetStatus(sound_channel->dsbuffer, &status);
if (status & DSBSTATUS_BUFFERLOST) {
if (FAILED(sound_channel->dsbuffer->lpVtbl->Restore(sound_channel->dsbuffer))) {
return;
}
sound_channel->playpos = 0;
bufferlost = 1;
}
sound_channel->dsbuffer->lpVtbl->GetCurrentPosition(sound_channel->dsbuffer, &dwCurrentPlayCursor, &dwCurrentWriteCursor);
if (dwCurrentPlayCursor != sound_channel->playpos || bufferlost) {
if (sound_channel->var_168 && !sound_channel->var_15C) {
if (!sound_channel->var_160) {
sound_channel->var_160 = 1;
if (!sound_channel->var_4) {
LPDIRECTSOUNDBUFFER dsbuffer = RCT2_ADDRESS(RCT2_ADDRESS_DSOUND_BUFFERS, LPDIRECTSOUNDBUFFER)[channel];
sound_channel->var_0 = 0;
if (dsbuffer) {
dsbuffer->lpVtbl->Stop(dsbuffer);
dsbuffer->lpVtbl->Release(dsbuffer);
RCT2_ADDRESS(RCT2_ADDRESS_DSOUND_BUFFERS, LPDIRECTSOUNDBUFFER)[channel] = 0;
}
if (sound_channel->hmmio) {
sound_channel_free(&sound_channel->hmmio, &sound_channel->hmem);
}
}
}
return;
}
if (dwCurrentPlayCursor >= sound_channel->playpos) {
var1 = dwCurrentPlayCursor - sound_channel->playpos;
} else {
var1 = dwCurrentPlayCursor + sound_channel->var_150 - sound_channel->playpos;
}
if (bufferlost) {
var2 = 2 * sound_channel->var_150 / 6;
} else {
var2 = var1;
}
sound_channel->var_158 += var1;
if (sound_channel->var_168) {
uint32 var3 = sound_channel->var_15C;
uint32* var4 = &sound_channel->var_15C;
if (var3) {
if (var1 <= var3) {
*var4 = var3 - var1;
} else {
*var4 = 0;
}
if (SUCCEEDED(sound_channel->dsbuffer->lpVtbl->Lock(sound_channel->dsbuffer, sound_channel->playpos, var2, (LPVOID*)&buf1, (LPDWORD)&buf1size, (LPVOID*)&buf2, (LPDWORD)&buf2size, 0))) {
uint16 var5 = -(sound_channel->mmckinfo1.cksize != 8);
var5 &= 0x80;
memset(buf1, var5 + 128, buf1size);
if (buf2 && buf2size) {
uint16 var5 = -(sound_channel->mmckinfo1.cksize != 8);
var5 &= 0x80;
memset(buf2, var5 + 128, buf2size);
}
sound_channel->dsbuffer->lpVtbl->Unlock(sound_channel->dsbuffer, buf1, buf1size, buf2, buf2size);
sound_channel->playpos += var2;
if (sound_channel->playpos >= sound_channel->var_150) {
sound_channel->playpos = sound_channel->playpos - sound_channel->var_150;
}
return;
}
// TimeFunc() could not lock DirectSoundBuffer
return;
}
}
if (FAILED(sound_channel->dsbuffer->lpVtbl->Lock(sound_channel->dsbuffer, sound_channel->playpos, var2, (LPVOID*)&buf1, (LPDWORD)&buf1size, (LPVOID*)&buf2, &buf2size, 0))) {
// TimeFunc() could not lock DirectSoundBuffer
return;
}
if (buf1size) {
if (sound_channel->var_160) {
uint16 var5 = -(sound_channel->mmckinfo1.cksize != 8);
var5 &= 0x80;
memset(buf1, var5 + 128, buf1size);
goto label49;
}
}
int var7;
sub_405383(sound_channel->hmmio, buf1size, buf1, &sound_channel->mmckinfo1, &var7);
if (var7 < buf1size) {
if (!sound_channel->var_164) {
int s = sound_channel->mmckinfo1.cksize;
int t = buf1size - var7;
int v;
if (s == 8) {
v = 128;
} else {
if (s != 16) {
goto label42;
}
v = 0;
}
memset(&buf1[var7], v, t);
label42:
sound_channel->var_168 = 1;
if (dwCurrentPlayCursor <= sound_channel->playpos) {
sound_channel->var_15C = sound_channel->playpos - dwCurrentPlayCursor;
} else {
sound_channel->var_15C = sound_channel->playpos + sound_channel->var_150 - dwCurrentPlayCursor;
}
goto label49;
}
char* v21 = buf1;
int v38 = buf1size;
do {
v38 -= var7;
v21 += var7;
sub_40153B(channel);//RCT2_CALLFUNC_1(0x0040153B, int, int, channel);
sub_405383(sound_channel->hmmio, v38, v21, &sound_channel->mmckinfo1, &var7);
} while(var7 < v38);
}
label49:
if (buf2size == 0 || sound_channel->var_160 != 0) {
if(buf2 != 0 && buf2size != 0 && sound_channel->var_160 != 0) {
int var5 = -(sound_channel->mmckinfo1.cksize != 8);
var5 &= 0x80;
memset(buf2, var5 + 128, buf2size);
}
goto label68;
}
sub_405383(sound_channel->hmmio, buf2size, buf2, &sound_channel->mmckinfo1, &var7);
if (var7 >= buf2size) {
label68:
sound_channel->dsbuffer->lpVtbl->Unlock(sound_channel->dsbuffer, buf1, buf1size, buf2, buf2size);
sound_channel->playpos += var2;
if (sound_channel->playpos >= sound_channel->var_150) {
sound_channel->playpos -= sound_channel->var_150;
}
if (bufferlost != 0) {
sound_channel->dsbuffer->lpVtbl->Play(sound_channel->dsbuffer, 0, 0, DSBPLAY_LOOPING);
}
return;
}
if (sound_channel->var_164 != 0) {
char* v26 = buf2;
int v27 = buf2size;
do {
v26 += var7;
v27 -= var7;
sub_40153B(channel);//RCT2_CALLFUNC_1(0x0040153B, int, int, channel);
sub_405383(sound_channel->hmmio, v27, v26, &sound_channel->mmckinfo1, &var7);
} while(var7 < v27);
goto label68;
}
int s = buf2size - var7;
int v;
if (sound_channel->hmem == (HGLOBAL)8) {
v = 128;
} else {
if (sound_channel->hmem != (HGLOBAL)16) {
goto label58;
}
v = 0;
}
memset(&buf2[var7], v, s);
label58:
sound_channel->var_168 = 1;
if (dwCurrentPlayCursor <= sound_channel->playpos) {
sound_channel->var_15C = sound_channel->playpos - dwCurrentPlayCursor;
} else {
sound_channel->var_15C = sound_channel->playpos + sound_channel->var_150 - dwCurrentPlayCursor;
}
goto label68;
}
}
/**
@@ -1047,7 +1351,7 @@ int sound_channel_stop(int channel)
while (_InterlockedExchange(&RCT2_GLOBAL(0x009E1AAC, LONG), 1) != 1) {
Sleep(10);
}
if (sound_channel->hmem) {
if (sound_channel->hmmio) {
sound_channel_free(&sound_channel->hmmio, &sound_channel->hmem);
}

View File

@@ -69,10 +69,21 @@ typedef struct {
typedef struct {
uint32 var_0;
uint8 pad_4[0x118];
HMMIO hmmio;
HGLOBAL hmem;
uint8 pad_124[0x3C];
uint32 var_4;
uint32 var_8;
uint8 pad_C[0x104];
uint32 var_110;
uint32 var_114;
uint32 var_118;
HGLOBAL hmem; // 0x11C
HMMIO hmmio; // 0x120
MMCKINFO mmckinfo1; // 0x124
MMCKINFO mmckinfo2; // 0x138
LPDIRECTSOUNDBUFFER dsbuffer; // 0x14C
uint32 var_150;
uint32 playpos; // 0x154
uint32 var_158;
uint32 var_15C;
uint32 var_160;
uint32 var_164;
uint32 var_168;
@@ -112,6 +123,7 @@ int sound_channel_play(int channel, int a2, int volume, int pan, int frequency);
int sound_channel_set_frequency(int channel, int frequency);
int sound_channel_set_pan(int channel, int pan);
int sound_channel_set_volume(int channel, int volume);
void sound_channel_free(HMMIO* hmmio, HGLOBAL* hmem);
int sound_stop(rct_sound *sound);
int sound_stop_all();
int unmap_file(LPCVOID base);