Files

3613 lines
80 KiB
C++

#include "../pinball.h"
//----- (0101CFD0) --------------------------------------------------------
WORD* SessionToGlobalDataPtr(WORD* a1)
{
if (a1 && *a1 == 21554 && a1[222] == 21554)
return a1;
MessageBeep(0xFFFFFFFF);
_wsprintfA(aWavemixV23ByAn, "Invalid session handle 0x%04X passed to WaveMix API", a1);
MessageBoxA(0, aWavemixV23ByAn, "WavMix32", 0x30u);
return 0;
}
//----- (0101D02C) --------------------------------------------------------
BOOL IsValidLPMIXWAVE(int a1)
{
BOOL result; // eax
result = a1;
if (a1)
result = *(WORD*)(a1 + 64) == 21554;
return result;
}
//----- (0101D04E) --------------------------------------------------------
bool HasCurrentOutputFormat(const void* a1)
{
return memcmp(a1, (const void*)(hMem + 380), 0x10u) == 0;
}
//----- (0101D079) --------------------------------------------------------
int DefaultPauseBlocks(int a1)
{
int result; // eax
if (GetVersion() < 0x80000000 || (unsigned __int8)GetVersion() < 4u)
result = a1;
else
result = 0;
return result;
}
//----- (0101D0A5) --------------------------------------------------------
unsigned int DefaultGoodWavePos(UINT_PTR uDeviceID)
{
signed int v1; // eax
unsigned int result; // eax
struct tagWAVEOUTCAPSA pwoc; // [esp+0h] [ebp-38h]
v1 = waveOutGetNumDevs();
if ((signed int)uDeviceID > v1 || (uDeviceID & 0x80000000) != 0 || !v1 || waveOutGetDevCapsA(uDeviceID, &pwoc, 0x34u))
result = 0;
else
result = ((unsigned int)LOBYTE(pwoc.dwSupport) >> 5) & 1;
return result;
}
//----- (0101D0FC) --------------------------------------------------------
DWORD MyWaveOutGetPosition(HWAVEOUT hwo, int a2)
{
struct mmtime_tag pmmt; // [esp+0h] [ebp-10h]
if (!a2)
return (timeGetTime() - *(DWORD*)(hMem + 416)) * *(DWORD*)(hMem + 388) / 0x3E8 & 0xFFFFFFF8;
pmmt.wType = 4;
waveOutGetPosition(hwo, &pmmt, 0xCu);
return (*(int (**)(DWORD, DWORD))(hMem + 436))(pmmt.u.ms, *(DWORD*)(hMem + 424));
}
//----- (0101D178) --------------------------------------------------------
int AddFactor(int a1, int a2)
{
return a1 + a2;
}
//----- (0101D18E) --------------------------------------------------------
int SubFactor(int a1, int a2)
{
return a1 - a2;
}
//----- (0101D1A2) --------------------------------------------------------
unsigned int SetWaveOutPosition(unsigned int a1)
{
LPARAM v1; // eax
HWAVEOUT v2; // ecx
DWORD v3; // ecx
DWORD v4; // eax
LPARAM v5; // ecx
DWORD v6; // edi
unsigned int result; // eax
struct mmtime_tag pmmt; // [esp+0h] [ebp-10h]
v1 = hMem;
v2 = *(HWAVEOUT*)(hMem + 12);
pmmt.wType = 4;
if (v2)
{
waveOutGetPosition(v2, &pmmt, 0xCu);
v3 = pmmt.u.ms;
v1 = hMem;
}
else
{
v3 = 0;
pmmt.u.ms = 0;
}
if (v3 < a1)
{
*(DWORD*)(v1 + 424) = a1 - v3;
*(DWORD*)(v1 + 436) = AddFactor;
}
else
{
*(DWORD*)(v1 + 424) = v3 - a1;
*(DWORD*)(v1 + 436) = SubFactor;
}
v4 = timeGetTime();
v5 = hMem;
v6 = v4;
result = 1000 * a1 / *(DWORD*)(hMem + 388);
*(DWORD*)(hMem + 412) = a1;
*(DWORD*)(v5 + 416) = v6 - result;
return result;
}
//----- (0101D251) --------------------------------------------------------
unsigned int MyWaveOutReset(HWAVEOUT hwo)
{
unsigned int v1; // esi
v1 = MyWaveOutGetPosition(hwo, *(DWORD*)(hMem + 420));
waveOutReset(hwo);
return SetWaveOutPosition(v1);
}
//----- (0101D285) --------------------------------------------------------
int cmixit(_BYTE* a1, char* a2, char* a3, int a4, unsigned int a5)
{
int v5; // eax
unsigned __int8* v6; // esi
_BYTE* v7; // edi
int v8; // ecx
int v9; // edx
_BYTE* v10; // edi
unsigned __int8* v11; // esi
int v12; // edx
int v13; // ebx
unsigned int* v14; // eax
int v15; // ecx
unsigned __int8* v16; // ecx
int v17; // ecx
bool v18; // zf
unsigned __int8* v19; // esi
int v20; // edi
_BYTE* v21; // ecx
int v22; // ebx
unsigned int* v23; // ecx
int v24; // eax
int v26; // [esp+10h] [ebp-8h]
int v27; // [esp+10h] [ebp-8h]
unsigned int v28; // [esp+14h] [ebp-4h]
unsigned int v29; // [esp+14h] [ebp-4h]
int v30; // [esp+30h] [ebp+18h]
int v31; // [esp+30h] [ebp+18h]
LOWORD(v5) = hMem;
if (*(WORD*)(hMem + 382) == 2)
{
if (a4 == 1)
{
v6 = *(unsigned __int8**)a2;
LOWORD(v5) = (WORD)a3;
if (a5)
{
v7 = a1;
v5 = *(unsigned int*)a3 << 8;
v8 = *((unsigned int*)a3 + 1) << 8;
v9 = (unsigned int)(((unsigned int)(a5 - 1) >> 1) + 1);
do
{
*v7 = byte_1025970[*v6 + v5];
v10 = v7 + 1;
v11 = v6 + 1;
*v10 = byte_1025970[*v11 + v8];
v7 = v10 + 1;
v6 = v11 + 1;
--v9;
} while (v9);
}
}
else
{
v28 = 0;
LOWORD(v5) = a5;
if (a5)
{
v26 = (unsigned int)(((unsigned int)(a5 - 1) >> 1) + 1);
do
{
v12 = 128;
v13 = 128;
if (a4 > 0)
{
v14 = (unsigned int*)a3;
v15 = a2 - a3;
v30 = a4;
while (1)
{
v16 = (unsigned __int8*)(*(DWORD*)((char*)v14 + v15) + v28);
v13 = v13 + (unsigned __int8)byte_1025970[256 * *v14 + *v16] - 128;
v17 = (unsigned __int8)byte_1025970[256 * v14[1] + v16[1]];
v14 += 2;
v18 = v30-- == 1;
v12 = v12 + v17 - 128;
if (v18)
break;
v15 = a2 - a3;
}
if (v13 >= 0)
{
if (v13 > 255)
LOBYTE(v13) = -1;
}
else
{
LOBYTE(v13) = 0;
}
if (v12 >= 0)
{
if (v12 > 255)
LOBYTE(v12) = -1;
}
else
{
LOBYTE(v12) = 0;
}
}
v28 += 2;
*a1 = v13;
a1[1] = v12;
LOWORD(v5) = (WORD)a1 + 2;
v18 = v26-- == 1;
a1 += 2;
} while (!v18);
}
}
}
else if (a4 == 1)
{
v19 = *(unsigned __int8**)a2;
v5 = (*(unsigned int*)a3 + *((unsigned int*)a3 + 1)) / 2;
if (a5)
{
v20 = a5;
v21 = a1;
v5 = (unsigned int)v5 << 8;
do
{
*v21++ = byte_1025970[*v19++ + v5];
--v20;
} while (v20);
}
}
else
{
v29 = 0;
if (a5)
{
v27 = a5;
do
{
v22 = 128;
if (a4 > 0)
{
v23 = (unsigned int*)a3;
v31 = a4;
do
{
v24 = (unsigned __int8)byte_1025970[256 * (unsigned int)((*v23 + v23[1]) / 2)
+ *(unsigned __int8*)(*(DWORD*)((char*)v23 + a2 - a3) + v29)];
v23 += 2;
v18 = v31-- == 1;
v22 = v22 + v24 - 128;
} while (!v18);
if (v22 >= 0)
{
if (v22 > 255)
LOBYTE(v22) = -1;
}
else
{
LOBYTE(v22) = 0;
}
}
v5 = (int)a1++;
++v29;
v18 = v27-- == 1;
*(_BYTE*)v5 = v22;
} while (!v18);
}
}
return v5;
}
//----- (0101D491) --------------------------------------------------------
DWORD* InitChannelNodes()
{
DWORD* result; // eax
result = &unk_1026470;
do
{
*result = result + 15;
result += 15;
} while ((signed int)result < (signed int)& unk_1027B68);
dword_1027BA4 = 0;
dword_1025964 = (int)& unk_1026470;
return result;
}
// 1025964: using guessed type int dword_1025964;
// 1027BA4: using guessed type int dword_1027BA4;
//----- (0101D4B9) --------------------------------------------------------
int GetChannelNode()
{
int result; // eax
int v1; // ecx
result = dword_1025964;
if (dword_1025964)
{
v1 = *(DWORD*)dword_1025964;
*(DWORD*)dword_1025964 = 0;
dword_1025964 = v1;
}
return result;
}
// 1025964: using guessed type int dword_1025964;
//----- (0101D4D4) --------------------------------------------------------
DWORD* FreeChannelNode(DWORD* a1)
{
DWORD* result; // eax
result = a1;
if (a1)
{
*a1 = dword_1025964;
dword_1025964 = (int)a1;
}
return result;
}
// 1025964: using guessed type int dword_1025964;
//----- (0101D4F6) --------------------------------------------------------
struct wavehdr_tag* FreeWaveBlocks(HWAVEOUT hwo, int a2)
{
signed int v2; // ebx
LPCVOID* v3; // esi
struct wavehdr_tag* result; // eax
HGLOBAL v5; // eax
HGLOBAL v6; // eax
v2 = 0;
do
{
v3 = (LPCVOID*)(a2 + 4 * v2);
result = (struct wavehdr_tag*) * v3;
if (*v3)
{
waveOutUnprepareHeader(hwo, result, 0x20u);
v5 = GlobalHandle(*v3);
GlobalUnlock(v5);
v6 = GlobalHandle(*v3);
result = (struct wavehdr_tag*)GlobalFree(v6);
*v3 = 0;
}
++v2;
} while (v2 < 10);
return result;
}
//----- (0101D549) --------------------------------------------------------
int AllocWaveBlocks(HWAVEOUT hwo, int a2)
{
signed int v2; // edi
HGLOBAL v3; // eax
DWORD* v4; // eax
int v5; // ecx
signed int v6; // edi
int i; // edi
HGLOBAL v9; // eax
HGLOBAL v10; // eax
v2 = 0;
do
{
v3 = GlobalAlloc(0x2000u, 0x2B41u);
v4 = GlobalLock(v3);
v5 = a2 + 4 * v2;
*(DWORD*)v5 = v4;
if (!v4)
{
if (dword_1027BE4)
MessageBoxA(
0,
"Unable to allocate memory for waveform data. Try making more memory available by closing other applications.",
"WavMix32",
0x30u);
for (i = v2 - 1; i >= 0; --i)
{
v9 = GlobalHandle(*(LPCVOID*)(a2 + 4 * i));
GlobalUnlock(v9);
v10 = GlobalHandle(*(LPCVOID*)(a2 + 4 * i));
GlobalFree(v10);
*(DWORD*)(a2 + 4 * i) = 0;
}
return 0;
}
*v4 = v4 + 12;
*(DWORD*)(*(DWORD*)v5 + 4) = *(DWORD*)(hMem + 396);
*(DWORD*)(*(DWORD*)v5 + 16) = 0;
*(DWORD*)(*(DWORD*)v5 + 20) = 0;
*(DWORD*)(*(DWORD*)v5 + 32) = 1;
++v2;
*(DWORD*)(*(DWORD*)v5 + 36) = 0;
} while (v2 < 10);
v6 = 0;
while (!waveOutPrepareHeader(hwo, *(LPWAVEHDR*)(a2 + 4 * v6), 0x20u))
{
*(DWORD*)(*(DWORD*)(a2 + 4 * v6++) + 16) |= 1u;
if (v6 >= 10)
return 1;
}
if (dword_1027BE4)
MessageBoxA(0, "Unable to prepare wave header.", "WavMix32", 0x30u);
FreeWaveBlocks(hwo, a2);
return 0;
}
// 1027BE4: using guessed type int dword_1027BE4;
//----- (0101D649) --------------------------------------------------------
DWORD* SwapWaveBlocks()
{
DWORD* result; // eax
result = (DWORD*)(hMem + 408);
if (*(_UNKNOWN * *)(hMem + 408) == &unk_10257E4)
* result = &unk_1025770;
else
*result = &unk_10257E4;
return result;
}
//----- (0101D66B) --------------------------------------------------------
DWORD* GetWaveBlock()
{
int v0; // edx
int v1; // eax
int v2; // esi
DWORD* result; // eax
int v4; // ecx
v0 = *(DWORD*)(hMem + 400);
v1 = 0;
if (v0 > 0)
{
v2 = *(DWORD*)(hMem + 408);
do
{
if (*(DWORD*)(*(DWORD*)v2 + 32))
break;
++v1;
v2 += 4;
} while (v1 < v0);
}
if (v1 >= v0)
return 0;
v4 = *(DWORD*)(hMem + 396);
result = *(DWORD * *)(*(DWORD*)(hMem + 408) + 4 * v1);
result[8] = 0;
result[1] = v4;
*result = result + 12;
result[10] = dword_1025798;
return result;
}
// 1025798: using guessed type int dword_1025798;
//----- (0101D6C8) --------------------------------------------------------
struct wavehdr_tag* RemoveFromPlayingQueue(struct wavehdr_tag* a1)
{
struct wavehdr_tag* result; // eax
LPWAVEHDR v2; // edx
DWORD v3; // ecx
bool v4; // zf
if (!pwh)
return 0;
result = a1;
if (a1 != pwh)
{
v2 = pwh;
v3 = pwh[1].dwUser;
if (v3)
{
do
{
if ((struct wavehdr_tag*)v3 == a1)
break;
v2 = (LPWAVEHDR)v3;
v3 = *(DWORD*)(v3 + 44);
} while (v3);
if (v3)
{
v4 = v3 == dword_1027BF0;
v2[1].dwUser = *(DWORD*)(v3 + 44);
if (v4)
dword_1027BF0 = (int)v2;
goto LABEL_12;
}
}
return 0;
}
pwh = (LPWAVEHDR)a1[1].dwUser;
if (!pwh)
dword_1027BF0 = 0;
LABEL_12:
a1[1].dwUser = 0;
return result;
}
// 1027BF0: using guessed type int dword_1027BF0;
//----- (0101D734) --------------------------------------------------------
LPWAVEHDR DestroyPlayQueue()
{
struct wavehdr_tag* v0; // ST00_4
LPWAVEHDR result; // eax
while (1)
{
result = pwh;
if (!pwh)
break;
v0 = pwh;
pwh[1].lpData = (LPSTR)1;
RemoveFromPlayingQueue(v0);
}
return result;
}
//----- (0101D752) --------------------------------------------------------
int ReleaseWaveDevice(int a1)
{
int result; // eax
HWND v2; // ST04_4
if (*(DWORD*)(a1 + 16))
{
result = *(DWORD*)(a1 + 12);
if (result)
{
MyWaveOutReset(*(HWAVEOUT*)(a1 + 12));
DestroyPlayQueue();
FreeWaveBlocks(*(HWAVEOUT*)(a1 + 12), (int)& unk_10257E4);
FreeWaveBlocks(*(HWAVEOUT*)(a1 + 12), (int)& unk_1025770);
waveOutClose(*(HWAVEOUT*)(a1 + 12));
v2 = *(HWND*)(a1 + 4);
*(DWORD*)(a1 + 12) = 0;
result = DestroyWindow(v2);
*(DWORD*)(a1 + 4) = 0;
}
}
return result;
}
//----- (0101D7B1) --------------------------------------------------------
signed int GetWaveDevice()
{
HWND v0; // eax
LPARAM v1; // ecx
MMRESULT v2; // edi
HWND v4; // ST2C_4
WAVEFORMATEX pwfx; // [esp+Ch] [ebp-14h]
if (*(DWORD*)(hMem + 12))
return 0;
v0 = CreateWindowExA(0, "WavMix32", WindowName, 0x8000000u, 0, 0, 0, 0, 0, 0, dword_10257E0, 0);
v1 = hMem;
*(DWORD*)(hMem + 4) = v0;
if (!v0)
{
if (dword_1027BE4)
MessageBoxA(0, "Failed to create callback window.", "WavMix32", 0x30u);
return 1;
}
pwfx.wFormatTag = *(WORD*)(v1 + 380);
pwfx.nChannels = *(WORD*)(v1 + 382);
pwfx.nSamplesPerSec = *(DWORD*)(v1 + 384);
pwfx.nAvgBytesPerSec = *(DWORD*)(v1 + 388);
pwfx.nBlockAlign = *(WORD*)(v1 + 392);
pwfx.wBitsPerSample = *(WORD*)(v1 + 394);
pwfx.cbSize = 0;
v2 = waveOutOpen((LPHWAVEOUT)(v1 + 12), 0xFFFFFFFF, &pwfx, *(DWORD*)(v1 + 4), 0, 0x10000u);
if (v2)
{
DestroyWindow(*(HWND*)(hMem + 4));
*(DWORD*)(hMem + 4) = 0;
return v2;
}
if (AllocWaveBlocks(*(HWAVEOUT*)(hMem + 12), (int)& unk_10257E4)
&& AllocWaveBlocks(*(HWAVEOUT*)(hMem + 12), (int)& unk_1025770))
{
*(DWORD*)(hMem + 408) = &unk_10257E4;
return 0;
}
FreeWaveBlocks(*(HWAVEOUT*)(hMem + 12), (int)& unk_10257E4);
FreeWaveBlocks(*(HWAVEOUT*)(hMem + 12), (int)& unk_1025770);
waveOutClose(*(HWAVEOUT*)(hMem + 12));
v4 = *(HWND*)(hMem + 4);
*(DWORD*)(hMem + 12) = 0;
DestroyWindow(v4);
return 1;
}
// 1027BE4: using guessed type int dword_1027BE4;
//----- (0101D918) --------------------------------------------------------
signed int WaveMixOpenChannel(WORD* a1, signed int a2, unsigned int a3)
{
WORD* v3; // eax
signed int v4; // ecx
int v6; // ecx
DWORD* v7; // edx
int v8; // ecx
DWORD* v9; // edx
v3 = SessionToGlobalDataPtr(a1);
hMem = (LPARAM)v3;
if (!v3)
return 5;
if (a3 > 2)
return 10;
v4 = a2;
if (a3)
{
if (a3 == 2 && (a2 > 16 || a2 < 1))
return 11;
}
else if (a2 >= 16)
{
return 11;
}
if (a3)
{
if (a3 == 1)
{
v4 = 16;
}
else if (a3 != 2)
{
return 10;
}
v6 = v4 - 1;
if (v6 >= 0)
{
v7 = &v3[2 * v6 + 122];
v8 = v6 + 1;
do
{
if (*v7 == -1)
{
*v7 = 0;
*((WORD*)v7 - 32) = v3[88];
*((WORD*)v7 - 31) = v3[89];
++* ((DWORD*)v3 + 77);
}
--v7;
--v8;
} while (v8);
}
}
else
{
v9 = &v3[2 * a2 + 122];
if (*v9 != -1)
return 4;
*v9 = 0;
v3[2 * a2 + 90] = v3[88];
v3[2 * a2 + 91] = v3[89];
++* ((DWORD*)v3 + 77);
}
return 0;
}
//----- (0101D9E7) --------------------------------------------------------
LPWAVEHDR AddToPlayingQueue(struct wavehdr_tag* a1)
{
LPWAVEHDR result; // eax
result = pwh;
a1[1].dwUser = 0;
if (result)
{
*(DWORD*)(dword_1027BF0 + 44) = a1;
}
else
{
result = a1;
pwh = a1;
}
dword_1027BF0 = (int)a1;
return result;
}
// 1027BF0: using guessed type int dword_1027BF0;
//----- (0101DA1D) --------------------------------------------------------
int MixerPlay(LPWAVEHDR pwh, int a2)
{
LPWAVEHDR v2; // edi
LPARAM v4; // esi
DWORD* v5; // ecx
signed int v6; // ebx
DWORD* v7; // eax
int v8; // edx
unsigned int v9; // ebx
int v10; // eax
unsigned int v11; // ecx
int v12; // edi
unsigned int v13; // eax
unsigned int v14; // edx
unsigned int v15; // ebx
int v16; // eax
unsigned int v17; // eax
int v18; // eax
int v19; // edx
int v20; // edi
unsigned int v21; // edx
int* v22; // eax
int v23; // ecx
bool v24; // zf
unsigned int v25; // [esp+4h] [ebp-1Ch]
unsigned int v26; // [esp+8h] [ebp-18h]
int v27; // [esp+Ch] [ebp-14h]
LPSTR v28; // [esp+10h] [ebp-10h]
int v29; // [esp+14h] [ebp-Ch]
unsigned int v30; // [esp+18h] [ebp-8h]
unsigned int v31; // [esp+1Ch] [ebp-4h]
v2 = pwh;
if (!pwh)
return 0;
v30 = -1;
v31 = 0;
v4 = hMem;
v5 = (DWORD*)(hMem + 244);
v6 = 16;
do
{
v7 = (DWORD*)* v5;
if (*v5 != -1 && v7)
{
do
{
if (v7[11] > * (DWORD*)(v4 + 412))
break;
v7 = (DWORD*)* v7;
} while (v7);
if (v7)
{
if (v7[10] < v30)
v30 = v7[10];
v8 = v31++;
dword_1025730[v8] = (int)v7;
}
}
++v5;
--v6;
} while (v6);
if (!v31)
{
if (a2)
pwh[1].lpData = (LPSTR)1;
return 0;
}
v9 = *(DWORD*)(v4 + 412);
v28 = pwh->lpData;
LOWORD(v10) = *(WORD*)(v4 + 396);
v25 = *(DWORD*)(v4 + 412);
v27 = *(unsigned int*)(v4 + 396);
while ((WORD)v10)
{
if (v9 >= v30)
{
v26 = 0;
v29 = 0;
v11 = v9 + (unsigned int)v10;
if (!v31)
goto LABEL_47;
do
{
v12 = dword_1025730[v26];
v13 = *(DWORD*)(v12 + 40);
if (v13 <= v9)
{
if (*(DWORD*)(v12 + 44) < v11)
v11 = *(DWORD*)(v12 + 44);
v14 = v9 - v13;
if (*(WORD*)(v12 + 26))
{
v15 = *(DWORD*)(v12 + 36);
v14 %= v15;
v16 = v15 - v14;
v9 = v25;
v17 = v25 + v16;
if (v17 < v11)
v11 = v17;
}
v18 = v14 + *(DWORD*)(v12 + 48);
v19 = v29++;
dword_10257A0[v19] = v18;
word_1025810[2 * v19] = *(WORD*)(v12 + 56);
word_1025812[2 * v19] = *(WORD*)(v12 + 58);
}
else if (v13 < v11)
{
v11 = *(DWORD*)(v12 + 40);
}
++v26;
} while (v26 < v31);
if (v29)
{
v20 = v11 - v9;
(*(void (**)(LPSTR, int*, int*, int, unsigned int))(v4 + 428))(
v28,
dword_10257A0,
word_1025810,
v29,
v11 - v9);
v28 += v20;
v27 -= v20;
v30 = -1;
v9 += v20;
v25 = v9;
v21 = 0;
v22 = dword_1025730;
do
{
if (!*v22)
goto LABEL_57;
do
{
if (*(DWORD*)(*v22 + 44) > v9)
break;
v23 = *(DWORD*)* v22;
*v22 = v23;
} while (v23);
if (*v22)
{
if (*(DWORD*)(*v22 + 40) < v30)
v30 = *(DWORD*)(*v22 + 40);
++v21;
++v22;
}
else
{
LABEL_57:
v24 = v31-- == 1;
*v22 = dword_1025730[v31];
if (v24)
break;
}
} while (v21 < v31);
v4 = hMem;
}
}
else
{
v10 = (unsigned int)v10;
if ((unsigned int)v10 + v9 >= v30)
v10 = v30 - v9;
memset(v28, 0x80u, (unsigned int)v10);
v28 += v10;
v9 += v10;
v27 -= v10;
v25 = v9;
}
v2 = pwh;
LABEL_47:
LOWORD(v10) = v27;
}
v2[1].dwBufferLength = *(DWORD*)(v4 + 412);
*(DWORD*)(v4 + 412) += *(DWORD*)(v4 + 396);
if (a2)
{
AddToPlayingQueue(v2);
if (waveOutWrite(*(HWAVEOUT*)(v4 + 12), v2, 0x20u))
{
if (dword_1027BE4)
MessageBoxA(0, "Failed to write block to device", "WavMix32", 0x30u);
v2[1].lpData = (LPSTR)1;
RemoveFromPlayingQueue(v2);
}
}
return 1;
}
// 1025810: using guessed type int word_1025810[];
// 1027BE4: using guessed type int dword_1027BE4;
//----- (0101DC8C) --------------------------------------------------------
DWORD FreePlayedBlocks()
{
DWORD result; // eax
LPARAM v1; // esi
signed int v2; // ebx
DWORD* v3; // edi
HWND v4; // eax
signed int v5; // edi
DWORD v6; // [esp+Ch] [ebp-8h]
WPARAM wParam; // [esp+10h] [ebp-4h]
result = MyWaveOutGetPosition(*(HWAVEOUT*)(hMem + 12), *(DWORD*)(hMem + 420));
wParam = 0;
v1 = hMem;
v6 = result;
v2 = 244;
do
{
v3 = *(DWORD * *)(v2 + v1);
if (v3 && v3 != (DWORD*)-1)
{
do
{
result = v6;
if (v6 < v3[11])
break;
*(DWORD*)(v2 + v1) = *v3;
v4 = *(HWND*)((char*)v3 + 18);
if (v4)
{
PostMessageA(v4, 0x3BDu, wParam, v3[8]);
v1 = hMem;
}
result = (DWORD)FreeChannelNode(v3);
v3 = *(DWORD * *)(v2 + v1);
} while (v3);
}
++wParam;
v2 += 4;
} while (v2 < 308);
if (!*(DWORD*)(v1 + 420) && !pwh)
{
v5 = 244;
do
{
result = *(DWORD*)(v5 + v1);
if (result)
{
if (result != -1)
{
result = PostMessageA(*(HWND*)(v1 + 4), 0x400u, 0, v1);
v1 = hMem;
}
}
v5 += 4;
} while (v5 < 308);
}
return result;
}
//----- (0101DD5D) --------------------------------------------------------
int WaveMixPump()
{
int result; // eax
LPWAVEHDR i; // esi
struct wavehdr_tag* v2; // eax
result = dword_1025798;
hMem = dword_1025798;
if (dword_1025798)
{
LABEL_5:
for (i = pwh; i; i = (LPWAVEHDR)i[1].dwUser)
{
if (i->dwFlags & 1)
{
RemoveFromPlayingQueue(i);
i[1].lpData = (LPSTR)1;
goto LABEL_5;
}
}
FreePlayedBlocks();
do
{
v2 = (struct wavehdr_tag*)GetWaveBlock();
result = MixerPlay(v2, 1);
} while (result);
}
return result;
}
// 1025798: using guessed type int dword_1025798;
//----- (0101DDAD) --------------------------------------------------------
LRESULT WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
if (Msg != 957 && Msg != 1024)
return DefWindowProcA(hWnd, Msg, wParam, lParam);
WaveMixPump();
return 0;
}
//----- (0101DDD8) --------------------------------------------------------
signed int NoResetRemix(int a1, int a2)
{
WaveMixPump();
return 1;
}
//----- (0101DDE8) --------------------------------------------------------
signed int ResetRemix(int a1, int a2)
{
struct wavehdr_tag* v2; // eax
struct wavehdr_tag* v3; // esi
int v4; // esi
LPARAM v5; // eax
bool v6; // zf
bool v7; // sf
LPWAVEHDR i; // esi
signed int v10; // [esp+Ch] [ebp-8h]
int v11; // [esp+10h] [ebp-4h]
v10 = 0;
v11 = 0;
*(DWORD*)(hMem + 412) = a1;
DestroyPlayQueue();
SwapWaveBlocks();
while (1)
{
v2 = (struct wavehdr_tag*)GetWaveBlock();
v3 = v2;
if (!v2)
break;
if (!MixerPlay(v2, 0))
{
v3[1].lpData = (LPSTR)1;
break;
}
AddToPlayingQueue(v3);
}
v4 = *(DWORD*)(hMem + 412);
MyWaveOutReset(*(HWAVEOUT*)(hMem + 12));
v5 = hMem;
v6 = *(DWORD*)(hMem + 404) == 0;
v7 = *(DWORD*)(hMem + 404) < 0;
*(DWORD*)(hMem + 412) = v4;
if (!v7 && !v6)
{
waveOutPause(*(HWAVEOUT*)(v5 + 12));
v5 = hMem;
v10 = 1;
v11 = 0;
}
for (i = pwh; i; i = (LPWAVEHDR)i[1].dwUser)
{
if (waveOutWrite(*(HWAVEOUT*)(v5 + 12), i, 0x20u))
{
if (dword_1027BE4)
MessageBoxA(0, "Failed to write block to device", "WavMix32", 0x30u);
i[1].lpData = (LPSTR)1;
RemoveFromPlayingQueue(i);
}
v5 = hMem;
if (v10)
{
if (++v11 >= *(DWORD*)(hMem + 404))
{
waveOutRestart(*(HWAVEOUT*)(hMem + 12));
v5 = hMem;
v10 = 0;
}
}
}
if (v10)
waveOutRestart(*(HWAVEOUT*)(v5 + 12));
return 1;
}
// 1027BE4: using guessed type int dword_1027BE4;
//----- (0101DF07) --------------------------------------------------------
void ResetWavePosIfNoChannelData()
{
signed int v0; // edx
DWORD* v1; // eax
if (!pwh)
{
v0 = 0;
v1 = (DWORD*)(hMem + 244);
while (!*v1 || *v1 == -1)
{
++v0;
++v1;
if (v0 >= 16)
{
SetWaveOutPosition(0);
return;
}
}
}
}
//----- (0101DF3D) --------------------------------------------------------
signed int WaveMixPlay(int a1)
{
WORD* v1; // ebx
const void* v2; // edi
int v3; // eax
signed int v4; // edx
signed int v5; // ecx
DWORD* v6; // eax
bool v7; // zf
int v8; // eax
int v9; // edx
int v10; // ecx
int v11; // ecx
int v12; // esi
DWORD** v13; // ebx
LPARAM v14; // esi
DWORD v15; // eax
DWORD* v16; // eax
DWORD* v17; // edi
int v18; // ecx
int v19; // eax
int v20; // bx
DWORD** v21; // ebx
DWORD* i; // eax
DWORD* v23; // ST24_4
DWORD v24; // eax
DWORD* v25; // ecx
DWORD* v26; // eax
DWORD v27; // eax
unsigned int v28; // ax
int v29; // ebx
signed int v30; // edi
struct wavehdr_tag* v31; // eax
int j; // eax
struct wavehdr_tag* v33; // eax
const CHAR* v35; // [esp-14h] [ebp-24h]
signed int v36; // [esp+8h] [ebp-8h]
signed int v37; // [esp+Ch] [ebp-4h]
DWORD v38; // [esp+18h] [ebp+8h]
++dword_1027BF8;
v37 = 12;
v36 = 0;
if (dword_1027BF8 > 1)
goto LABEL_97;
if (!a1)
{
if (dword_1027BE4)
MessageBoxA(0, "NULL parameters pointer passed to WaveMixPlay!", "WavMix32", 0x30u);
v37 = 5;
goto LABEL_97;
}
v1 = SessionToGlobalDataPtr(*(WORD * *)(a1 + 2));
hMem = (LPARAM)v1;
if (!v1)
{
if (!dword_1027BE4)
{
LABEL_10:
v37 = 5;
goto LABEL_97;
}
v35 = "Invalid session handle passed to WaveMixPlay";
LABEL_9:
MessageBoxA(0, v35, "WavMix32", 0x30u);
goto LABEL_10;
}
v2 = *(const void**)(a1 + 10);
if (!IsValidLPMIXWAVE(*(DWORD*)(a1 + 10)))
{
if (dword_1027BE4)
MessageBoxA(0, "Invalid or NULL wave pointer passed to WaveMixPlay!", "WavMix32", 0x30u);
goto LABEL_10;
}
LOBYTE(v3) = HasCurrentOutputFormat(v2);
if (!v3)
{
_wsprintfA(
aWavemixV23ByAn,
"The LPMIXWAVE 0x%lx is not in the current output format, close the wave and reopen it.",
v2);
if (dword_1027BE4)
MessageBoxA(0, aWavemixV23ByAn, "WavMix32", 0x30u);
v37 = 8;
goto LABEL_97;
}
if (*((DWORD*)v1 + 4))
{
if (!*((DWORD*)v1 + 77))
{
if (!dword_1027BE4)
goto LABEL_10;
v35 = "You must open a channel before you can play a wave!";
goto LABEL_9;
}
if (*(_BYTE*)(a1 + 18) & 2)
{
v4 = 0;
v5 = 0;
v6 = v1 + 156;
do
{
if (*(v6 - 17) != -1)
{
if (!*(DWORD*)& v1[2 * v4 + 122])
break;
if (v5 != v4 && *v6 < *(DWORD*)& v1[2 * v4 + 156])
v4 = v5;
}
++v5;
++v6;
} while (v5 < 16);
*(DWORD*)(a1 + 6) = v4;
}
else
{
v4 = *(DWORD*)(a1 + 6);
}
++* ((DWORD*)v1 + 94);
v7 = *(DWORD*)& v1[2 * v4 + 122] == -1;
*(DWORD*)& v1[2 * v4 + 156] = *((DWORD*)v1 + 94);
if (v7)
goto LABEL_10;
v8 = GetChannelNode();
if (!v8)
goto LABEL_97;
qmemcpy((void*)(v8 + 4), (const void*)a1, 0x1Cu);
v10 = *(DWORD*)(v8 + 14);
*(DWORD*)(v8 + 32) = v10;
*(DWORD*)(v8 + 36) = *(DWORD*)(v10 + 20);
v11 = *(DWORD*)(v10 + 16);
*(DWORD*)(v8 + 48) = v11;
v12 = (unsigned int)v1[196];
v13 = (DWORD * *)(v1 + 220);
*(DWORD*)(v8 + 52) = *(DWORD*)(v8 + 36) + v11 - v12;
*(DWORD*)(v8 + 10) = v9;
if (*v13)
{
*(DWORD*)v8 = **v13;
**v13 = v8;
*v13 = (DWORD*)v8;
}
else
{
*v13 = (DWORD*)v8;
*(DWORD*)v8 = v8;
}
if (!(*(_BYTE*)(v8 + 22) & 8))
{
ResetWavePosIfNoChannelData();
v14 = hMem;
if (*(signed int (**)(int, int))(hMem + 432) == ResetRemix)
{
v15 = MyWaveOutGetPosition(*(HWAVEOUT*)(hMem + 12), *(DWORD*)(hMem + 420));
v14 = hMem;
}
else
{
v15 = *(DWORD*)(hMem + 412);
}
v38 = v15;
if (!*(DWORD*)(v14 + 440))
goto LABEL_84;
do
{
v16 = *(DWORD * *)(v14 + 440);
v17 = (DWORD*)* v16;
if ((DWORD*)* v16 == v16)
* (DWORD*)(v14 + 440) = 0;
else
*v16 = *v17;
v18 = *(DWORD*)((char*)v17 + 22);
v19 = *(DWORD*)((char*)v17 + 10);
*v17 = 0;
if (v18 & 0x10)
{
*((WORD*)v17 + 28) = *((WORD*)v17 + 14);
v20 = *((WORD*)v17 + 15);
}
else
{
*((WORD*)v17 + 28) = *(WORD*)(v14 + 4 * v19 + 180);
v20 = *(WORD*)(v14 + 4 * v19 + 182);
}
*((WORD*)v17 + 29) = v20;
if (*((WORD*)v17 + 28) > 0xAu)
* ((WORD*)v17 + 28) = 10;
if (*((WORD*)v17 + 29) > 0xAu)
* ((WORD*)v17 + 29) = 10;
if (v18 & 1)
{
v21 = (DWORD * *)(v14 + 4 * v19 + 244);
for (i = *v21; i; i = v23)
{
v23 = (DWORD*)* i;
FreeChannelNode(i);
}
v7 = pwh == 0;
*v21 = v17;
if (!v7)
v36 = 1;
if (*((_BYTE*)v17 + 22) & 4)
v24 = v38;
else
v24 = *(DWORD*)(v14 + 412);
v17[10] = v24;
}
else
{
v25 = (DWORD*)(v14 + 4 * v19 + 244);
v26 = (DWORD*)* v25;
if (*v25)
{
while (*v26)
v26 = (DWORD*)* v26;
*v26 = v17;
v27 = v26[11];
if (*((_BYTE*)v17 + 22) & 4)
{
if (v27 <= v38)
v27 = v38;
}
else if (*(DWORD*)(v14 + 412) > v27)
{
v27 = *(DWORD*)(v14 + 412);
}
}
else
{
v27 = v38;
*v25 = v17;
if (!(*((_BYTE*)v17 + 22) & 4))
v27 = *(DWORD*)(v14 + 412);
}
v17[10] = v27;
if (*(DWORD*)(v14 + 412) > v17[10])
v36 = 1;
}
v28 = *((WORD*)v17 + 13);
if (v28 == -1)
v17[11] = -1;
else
v17[11] = v17[10] + v17[9] * (v28 + 1) - *(unsigned int*)(v14 + 392);
} while (*(DWORD*)(v14 + 440));
if (!v36)
goto LABEL_84;
if (!(*(int (**)(DWORD, DWORD))(v14 + 432))(v38, 0))
{
v14 = hMem;
LABEL_84:
v29 = 0;
if (pwh || *(DWORD*)(v14 + 404) <= 0)
{
v30 = 0;
}
else
{
waveOutPause(*(HWAVEOUT*)(v14 + 12));
v30 = 1;
}
v31 = (struct wavehdr_tag*)GetWaveBlock();
for (j = MixerPlay(v31, 1); j; j = MixerPlay(v33, 1))
{
if (v30)
{
if (++v29 >= *(DWORD*)(hMem + 404))
{
waveOutRestart(*(HWAVEOUT*)(hMem + 12));
v30 = 0;
}
}
v33 = (struct wavehdr_tag*)GetWaveBlock();
}
if (v30)
waveOutRestart(*(HWAVEOUT*)(hMem + 12));
goto LABEL_96;
}
}
LABEL_96:
v37 = 0;
goto LABEL_97;
}
if (dword_1027BE4)
MessageBoxA(0, "Wave device not allocated, call WaveMixActivate(hMixSession,TRUE)", "WavMix32", 0x30u);
v37 = 4;
LABEL_97:
--dword_1027BF8;
return v37;
}
// 1027BE4: using guessed type int dword_1027BE4;
// 1027BF8: using guessed type int dword_1027BF8;
//----- (0101E373) --------------------------------------------------------
signed int WaveMixFlushChannel(WORD* a1, signed int a2, char a3)
{
DWORD* v3; // ebx
WORD* v4; // eax
WORD* v5; // esi
signed int v6; // ecx
int v7; // eax
DWORD** v8; // edi
DWORD* v9; // eax
DWORD v10; // eax
signed int v13; // [esp+8h] [ebp-4h]
int v14; // [esp+14h] [ebp+8h]
v3 = 0;
v13 = 0;
v4 = SessionToGlobalDataPtr(a1);
v5 = v4;
hMem = (LPARAM)v4;
if (v4)
{
if (a3 & 1)
{
v6 = 0;
v7 = 16;
goto LABEL_9;
}
v6 = a2;
if (a2 < 0 || a2 >= 16)
return 11;
if (*(DWORD*)& v4[2 * a2 + 122] != -1)
{
v7 = a2 + 1;
if (!(__OFSUB__(a2, a2 + 1) ^ 1))
return 0;
LABEL_9:
v8 = (DWORD * *)& v5[2 * v6 + 122];
v14 = v7 - v6;
do
{
v9 = *v8;
if (*v8 != (DWORD*)-1)
{
*v8 = v3;
if (v9 != v3)
{
v13 = 1;
do
{
v3 = (DWORD*)* v9;
FreeChannelNode(v9);
v9 = v3;
} while (v3);
}
}
++v8;
--v14;
} while (v14);
if ((DWORD*)v13 != v3 && !(a3 & 2) && *((DWORD * *)v5 + 4) != v3)
{
v10 = MyWaveOutGetPosition(*((HWAVEOUT*)v5 + 3), *((DWORD*)v5 + 105));
(*((void (**)(DWORD, DWORD*))v5 + 108))(v10, v3);
}
return 0;
}
}
return 5;
}
//----- (0101E434) --------------------------------------------------------
signed int WaveMixCloseChannel(WORD* a1, signed int a2, char a3)
{
signed int result; // eax
signed int v4; // esi
int v5; // ecx
LPARAM v6; // eax
DWORD* v7; // edx
int v8; // ecx
hMem = (LPARAM)SessionToGlobalDataPtr(a1);
if (!hMem)
return 5;
v4 = a2;
result = WaveMixFlushChannel(a1, a2, a3 | 2);
if (!result)
{
if (a3 & 1)
{
v4 = 0;
v5 = 16;
}
else
{
v5 = a2 + 1;
if (!(__OFSUB__(a2, a2 + 1) ^ 1))
return 0;
}
v6 = hMem;
v7 = (DWORD*)(hMem + 4 * v4 + 244);
v8 = v5 - v4;
do
{
if (*v7 != -1)
{
*v7 = -1;
--* (DWORD*)(v6 + 308);
}
++v7;
--v8;
} while (v8);
return 0;
}
return result;
}
//----- (0101E4A9) --------------------------------------------------------
int WaveMixFreeWave(int a1, LPCVOID pMem)
{
WORD* v2; // ebx
LPCVOID* v4; // edi
DWORD** v5; // ebx
DWORD* v6; // esi
HGLOBAL v7; // eax
HGLOBAL v8; // eax
HGLOBAL v9; // eax
HGLOBAL v10; // eax
DWORD* v11; // [esp+Ch] [ebp+8h]
char* pMema; // [esp+10h] [ebp+Ch]
v2 = SessionToGlobalDataPtr((WORD*)a1);
if (!v2)
return 5;
v4 = (LPCVOID*)pMem;
if (!IsValidLPMIXWAVE((int)pMem))
return 5;
v5 = (DWORD * *)(v2 + 122);
pMema = (char*)16;
do
{
v6 = *v5;
if (*v5 != (DWORD*)-1)
{
v11 = 0;
while (v6)
{
if ((LPCVOID*)v6[8] == v4)
{
if (v11)
{
*v11 = *v6;
FreeChannelNode(v6);
v6 = (DWORD*)* v11;
}
else
{
v6 = (DWORD*)* v6;
FreeChannelNode(*v5);
*v5 = v6;
}
}
else
{
v11 = v6;
v6 = (DWORD*)* v6;
}
}
}
++v5;
--pMema;
} while (pMema);
if (v4[4])
{
v7 = GlobalHandle(v4[4]);
GlobalUnlock(v7);
v8 = GlobalHandle(v4[4]);
GlobalFree(v8);
}
*((WORD*)v4 + 32) = 0;
v9 = GlobalHandle(v4);
GlobalUnlock(v9);
v10 = GlobalHandle(v4);
GlobalFree(v10);
return 0;
}
//----- (0101E579) --------------------------------------------------------
WORD* BitsPerSampleAlign(int a1, LPCVOID pMem, int a3, int a4, int a5)
{
WORD* v6; // edi
int v7; // edi
unsigned int v8; // esi
SIZE_T v9; // eax
HGLOBAL v10; // eax
WORD* v11; // eax
WORD* v12; // ecx
WORD* v13; // ebx
_BYTE* v14; // edi
char* i; // edx
HGLOBAL v16; // eax
HGLOBAL v17; // eax
int v18; // [esp+Ch] [ebp+Ch]
if ((WORD)a3 == a4)
return pMem;
if (((WORD)a3 == 8 || (WORD)a3 == 16) && (a4 == 8 || a4 == 16))
{
LOWORD(a1) = (unsigned int)a3 >> 3;
v7 = a1;
v8 = *(DWORD*)a5 / (unsigned int)((unsigned int)a3 >> 3);
v9 = v8 * ((unsigned int)a4 >> 3);
*(DWORD*)a5 = v9;
v10 = GlobalAlloc(0x2002u, v9);
v11 = GlobalLock(v10);
v12 = v11;
if (v11)
{
if ((unsigned int)v7 <= (unsigned int)((unsigned int)a4 >> 3))
{
for (i = (char*)pMem; v8; --v8)
{
LOWORD(v7) = *i;
v7 = (v7 - 128) << 8;
*v11 = v7;
++v11;
++i;
}
}
else
{
v13 = pMem;
v14 = v11;
if (v8)
{
v18 = v8;
do
{
*v14++ = *v13 / 256 + -128;
++v13;
--v18;
} while (v18);
}
}
v6 = v12;
}
else
{
if (dword_1027BE4)
MessageBoxA(
0,
"Unable to allocate memory for waveform data. Try making more memory available by closing other applications.",
"WavMix32",
0x40u);
v6 = 0;
}
}
else
{
v6 = 0;
}
v16 = GlobalHandle(pMem);
GlobalUnlock(v16);
v17 = GlobalHandle(pMem);
GlobalFree(v17);
return v6;
}
// 1027BE4: using guessed type int dword_1027BE4;
//----- (0101E686) --------------------------------------------------------
_BYTE* ChannelAlign(LPCVOID pMem, int a2, int a3, int a4, int a5)
{
unsigned int v6; // edi
SIZE_T v7; // eax
HGLOBAL v8; // eax
_BYTE* v9; // eax
_BYTE* v10; // ebx
unsigned __int8* v11; // ecx
_BYTE* v12; // eax
WORD* v13; // eax
WORD* v14; // esi
HGLOBAL v15; // eax
HGLOBAL v16; // eax
if (a2 == a3)
return pMem;
v6 = *(DWORD*)a5 / (unsigned int)(unsigned int)a4 / (unsigned int)a2;
v7 = v6 * (unsigned int)a4 * (unsigned int)a3;
*(DWORD*)a5 = v7;
v8 = GlobalAlloc(0x2002u, v7);
v9 = GlobalLock(v8);
v10 = v9;
if (v9)
{
v11 = (unsigned __int8*)pMem;
if ((unsigned int)a2 >= (unsigned int)a3)
{
v14 = v9;
if (a4 == 1)
{
for (; v6; --v6)
{
*(_BYTE*)v14 = (*v11 + v11[1]) / 2;
v14 = (WORD*)((char*)v14 + 1);
v11 += 2;
}
}
else
{
for (; v6; --v6)
{
*v14 = (*(signed int*)v11 + *((signed int*)v11 + 1)) / 2;
++v14;
v11 += 4;
}
}
}
else if (a4 == 1)
{
for (; v6; --v6)
{
*v9 = *v11;
v12 = v9 + 1;
*v12 = *v11;
v9 = v12 + 1;
++v11;
}
}
else
{
for (; v6; --v6)
{
*(WORD*)v9 = *(WORD*)v11;
v13 = v9 + 2;
*v13 = *(WORD*)v11;
v9 = v13 + 1;
v11 += 2;
}
}
}
else
{
if (dword_1027BE4)
MessageBoxA(
0,
"Unable to allocate memory for waveform data. Try making more memory available by closing other applications.",
"WavMix32",
0x40u);
v10 = 0;
}
v15 = GlobalHandle(pMem);
GlobalUnlock(v15);
v16 = GlobalHandle(pMem);
GlobalFree(v16);
return v10;
}
// 1027BE4: using guessed type int dword_1027BE4;
//----- (0101E7B0) --------------------------------------------------------
void AvgSample(WORD* a1, unsigned __int8* a2, int a3, int a4, int a5)
{
int v5; // edi
_BYTE* v6; // esi
unsigned __int8* v7; // ecx
int v8; // eax
int v9; // edx
int v10; // ebx
int v11; // edx
signed int* v12; // edi
signed int* v13; // ecx
int v14; // eax
int v15; // esi
int v16; // edx
bool v17; // zf
int v18; // [esp+18h] [ebp+Ch]
if (a4 == 1)
{
v5 = a5;
if (a5 > 0)
{
v6 = a1;
do
{
v7 = a2++;
v8 = 0;
if (a3 > 0)
{
v9 = a3;
do
{
v10 = *v7;
v7 += a5;
--v9;
v8 = v8 + v10 - 128;
} while (v9);
}
*v6++ = (unsigned int)(v8 / a3) + -128;
--v5;
} while (v5);
}
}
else
{
v11 = a5;
v12 = (signed int*)a2;
if (a5 > 0)
{
v18 = a5;
while (1)
{
v13 = v12;
v14 = 0;
++v12;
if (a3 > 0)
{
v15 = a3;
v16 = 2 * v11;
do
{
v14 += *v13;
v13 = (signed int*)((char*)v13 + v16);
--v15;
} while (v15);
}
v17 = v18-- == 1;
*a1 = v14 / a3;
if (v17)
break;
v11 = a5;
}
}
}
}
//----- (0101E83A) --------------------------------------------------------
int RepSample(_BYTE* a1, unsigned __int8* a2, signed int a3, int a4, int a5)
{
int v5; // ebx
int result; // eax
unsigned __int8* v7; // edi
char v8; // cl
_BYTE* v9; // esi
_BYTE* v10; // esi
int v11; // edx
int v12; // ebx
WORD* v13; // esi
WORD* v14; // edi
int v15; // ecx
int v16; // edx
int v17; // [esp+14h] [ebp+8h]
WORD* v18; // [esp+18h] [ebp+Ch]
unsigned __int8* v19; // [esp+20h] [ebp+14h]
if (a4 == 1)
{
v5 = a5;
result = (int)a1;
if (a5 > 0)
{
v7 = a2;
do
{
v8 = *v7;
v9 = a1++;
result = (v7[v5] - *v7) / a3;
*v9 = *v7;
v10 = &v9[v5];
if (a3 > 1)
{
v11 = a3 - 1;
do
{
v8 += result;
*v10 = v8;
v10 += v5;
--v11;
} while (v11);
}
++v7;
--a5;
} while (a5);
}
}
else
{
v19 = a2;
v18 = a1;
result = a5;
if (a5 > 0)
{
v12 = a5;
v17 = a5;
do
{
v13 = v18;
LOWORD(v15) = *(WORD*)v19;
++v18;
v14 = &v13[v12];
result = ((signed int)v13[v12] - *(signed int*)v19) / a3;
*v13 = *(WORD*)v19;
v15 = (signed int)v15;
if (a3 > 1)
{
v16 = a3 - 1;
do
{
v15 += result;
*v14 = v15;
v14 = (WORD*)((char*)v14 + v12 * 2);
--v16;
} while (v16);
}
v19 += 2;
--v17;
} while (v17);
}
}
return result;
}
//----- (0101E8F5) --------------------------------------------------------
LPCVOID SamplesPerSecAlign(LPCVOID pMem, int a2, int a3, int a4, int a5, int a6)
{
LPCVOID result; // eax
DWORD* v7; // ecx
int v8; // edi
unsigned int v9; // eax
int v10; // esi
unsigned int v11; // eax
HGLOBAL v12; // eax
_BYTE* v13; // ebx
HGLOBAL v14; // eax
HGLOBAL v15; // eax
int v16; // ecx
_BYTE* v17; // eax
int v18; // esi
_BYTE* v19; // eax
HGLOBAL v20; // eax
HGLOBAL v21; // eax
int v22; // [esp+8h] [ebp-8h]
LPCVOID v23; // [esp+Ch] [ebp-4h]
int v24; // [esp+1Ch] [ebp+Ch]
int v25; // [esp+1Ch] [ebp+Ch]
int v26; // [esp+20h] [ebp+10h]
int v27; // [esp+20h] [ebp+10h]
unsigned int v28; // [esp+2Ch] [ebp+1Ch]
if (a2 == a3)
return pMem;
v7 = (DWORD*)a6;
v8 = (unsigned int)a4 * (unsigned int)a5;
v28 = *(DWORD*)a6 / (unsigned int)v8;
if (a3 <= (unsigned int)a2)
{
v11 = a2 / (unsigned int)a3;
v24 = 0;
v26 = v11;
v10 = v28 / v11;
}
else
{
v9 = a3 / (unsigned int)a2;
v26 = 0;
v24 = v9;
v10 = v28 * v9;
}
*v7 = v8 * v10;
v12 = GlobalAlloc(0x2002u, v8 * v10);
v13 = GlobalLock(v12);
if (v13)
{
v23 = pMem;
v22 = (int)v13;
if (v24 <= 0)
{
if (v10 != 1)
{
v25 = v10 - 1;
do
{
AvgSample(v13, (unsigned __int8*)pMem, v26, (unsigned int)a4, (unsigned int)a5);
pMem = (char*)pMem + v8 * v26;
v13 += v8;
--v25;
} while (v25);
}
if (v8 > 0)
{
v19 = pMem;
do
{
*v13++ = *v19++;
--v8;
} while (v8);
}
}
else
{
if (v28 != 1)
{
v27 = v28 - 1;
do
{
RepSample(v13, (unsigned __int8*)pMem, v24, (unsigned int)a4, (unsigned int)a5);
pMem = (char*)pMem + v8;
v13 += v8 * v24;
--v27;
} while (v27);
}
v16 = v24;
if (v24 > 0)
{
do
{
v17 = pMem;
if (v8 > 0)
{
v18 = (unsigned int)a4 * (unsigned int)a5;
do
{
*v13++ = *v17++;
--v18;
} while (v18);
}
--v16;
} while (v16);
}
}
v20 = GlobalHandle(v23);
GlobalUnlock(v20);
v21 = GlobalHandle(v23);
GlobalFree(v21);
result = (LPCVOID)v22;
}
else
{
if (dword_1027BE4)
MessageBoxA(
0,
"Unable to allocate memory for waveform data. Try making more memory available by closing other applications.",
"WavMix32",
0x40u);
v14 = GlobalHandle(pMem);
GlobalUnlock(v14);
v15 = GlobalHandle(pMem);
GlobalFree(v15);
result = 0;
}
return result;
}
// 1027BE4: using guessed type int dword_1027BE4;
//----- (0101EA82) --------------------------------------------------------
LPCVOID WaveFormatConvert(int a1, int a2, LPCVOID pMem, int a4)
{
LPCVOID result; // eax
WORD* v5; // eax
_BYTE* v6; // eax
if (*(WORD*)(a2 + 2) == *(WORD*)(a1 + 2)
&& *(DWORD*)(a2 + 4) == *(DWORD*)(a1 + 4)
&& *(WORD*)(a2 + 14) == *(WORD*)(a1 + 14))
{
return pMem;
}
v5 = BitsPerSampleAlign(*(unsigned int*)(a2 + 14), pMem, *(unsigned int*)(a2 + 14), *(WORD*)(a1 + 14), a4);
if (v5 && (v6 = ChannelAlign(v5, *(WORD*)(a2 + 2), *(WORD*)(a1 + 2), *(WORD*)(a1 + 14) >> 3, a4)) != 0)
result = SamplesPerSecAlign(
v6,
*(DWORD*)(a2 + 4),
*(DWORD*)(a1 + 4),
*(WORD*)(a1 + 14) >> 3,
*(WORD*)(a1 + 2),
a4);
else
result = 0;
return result;
}
//----- (0101EB23) --------------------------------------------------------
CHAR* WaveMixOpenWave(LPCVOID pMem, LPCSTR lpName, HMODULE hModule, LONG cch)
{
WORD* v4; // eax
WORD v5; // cx
HGLOBAL v7; // eax
CHAR* v8; // edi
HRSRC v9; // eax
HRSRC v10; // esi
HGLOBAL v11; // eax
HGLOBAL v12; // eax
HGLOBAL v13; // eax
HGLOBAL v14; // eax
HGLOBAL v15; // eax
void* v16; // eax
const void* v17; // esi
LONG v18; // eax
LPCVOID v19; // esi
const void* v20; // ST08_4
int v21; // eax
int v22; // eax
const CHAR* v23; // [esp-10h] [ebp-A4h]
UINT v24; // [esp-Ch] [ebp-A0h]
struct _MMIOINFO pmmioinfo; // [esp+4h] [ebp-90h]
struct _MMCKINFO pmmcki; // [esp+4Ch] [ebp-48h]
HWAVEOUT phwo; // [esp+60h] [ebp-34h]
struct _MMCKINFO v28; // [esp+64h] [ebp-30h]
WAVEFORMATEX pwfx; // [esp+78h] [ebp-1Ch]
LPCVOID v30; // [esp+8Ch] [ebp-8h]
HGLOBAL hResData; // [esp+90h] [ebp-4h]
HMMIO hModulea; // [esp+A4h] [ebp+10h]
hResData = 0;
v30 = 0;
v4 = SessionToGlobalDataPtr(pMem);
pwfx.wFormatTag = v4[190];
pwfx.nChannels = v4[191];
pwfx.nSamplesPerSec = *((DWORD*)v4 + 96);
pwfx.nAvgBytesPerSec = *((DWORD*)v4 + 97);
v5 = v4[196];
hMem = (LPARAM)v4;
pwfx.nBlockAlign = v5;
pwfx.wBitsPerSample = v4[197];
pwfx.cbSize = 0;
if (waveOutOpen(&phwo, 0xFFFFFFFF, &pwfx, 0, 0, 1u))
{
if (dword_1027BE4)
MessageBoxA(0, "The waveform device can't play this format.", "WavMix32", 0x30u);
return 0;
}
v7 = GlobalAlloc(0x2040u, 0x42u);
v8 = (CHAR*)GlobalLock(v7);
if (!v8)
{
if (dword_1027BE4)
MessageBoxA(
0,
"Unable to allocate memory for waveform data. Try making more memory available by closing other applications.",
"WavMix32",
0x40u);
return 0;
}
if (cch & 2)
{
v9 = FindResourceA(hModule, lpName, "WAVE");
v10 = v9;
if (!v9 || (hResData = LoadResource(hModule, v9)) == 0)
{
if (HIWORD(lpName))
_wsprintfA(aWavemixV23ByAn, "Failed to open 'WAVE' resource '%s'.", lpName);
else
_wsprintfA(aWavemixV23ByAn, "Failed to open 'WAVE' resource %u.", (unsigned int)lpName);
if (dword_1027BE4)
MessageBoxA(0, aWavemixV23ByAn, "WavMix32", 0x30u);
goto LABEL_31;
}
memset(&pmmioinfo, 0, sizeof(pmmioinfo));
pmmioinfo.pchBuffer = (HPSTR)LockResource(hResData);
if (!pmmioinfo.pchBuffer)
{
if (dword_1027BE4)
MessageBoxA(0, "Failed to lock 'WAVE' resource", "WavMix32", 0x30u);
FreeResource(hResData);
hResData = 0;
LABEL_31:
v11 = GlobalHandle(v8);
GlobalUnlock(v11);
v12 = GlobalHandle(v8);
GlobalFree(v12);
if (v30)
{
v13 = GlobalHandle(v30);
GlobalUnlock(v13);
v14 = GlobalHandle(v30);
GlobalFree(v14);
}
if (hResData)
FreeResource(hResData);
return 0;
}
pmmioinfo.cchBuffer = SizeofResource(hModule, v10);
pmmioinfo.fccIOProc = 541934925;
pmmioinfo.adwInfo[0] = 0;
hModulea = mmioOpenA(0, &pmmioinfo, 0);
if (!hModulea)
{
if (!dword_1027BE4)
goto LABEL_29;
v24 = pmmioinfo.wErrorRet;
v23 = "Failed to open resource, mmioOpen error=%u.\nMay need to make sure resource is marked read-write";
goto LABEL_28;
}
}
else if (cch & 4)
{
qmemcpy(&pmmioinfo, lpName, sizeof(pmmioinfo));
hModulea = mmioOpenA(0, &pmmioinfo, 0);
if (!hModulea)
{
if (!dword_1027BE4)
goto LABEL_29;
v24 = pmmioinfo.wErrorRet;
v23 = "Failed to open memory file, mmioOpen error=%u.\nMay need to make sure memory is read-write";
LABEL_28:
_wsprintfA(aWavemixV23ByAn, v23, v24);
MessageBoxA(0, aWavemixV23ByAn, "WavMix32", 0x30u);
LABEL_29:
if (hModulea)
mmioClose(hModulea, 0);
goto LABEL_31;
}
}
else
{
hModulea = mmioOpenA((LPSTR)lpName, 0, 0x10000u);
if (!hModulea)
{
if (dword_1027BE4)
{
_wsprintfA(aWavemixV23ByAn, "Failed to open wave file %s.", lpName);
MessageBoxA(0, aWavemixV23ByAn, "WavMix32", 0x30u);
}
goto LABEL_29;
}
}
pmmcki.fccType = 1163280727;
if (mmioDescend(hModulea, &pmmcki, 0, 0x20u))
{
if (dword_1027BE4)
MessageBoxA(0, "This is not a WAVE file.", "WavMix32", 0x30u);
goto LABEL_29;
}
v28.ckid = 544501094;
if (mmioDescend(hModulea, &v28, &pmmcki, 0x10u))
{
if (dword_1027BE4)
MessageBoxA(0, "WAVE file is corrupted.", "WavMix32", 0x30u);
goto LABEL_29;
}
if (mmioRead(hModulea, v8, 16) != 16)
{
if (dword_1027BE4)
MessageBoxA(0, "Failed to read format chunk.", "WavMix32", 0x30u);
goto LABEL_29;
}
if (*(WORD*)v8 != 1)
{
if (dword_1027BE4)
MessageBoxA(0, "The file is not a PCM file.", "WavMix32", 0x30u);
goto LABEL_29;
}
mmioAscend(hModulea, &v28, 0);
v28.ckid = 1635017060;
if (mmioDescend(hModulea, &v28, &pmmcki, 0x10u))
{
if (dword_1027BE4)
MessageBoxA(0, "WAVE file has no data chunk.", "WavMix32", 0x30u);
goto LABEL_29;
}
cch = v28.cksize;
if (!v28.cksize)
{
if (dword_1027BE4)
MessageBoxA(0, "The data chunk has no data.", "WavMix32", 0x30u);
goto LABEL_29;
}
v15 = GlobalAlloc(0x2002u, v28.cksize);
v16 = GlobalLock(v15);
v17 = v16;
v30 = v16;
if (!v16)
{
if (dword_1027BE4)
MessageBoxA(
0,
"Unable to allocate memory for waveform data. Try making more memory available by closing other applications.",
"WavMix32",
0x40u);
goto LABEL_29;
}
v18 = mmioRead(hModulea, (HPSTR)v16, cch);
if (v18 != cch)
{
if (dword_1027BE4)
MessageBoxA(0, "Failed to read data chunk.", "WavMix32", 0x30u);
goto LABEL_29;
}
v19 = WaveFormatConvert(hMem + 380, (int)v8, v17, (int)& cch);
v30 = v19;
if (!v19)
{
if (dword_1027BE4)
MessageBoxA(0, "Failed to convert wave format.", "WavMix32", 0x30u);
goto LABEL_29;
}
mmioClose(hModulea, 0);
if (hResData)
FreeResource(hResData);
*((DWORD*)v8 + 5) = cch;
v20 = (const void*)(hMem + 380);
*((DWORD*)v8 + 4) = v19;
*((DWORD*)v8 + 8) = 0;
*((DWORD*)v8 + 9) = 0;
*((DWORD*)v8 + 7) = 0;
*((WORD*)v8 + 32) = 21554;
_memmove(v8, v20, 0x10u);
if (HIWORD(lpName))
{
v21 = lstrlenA(lpName);
if (v21 > 15)
v22 = v21 - 15;
else
v22 = 0;
lstrcpyA(v8 + 48, &lpName[v22]);
}
else
{
_wsprintfA(v8 + 48, "res#%u", (unsigned int)lpName);
}
return v8;
}
// 1027BE4: using guessed type int dword_1027BE4;
//----- (0101F093) --------------------------------------------------------
unsigned int FigureOutDMABufferSize(unsigned int a1, int a2)
{
unsigned int result; // eax
signed int v3; // ecx
result = a1;
if (!a1)
result = *(DWORD*)(a2 + 4) * *(unsigned int*)(a2 + 2) * ((unsigned int) * (unsigned int*)(a2 + 14) >> 3) >> 4;
v3 = 344;
if (result < 0x158 || (v3 = 11025, result > 0x2B11))
result = v3;
return result;
}
//----- (0101F0D4) --------------------------------------------------------
int RemoveInvalidIniNameCharacters(LPCSTR lpString)
{
CHAR* v1; // esi
v1 = (CHAR*)lpString;
if (!lpString || !*lpString)
return 0;
do
{
if (!_isalnum(*v1) && !_isspace(*v1))
break;
++v1;
} while (*v1);
do
*v1-- = 0;
while (v1 >= lpString && _isspace(*v1));
return lstrlenA(lpString);
}
//----- (0101F13D) --------------------------------------------------------
UINT ShowWaveOutDevices()
{
UINT result; // eax
signed int v1; // [esp+0h] [ebp-40h]
signed int uDeviceID; // [esp+4h] [ebp-3Ch]
struct tagWAVEOUTCAPSA pwoc; // [esp+8h] [ebp-38h]
result = waveOutGetNumDevs();
v1 = result;
if (result)
{
_wsprintfA(aWavemixV23ByAn, "%d waveOut Devices have been detected on your system.", result);
result = MessageBoxA(0, aWavemixV23ByAn, "WavMix32", 0x40u);
for (uDeviceID = 0; uDeviceID < v1; result = uDeviceID)
{
if (!waveOutGetDevCapsA(uDeviceID, &pwoc, 0x34u) && RemoveInvalidIniNameCharacters(pwoc.szPname))
_wsprintfA(
aWavemixV23ByAn,
"Device %i: %s\n\tVersion %u.%u",
uDeviceID,
pwoc.szPname,
BYTE1(pwoc.vDriverVersion),
LOBYTE(pwoc.vDriverVersion));
else
_wsprintfA(aWavemixV23ByAn, "waveOutGetDevCaps failed (err %u) for device %d", 1, uDeviceID);
MessageBoxA(0, aWavemixV23ByAn, "WavMix32", 0x40u);
++uDeviceID;
}
}
return result;
}
//----- (0101F20F) --------------------------------------------------------
const char* GetOperatingSystemPrefix()
{
const char* result; // eax
bool v1; // cf
if (GetVersion() < 0x80000000)
return "WinNT:";
if (GetVersion() >= 0x80000000 && (unsigned __int8)GetVersion() >= 4u)
return "Win95:";
if (GetVersion() < 0x80000000 || (v1 = (unsigned __int8)GetVersion() < 4u, result = "Win31:", !v1))
result = "OS_X:";
return result;
}
//----- (0101F25C) --------------------------------------------------------
int ReadRegistryToGetMachineSpecificInfSection(int a1, LPSTR lpString1, int a3)
{
const char* v3; // eax
int v4; // esi
const char* v6; // eax
LONG cbData; // [esp+Ch] [ebp-44h]
int v8; // [esp+10h] [ebp-40h]
HKEY phkResult; // [esp+14h] [ebp-3Ch]
CHAR SubKey; // [esp+18h] [ebp-38h]
v8 = 0;
v3 = GetOperatingSystemPrefix();
v4 = lstrlenA(v3);
if (a3 < v4 + 10)
return 0;
_wsprintfA(&SubKey, "Device%u", a1);
if (RegOpenKeyA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\WaveMix", &phkResult))
return 0;
v6 = GetOperatingSystemPrefix();
lstrcpyA(lpString1, v6);
cbData = a3 - v4;
if (!RegQueryValueA(phkResult, &SubKey, &lpString1[v4], &cbData) && cbData > 0)
v8 = 1;
RegCloseKey(phkResult);
return v8;
}
//----- (0101F315) --------------------------------------------------------
int ReadRegistryInt(HKEY hKey, LPCSTR lpSubKey, int a3)
{
int result; // eax
LONG cbData; // [esp+0h] [ebp-14h]
CHAR Data; // [esp+4h] [ebp-10h]
if (!hKey || (cbData = 10, RegQueryValueA(hKey, lpSubKey, &Data, &cbData)))
result = a3;
else
result = _atol(&Data);
return result;
}
//----- (0101F36B) --------------------------------------------------------
signed int ReadRegistryForAppSpecificConfigs(int a1)
{
int v1; // ebx
int v3; // eax
int v4; // eax
struct tagWAVEOUTCAPSA* v5; // ST04_4
UINT_PTR v6; // ST00_4
HKEY phkResult; // [esp+8h] [ebp-3Ch]
CHAR SubKey; // [esp+Ch] [ebp-38h]
v1 = *(DWORD*)(a1 + 2);
if (!(v1 & 0x400) || !*(DWORD*)(a1 + 26))
return 0;
if ((v1 & 0x80u) == 0)
{
*(WORD*)(a1 + 20) = *(WORD*)(hMem + 24);
}
else if (*(unsigned int*)(a1 + 20) >= waveOutGetNumDevs())
{
*(WORD*)(a1 + 20) = 0;
}
_wsprintfA(&SubKey, "WaveMix\\Device%u", *(unsigned int*)(a1 + 20));
if (RegOpenKeyA(*(HKEY*)(a1 + 26), &SubKey, &phkResult))
return 0;
if (!(v1 & 1))
* (WORD*)(a1 + 6) = ReadRegistryInt(phkResult, "Channels", 1);
if (!(v1 & 2))
* (WORD*)(a1 + 8) = ReadRegistryInt(phkResult, "SamplesPerSec", 11);
if (!(v1 & 4))
* (WORD*)(a1 + 10) = ReadRegistryInt(phkResult, "WaveBlocks", 3);
if (!(v1 & 8))
* (WORD*)(a1 + 12) = ReadRegistryInt(phkResult, "WaveBlockLen", 0);
*(WORD*)(a1 + 14) = 1;
if (!(v1 & 0x20))
* (WORD*)(a1 + 16) = (unsigned int)ReadRegistryInt(phkResult, "Remix", 1) != 2;
if (!(v1 & 0x40))
{
v3 = DefaultGoodWavePos(*(unsigned int*)(a1 + 20));
*(WORD*)(a1 + 18) = (unsigned int)ReadRegistryInt(phkResult, "GoodWavePos", v3) != 0;
}
if (!(v1 & 0x100))
* (WORD*)(a1 + 24) = ReadRegistryInt(phkResult, "ShowDebugDialogs", 0);
if (!(v1 & 0x200))
{
v4 = DefaultPauseBlocks(*(unsigned int*)(a1 + 10));
*(WORD*)(a1 + 22) = ReadRegistryInt(phkResult, "PauseBlocks", v4);
}
v5 = (struct tagWAVEOUTCAPSA*)(hMem + 124);
v6 = *(unsigned int*)(a1 + 20);
*(DWORD*)(a1 + 2) = 1023;
waveOutGetDevCapsA(v6, v5, 0x34u);
RegCloseKey(phkResult);
return 1;
}
//----- (0101F50B) --------------------------------------------------------
int ShowCurrentSettings()
{
const char* v0; // esi
const char* v1; // edx
const char* v2; // ecx
struct tagWAVEOUTCAPSA pwoc; // [esp+0h] [ebp-38h]
if (waveOutGetDevCapsA(*(DWORD*)(hMem + 24), &pwoc, 0x34u) || !RemoveInvalidIniNameCharacters(pwoc.szPname))
lstrcpyA(pwoc.szPname, "Unknown Device");
v0 = "cmixit";
if (*(int (**)(_BYTE*, char*, char*, int, unsigned int))(hMem + 428) != cmixit)
v0 = "386 mixit";
v1 = "TRUE";
if (!*(DWORD*)(hMem + 420))
v1 = "FALSE";
v2 = "Reset";
if (*(signed int (**)(int, int))(hMem + 432) != ResetRemix)
v2 = "NoReset";
_wsprintfA(
aWavemixV23ByAn,
"Using:\t%s.\n"
"\tRemix = %s\n"
"\tGoodGetPos=%s\n"
"\t%d ping pong wave blocks\n"
"\tWave block len = %lu bytes\n"
"\tpfnMixit=%s\n"
"\tSamplesPerSec=%lu,\n"
"\tChannels=%d\n"
"\tPauseBlocks=%d",
pwoc.szPname,
v2,
v1,
*(DWORD*)(hMem + 400),
*(DWORD*)(hMem + 396),
v0,
*(DWORD*)(hMem + 384),
*(unsigned int*)(hMem + 382),
*(DWORD*)(hMem + 404));
return MessageBoxA(0, aWavemixV23ByAn, "WavMix32", 0x40u);
}
//----- (0101F5F1) --------------------------------------------------------
int Settings_OnInitDialog(HWND hWnd, int a2, int a3)
{
BOOL v3; // ST0C_4
HWND v4; // eax
BOOL v5; // ST0C_4
HWND v6; // eax
BOOL v7; // ST0C_4
HWND v8; // eax
BOOL v9; // ST0C_4
HWND v10; // eax
BOOL v11; // ST0C_4
HWND v12; // eax
HWND v13; // eax
HWND v14; // eax
HWND v15; // eax
HWND v16; // eax
HWND v17; // eax
HWND v18; // eax
HWND v19; // eax
HWND v20; // eax
HWND v21; // eax
HWND v22; // eax
HWND v23; // eax
HWND v24; // eax
HWND v25; // eax
HWND v26; // eax
HWND v27; // eax
HWND v28; // eax
HWND v29; // eax
MMRESULT v30; // eax
HWND v31; // eax
WPARAM v32; // ST0C_4
HWND v33; // eax
signed int v35; // [esp+Ch] [ebp-148h]
signed int uDeviceID; // [esp+10h] [ebp-144h]
struct tagWAVEOUTCAPSA pwoc; // [esp+1Ch] [ebp-138h]
CHAR String; // [esp+50h] [ebp-104h]
GetWindowTextA(hWnd, &String, 256);
_wsprintfA(aWavemixV23ByAn, &String, 2, 81);
SetWindowTextA(hWnd, aWavemixV23ByAn);
SetWindowLongA(hWnd, -21, a3);
v3 = *(WORD*)(a3 + 6) > 1u;
v4 = GetDlgItem(hWnd, 1000);
SendMessageA(v4, 0xF1u, v3, 0);
v5 = *(WORD*)(a3 + 16) != 0;
v6 = GetDlgItem(hWnd, 1001);
SendMessageA(v6, 0xF1u, v5, 0);
v7 = *(WORD*)(a3 + 18) != 0;
v8 = GetDlgItem(hWnd, 1004);
SendMessageA(v8, 0xF1u, v7, 0);
v9 = *(WORD*)(a3 + 14) != 0;
v10 = GetDlgItem(hWnd, 1005);
SendMessageA(v10, 0xF1u, v9, 0);
v11 = *(WORD*)(a3 + 24) != 0;
v12 = GetDlgItem(hWnd, 1010);
SendMessageA(v12, 0xF1u, v11, 0);
v13 = GetDlgItem(hWnd, 1005);
EnableWindow(v13, 0);
v14 = GetDlgItem(hWnd, 1003);
SendMessageA(v14, 0xC5u, 2u, 0);
v15 = GetDlgItem(hWnd, 1007);
SendMessageA(v15, 0xC5u, 4u, 0);
v16 = GetDlgItem(hWnd, 1008);
SendMessageA(v16, 0xC5u, 2u, 0);
v17 = GetDlgItem(hWnd, 1011);
SendMessageA(v17, 0xC5u, 2u, 0);
v18 = GetDlgItem(hWnd, 1012);
GetWindowTextA(v18, &String, 100);
_wsprintfA(aWavemixV23ByAn, &String, 2, 10);
v19 = GetDlgItem(hWnd, 1012);
SetWindowTextA(v19, aWavemixV23ByAn);
v20 = GetDlgItem(hWnd, 1013);
GetWindowTextA(v20, &String, 100);
_wsprintfA(aWavemixV23ByAn, &String, 344, 11025);
v21 = GetDlgItem(hWnd, 1013);
SetWindowTextA(v21, aWavemixV23ByAn);
v22 = GetDlgItem(hWnd, 1014);
GetWindowTextA(v22, &String, 100);
_wsprintfA(aWavemixV23ByAn, &String, 0, 10);
v23 = GetDlgItem(hWnd, 1014);
SetWindowTextA(v23, aWavemixV23ByAn);
v24 = GetDlgItem(hWnd, 1015);
GetWindowTextA(v24, &String, 100);
_wsprintfA(aWavemixV23ByAn, &String, 16);
v25 = GetDlgItem(hWnd, 1015);
SetWindowTextA(v25, aWavemixV23ByAn);
_wsprintfA(aWavemixV23ByAn, "%d", *(unsigned int*)(a3 + 10));
v26 = GetDlgItem(hWnd, 1003);
SetWindowTextA(v26, aWavemixV23ByAn);
_wsprintfA(aWavemixV23ByAn, "%d", *(unsigned int*)(a3 + 12));
v27 = GetDlgItem(hWnd, 1007);
SetWindowTextA(v27, aWavemixV23ByAn);
_wsprintfA(aWavemixV23ByAn, "%d", *(unsigned int*)(a3 + 8));
v28 = GetDlgItem(hWnd, 1008);
SetWindowTextA(v28, aWavemixV23ByAn);
_wsprintfA(aWavemixV23ByAn, "%d", *(unsigned int*)(a3 + 22));
v29 = GetDlgItem(hWnd, 1011);
SetWindowTextA(v29, aWavemixV23ByAn);
uDeviceID = 0;
v35 = waveOutGetNumDevs();
if (v35 > 0)
{
do
{
v30 = waveOutGetDevCapsA(uDeviceID, &pwoc, 0x34u);
if (v30)
{
_wsprintfA(aWavemixV23ByAn, "waveOutGetDevCaps failed (err %u) for device %d", v30, uDeviceID);
MessageBoxA(0, aWavemixV23ByAn, "WavMix32", 0x40u);
}
else
{
_wsprintfA(aWavemixV23ByAn, "%d: %s", uDeviceID, pwoc.szPname);
v31 = GetDlgItem(hWnd, 1009);
SendMessageA(v31, 0x143u, 0, (LPARAM)aWavemixV23ByAn);
}
++uDeviceID;
} while (uDeviceID < v35);
}
v32 = *(unsigned int*)(a3 + 20);
v33 = GetDlgItem(hWnd, 1009);
SendMessageA(v33, 0x14Eu, v32, 0);
return 1;
}
//----- (0101FA63) --------------------------------------------------------
int Settings_OnCommand(HWND hWnd, int a2, int a3, int a4)
{
WORD* v4; // ebx
HWND v6; // eax
HWND v7; // eax
HWND v8; // eax
HWND v9; // eax
HWND v10; // eax
HWND v11; // eax
HWND v12; // eax
HWND v13; // eax
HWND v14; // eax
HWND v15; // eax
int v16; // ax
v4 = (WORD*)GetWindowLongA(hWnd, -21);
if (a2 == 1)
{
if (v4)
{
v6 = GetDlgItem(hWnd, 1000);
v4[3] = (SendMessageA(v6, 0xF0u, 0, 0) != 0) + 1;
v7 = GetDlgItem(hWnd, 1001);
v4[8] = SendMessageA(v7, 0xF0u, 0, 0) != 0;
v8 = GetDlgItem(hWnd, 1004);
v4[9] = SendMessageA(v8, 0xF0u, 0, 0) != 0;
v9 = GetDlgItem(hWnd, 1010);
v4[12] = SendMessageA(v9, 0xF0u, 0, 0) != 0;
v10 = GetDlgItem(hWnd, 1005);
v4[7] = SendMessageA(v10, 0xF0u, 0, 0) != 0;
v11 = GetDlgItem(hWnd, 1003);
GetWindowTextA(v11, aWavemixV23ByAn, 10);
v4[5] = _atoi(aWavemixV23ByAn);
v12 = GetDlgItem(hWnd, 1007);
GetWindowTextA(v12, aWavemixV23ByAn, 10);
v4[6] = _atoi(aWavemixV23ByAn);
v13 = GetDlgItem(hWnd, 1008);
GetWindowTextA(v13, aWavemixV23ByAn, 10);
v4[4] = _atoi(aWavemixV23ByAn);
v14 = GetDlgItem(hWnd, 1011);
GetWindowTextA(v14, aWavemixV23ByAn, 10);
v4[11] = _atoi(aWavemixV23ByAn);
v15 = GetDlgItem(hWnd, 1009);
GetWindowTextA(v15, aWavemixV23ByAn, 10);
if (_isdigit(aWavemixV23ByAn[0]))
v16 = _atoi(aWavemixV23ByAn);
else
v16 = 0;
v4[10] = v16;
EndDialog(hWnd, 1);
}
}
else
{
if (a2 != 2)
return 0;
EndDialog(hWnd, 0);
}
return 1;
}
//----- (0101FC24) --------------------------------------------------------
BOOL SettingsDlgProc(HWND hWnd, UINT a2, WPARAM a3, LPARAM a4)
{
if (a2 == 272)
return Settings_OnInitDialog(hWnd, a3, a4);
if (a2 != 273)
return 0;
Settings_OnCommand(hWnd, (unsigned int)a3, a4, a3 >> 16);
return 1;
}
//----- (0101FC6D) --------------------------------------------------------
DWORD* MakeDlgTemplate(int a1, int a2, int a3, int a4, int a5, int a6, wchar_t* Str)
{
size_t v7; // eax
HGLOBAL v8; // eax
DWORD* v9; // ebx
v7 = 2 * _wcslen(Str) + 24;
*(DWORD*)a1 = v7;
if (v7 & 3)
* (DWORD*)a1 = v7 - (v7 & 3) + 4;
v8 = GlobalAlloc(0x42u, *(DWORD*)a1);
v9 = GlobalLock(v8);
if (v9)
{
v9[1] = 0;
*((WORD*)v9 + 4) = 0;
*v9 = a2 | 0x10000000;
*((WORD*)v9 + 5) = a3;
*((WORD*)v9 + 6) = a4;
*((WORD*)v9 + 7) = a5;
*((WORD*)v9 + 8) = a6;
qmemcpy((char*)v9 + 22, Str, 2 * _wcslen(Str) + 2);
}
return v9;
}
//----- (0101FD0E) --------------------------------------------------------
WORD* AddDlgControl(int a1, LPCVOID pMem, int a3, int a4, int a5, int a6, int a7, int a8, int a9, wchar_t* Str)
{
const void* v10; // edi
HGLOBAL v11; // eax
SIZE_T v12; // ST04_4
HGLOBAL v13; // eax
HGLOBAL v14; // eax
int v15; // eax
char* pMema; // [esp+10h] [ebp+Ch]
v10 = pMem;
if (pMem)
{
pMema = *(char**)a1;
*(DWORD*)a1 += 2 * _wcslen(Str) + 25;
if (*(DWORD*)a1 & 3)
* (DWORD*)a1 = *(DWORD*)a1 - (*(DWORD*)a1 & 3) + 4;
v11 = GlobalHandle(v10);
GlobalUnlock(v11);
v12 = *(DWORD*)a1;
v13 = GlobalHandle(v10);
v14 = GlobalReAlloc(v13, v12, 0x42u);
v10 = GlobalLock(v14);
if (v10)
{
v15 = (int)& pMema[(DWORD)v10];
*(DWORD*)(v15 + 4) = 0;
*(DWORD*)v15 = a4 | 0x50000000;
*(WORD*)(v15 + 8) = a6;
*(WORD*)(v15 + 10) = a7;
*(WORD*)(v15 + 12) = a8;
*(WORD*)(v15 + 14) = a9;
*(WORD*)(v15 + 16) = a5;
*(DWORD*)(v15 + 18) = ((unsigned int)a3 << 16) | 0xFFFF;
_wcscpy((wchar_t*)& pMema[(DWORD)v10 + 22], Str);
++* ((WORD*)v10 + 4);
}
}
return v10;
}
//----- (0101FDE1) --------------------------------------------------------
WORD* MakeSettingsDlgTemplate()
{
DWORD* v0; // eax
WORD* v1; // eax
WORD* v2; // eax
WORD* v3; // eax
WORD* v4; // eax
WORD* v5; // eax
WORD* v6; // eax
WORD* v7; // eax
WORD* v8; // eax
WORD* v9; // eax
WORD* v10; // eax
WORD* v11; // eax
WORD* v12; // eax
WORD* v13; // eax
WORD* v14; // eax
WORD* v15; // eax
WORD* v16; // eax
WORD* v17; // eax
int v19; // [esp+Ch] [ebp-4h]
v19 = 0;
v0 = MakeDlgTemplate((int)& v19, -2134376320, 0, 0, 212, 132, L"WavMix32 Settings (Ver %X.%X Static)");
v1 = AddDlgControl((int)& v19, v0, 128, 65537, 1, 155, 5, 50, 14, L"&Ok");
v2 = AddDlgControl((int)& v19, v1, 128, 0x10000, 2, 155, 25, 50, 14, L"&Cancel");
v3 = AddDlgControl((int)& v19, v2, 130, 0, 1012, 5, 5, 115, 8, L"Number of WaveBlocks (%d-%d):");
v4 = AddDlgControl((int)& v19, v3, 130, 0, 1013, 5, 20, 115, 8, L"Size of WaveBlocks (%d-%d):");
v5 = AddDlgControl((int)& v19, v4, 130, 0, 0xFFFF, 5, 35, 102, 8, L"Playback Frequency (11,22,44):");
v6 = AddDlgControl((int)& v19, v5, 130, 0, 0xFFFF, 5, 80, 57, 8, L"Playback Device:");
v7 = AddDlgControl((int)& v19, v6, 130, 0, 1014, 5, 50, 115, 8, L"Number of Pause Blocks (%d-%d):");
v8 = AddDlgControl((int)& v19, v7, 130, 0, 1015, 5, 65, 63, 8, L"Max Channels = %d");
v9 = AddDlgControl((int)& v19, v8, 129, 8454272, 1003, 125, 5, 25, 12, L"-1");
v10 = AddDlgControl((int)& v19, v9, 129, 8454272, 1007, 125, 20, 25, 12, L"-1");
v11 = AddDlgControl((int)& v19, v10, 129, 8454272, 1008, 125, 35, 25, 12, L"-1");
v12 = AddDlgControl((int)& v19, v11, 129, 8454272, 1011, 125, 50, 25, 12, L"-1");
v13 = AddDlgControl((int)& v19, v12, 133, 2162946, 1009, 65, 80, 140, 60, L"No Devices");
v14 = AddDlgControl((int)& v19, v13, 128, 65539, 1000, 5, 101, 40, 10, L"Stereo");
v15 = AddDlgControl((int)& v19, v14, 128, 65539, 1001, 55, 101, 60, 10, L"Reset Remix");
v16 = AddDlgControl((int)& v19, v15, 128, 65539, 1010, 125, 101, 78, 10, L"Show Debug Dialogs");
v17 = AddDlgControl((int)& v19, v16, 128, 65539, 1005, 5, 117, 40, 10, L"CMixit");
return AddDlgControl((int)& v19, v17, 128, 65539, 1004, 55, 117, 75, 10, L"Good Get Position");
}
//----- (01020059) --------------------------------------------------------
void DestroySettingsDlgTemplate(LPCVOID pMem)
{
HGLOBAL v1; // eax
HGLOBAL v2; // eax
if (pMem)
{
v1 = GlobalHandle(pMem);
GlobalUnlock(v1);
v2 = GlobalHandle(pMem);
GlobalFree(v2);
}
}
//----- (0102008D) --------------------------------------------------------
signed int WaveMixGetConfig(WORD* a1, int a2)
{
WORD* v2; // eax
int v4; // ebx
v2 = SessionToGlobalDataPtr(a1);
hMem = (LPARAM)v2;
if (!v2)
return 5;
if (!a2)
return 11;
v4 = *(DWORD*)(a2 + 2);
if (v4 & 1)
* (WORD*)(a2 + 6) = v2[191];
if (v4 & 2)
* (WORD*)(a2 + 8) = 11 * (*((DWORD*)v2 + 96) / 0x2B11u);
if (v4 & 4)
* (WORD*)(a2 + 10) = v2[200];
if (v4 & 8)
* (WORD*)(a2 + 12) = v2[198];
if (v4 & 0x10)
* (WORD*)(a2 + 14) = *((DWORD*)v2 + 107) == (DWORD)cmixit;
if (v4 & 0x20)
* (WORD*)(a2 + 16) = *((DWORD*)v2 + 108) == (DWORD)ResetRemix;
if (v4 & 0x40)
* (WORD*)(a2 + 18) = v2[210];
if ((v4 & 0x80u) != 0)
* (WORD*)(a2 + 20) = v2[12];
if (v4 & 0x100)
* (WORD*)(a2 + 24) = dword_1027BE4 != 0;
if (v4 & 0x200)
* (WORD*)(a2 + 22) = v2[202];
return 0;
}
// 1027BE4: using guessed type int dword_1027BE4;
//----- (0102018C) --------------------------------------------------------
BOOL SaveConfigSettings(int a1)
{
BOOL result; // eax
if ((a1 & 0x80u) != 0)
{
_wsprintfA(aWavemixV23ByAn, "%d", *(DWORD*)(hMem + 24));
result = WritePrivateProfileStringA("general", "WaveOutDevice", aWavemixV23ByAn, FileName);
}
if (a1 & 1)
{
_wsprintfA(aWavemixV23ByAn, "%d", *(unsigned int*)(hMem + 382));
result = WritePrivateProfileStringA((LPCSTR)(hMem + 28), "Channels", aWavemixV23ByAn, FileName);
}
if (a1 & 2)
{
_wsprintfA(aWavemixV23ByAn, "%d", (unsigned int)(11 * (*(DWORD*)(hMem + 384) / 0x2B11u)));
result = WritePrivateProfileStringA((LPCSTR)(hMem + 28), "SamplesPerSec", aWavemixV23ByAn, FileName);
}
if (a1 & 4)
{
_wsprintfA(aWavemixV23ByAn, "%d", *(DWORD*)(hMem + 400));
result = WritePrivateProfileStringA((LPCSTR)(hMem + 28), "WaveBlocks", aWavemixV23ByAn, FileName);
}
if (a1 & 8)
{
_wsprintfA(aWavemixV23ByAn, "%d", *(unsigned int*)(hMem + 396));
result = WritePrivateProfileStringA((LPCSTR)(hMem + 28), "WaveBlockLen", aWavemixV23ByAn, FileName);
}
if (a1 & 0x10)
{
_wsprintfA(aWavemixV23ByAn, "%d", *(DWORD*)(hMem + 428) == (DWORD)cmixit);
result = WritePrivateProfileStringA((LPCSTR)(hMem + 28), "CMixit", aWavemixV23ByAn, FileName);
}
if (a1 & 0x20)
{
_wsprintfA(aWavemixV23ByAn, "%d", (*(DWORD*)(hMem + 432) != (DWORD)ResetRemix) + 1);
result = WritePrivateProfileStringA((LPCSTR)(hMem + 28), "Remix", aWavemixV23ByAn, FileName);
}
if (a1 & 0x40)
{
_wsprintfA(aWavemixV23ByAn, "%d", *(DWORD*)(hMem + 420) == 0);
result = WritePrivateProfileStringA((LPCSTR)(hMem + 28), "GoodWavePos", aWavemixV23ByAn, FileName);
}
if (a1 & 0x100)
{
_wsprintfA(aWavemixV23ByAn, "%d", dword_1027BE4 != 0);
result = WritePrivateProfileStringA("general", "ShowDebugDialogs", aWavemixV23ByAn, FileName);
}
if (a1 & 0x200)
{
_wsprintfA(aWavemixV23ByAn, "%d", *(DWORD*)(hMem + 404));
result = WritePrivateProfileStringA((LPCSTR)(hMem + 28), "PauseBlocks", aWavemixV23ByAn, FileName);
}
return result;
}
// 1027BE4: using guessed type int dword_1027BE4;
//----- (010203CD) --------------------------------------------------------
DWORD SetIniFileName(HMODULE hModule)
{
DWORD result; // eax
CHAR* i; // eax
result = GetModuleFileNameA(hModule, FileName, 0x104u);
if (result)
{
for (i = &FileName[result]; *i != 92; --i)
;
*i = 0;
lstrcpyA(i, "\\WAVEMIX.INF");
result = 1;
}
return result;
}
//----- (01020412) --------------------------------------------------------
int InitVolumeTable()
{
char* v0; // edi
signed int v1; // esi
int result; // eax
int v3; // [esp+Ch] [ebp-Ch]
int v4; // [esp+10h] [ebp-8h]
int v5; // [esp+14h] [ebp-4h]
v4 = 0;
v3 = 0;
v0 = (char*)& unk_10259F0;
do
{
v1 = -128;
v5 = v3;
do
{
v0[v1] = v5 / 10 + -128;
result = v4;
v5 += v4;
++v1;
} while (v1 < 128);
++v4;
v3 -= 128;
v0 += 256;
} while ((signed int)v0 <= (signed int)& unk_10263F0);
return result;
}
//----- (0102046F) --------------------------------------------------------
int WaveMixStartup(HMODULE hModule)
{
WNDCLASSA WndClass; // [esp+4h] [ebp-28h]
if (dword_1027BF4)
return 1;
if (!SetIniFileName(hModule))
return 0;
InitVolumeTable();
dword_1027BE8 = GetPrivateProfileIntA("general", "debug", 0, FileName);
dword_1025968 = (int)cmixit;
dword_10257E0 = hModule;
WndClass.hCursor = LoadCursorA(0, (LPCSTR)0x7F00);
WndClass.hIcon = 0;
WndClass.lpszMenuName = 0;
WndClass.lpszClassName = "WavMix32";
WndClass.hbrBackground = (HBRUSH)GetStockObject(1);
WndClass.hInstance = dword_10257E0;
WndClass.style = 0;
WndClass.lpfnWndProc = WndProc;
WndClass.cbWndExtra = 0;
WndClass.cbClsExtra = 0;
if (!RegisterClassA(&WndClass))
return 0;
InitChannelNodes();
dword_1027BF4 = 1;
return 1;
}
// 1025968: using guessed type int dword_1025968;
// 1027BE8: using guessed type int dword_1027BE8;
// 1027BF4: using guessed type int dword_1027BF4;
//----- (0102053B) --------------------------------------------------------
signed int WaveMixActivate(WORD* a1, int a2)
{
WORD* v2; // eax
int v3; // ecx
signed int result; // eax
unsigned int v5; // ST04_4
struct wavehdr_tag* v6; // eax
DWORD v7; // eax
bool v8; // zf
v2 = SessionToGlobalDataPtr(a1);
v3 = (int)v2;
hMem = (LPARAM)v2;
if (!v2)
return 5;
if (a2)
{
if (dword_1025798)
return dword_1025798 != (DWORD)v2 ? 4 : 0;
if (*((DWORD*)v2 + 5))
return 12;
dword_1025798 = (int)v2;
sndPlaySoundA(0, 0);
result = GetWaveDevice();
if (result)
{
dword_1025798 = 0;
return result;
}
v5 = *(DWORD*)(hMem + 412);
*(DWORD*)(hMem + 16) = 1;
SetWaveOutPosition(v5);
do
v6 = (struct wavehdr_tag*)GetWaveBlock();
while (MixerPlay(v6, 1));
}
else
{
if (*((DWORD*)v2 + 4))
{
v7 = MyWaveOutGetPosition(*((HWAVEOUT*)v2 + 3), *((DWORD*)v2 + 105));
v3 = hMem;
*(DWORD*)(hMem + 412) = v7;
}
ReleaseWaveDevice(v3);
v8 = hMem == dword_1025798;
*(DWORD*)(hMem + 16) = 0;
if (v8)
dword_1025798 = 0;
}
return 0;
}
// 1025798: using guessed type int dword_1025798;
//----- (01020615) --------------------------------------------------------
MMRESULT WaveMixConfigure(int a1, HWND hWndParent, int a3, int a4, int a5)
{
WORD* v5; // esi
WORD* v6; // eax
const DLGTEMPLATE* v7; // esi
INT_PTR v8; // edi
LPARAM v9; // eax
MMRESULT result; // eax
WORD* v11; // esi
LPARAM* v12; // edi
UINT_PTR v13; // eax
LPARAM v14; // eax
bool v15; // zf
int v16; // ecx
const char* v17; // eax
int v18; // eax
int v19; // eax
int v20; // eax
DWORD* v21; // eax
int v22; // eax
signed int v23; // eax
signed int v24; // ecx
DWORD* v25; // eax
int v26; // ecx
int v27; // edx
unsigned int v28; // ax
unsigned int v29; // edx
signed int v30; // ecx
int v31; // cx
signed int (*v32)(int, int); // eax
int v33; // ecx
DWORD* v34; // eax
int v35; // esi
LPARAM dwInitParam; // [esp+Ch] [ebp-6Ch]
unsigned int v38; // [esp+18h] [ebp-60h]
DWORD* v39; // [esp+2Ch] [ebp-4Ch]
WORD* v40; // [esp+30h] [ebp-48h]
int v41; // [esp+34h] [ebp-44h]
LPARAM* v42; // [esp+38h] [ebp-40h]
int v43; // [esp+3Ch] [ebp-3Ch]
struct tagWAVEOUTCAPSA pwoc; // [esp+40h] [ebp-38h]
v5 = (WORD*)a1;
v42 = (LPARAM*)a3;
v40 = (WORD*)a1;
v39 = (DWORD*)a4;
v43 = 0;
v6 = SessionToGlobalDataPtr((WORD*)a1);
hMem = (LPARAM)v6;
if (!v6)
return 5;
if (*((DWORD*)v6 + 4))
return 4;
if (*((DWORD*)v6 + 5))
return 12;
WaveMixFlushChannel((WORD*)a1, -1, 1);
if (!v42)
{
LOWORD(dwInitParam) = 30;
*(LPARAM*)((char*)& dwInitParam + 2) = 1023;
WaveMixGetConfig((WORD*)a1, (int)& dwInitParam);
v7 = (const DLGTEMPLATE*)MakeSettingsDlgTemplate();
if (!v7)
return 1;
*(DWORD*)(hMem + 20) = 1;
v8 = DialogBoxIndirectParamA(dword_10257E0, v7, hWndParent, SettingsDlgProc, (LPARAM)& dwInitParam);
DestroySettingsDlgTemplate(v7);
v9 = hMem;
*(DWORD*)(hMem + 20) = 0;
if (v8 != 1)
return 1;
if (*(DWORD*)(v9 + 396) == v38)
* (LPARAM*)((char*)& dwInitParam + 2) &= 0xFFFFFFF7;
v5 = v40;
v42 = &dwInitParam;
}
if (!*(LPARAM*)((char*)v42 + 2))
return 1;
v11 = SessionToGlobalDataPtr(v5);
hMem = (LPARAM)v11;
if (!v11)
return 5;
v12 = v42;
v41 = *(LPARAM*)((char*)v42 + 2);
if (v41 & 0x100)
dword_1027BE4 = *((WORD*)v42 + 12) != 0;
if ((v41 & 0x80u) != 0)
{
v13 = *((unsigned int*)v42 + 10);
if (v13 != *((DWORD*)v11 + 6))
{
result = waveOutGetDevCapsA(v13, &pwoc, 0x34u);
if (result)
return result;
v14 = hMem;
qmemcpy((void*)(hMem + 124), &pwoc, 0x34u);
v15 = *(WORD*)(v14 + 168) == 1;
*(DWORD*)(v14 + 24) = *((unsigned int*)v42 + 10);
if (v15 && *(WORD*)(v14 + 382) == 2)
{
*(WORD*)(v14 + 382) = 1;
v16 = *(DWORD*)(v14 + 384);
v43 = 1;
*(WORD*)(v14 + 392) = 1;
*(DWORD*)(v14 + 388) = v16;
}
lstrcpyA((LPSTR)(v14 + 28), pwoc.szPname);
if (!RemoveInvalidIniNameCharacters((LPCSTR)(hMem + 28)))
lstrcpyA((LPSTR)(hMem + 28), "Unkown Device");
if (!ReadRegistryToGetMachineSpecificInfSection(*(DWORD*)(hMem + 24), (LPSTR)(hMem + 28), 96))
{
v17 = GetOperatingSystemPrefix();
lstrcpyA((LPSTR)(hMem + 28), v17);
lstrcatA((LPSTR)(hMem + 28), (LPCSTR)(hMem + 132));
}
v11 = (WORD*)hMem;
v12 = v42;
}
}
if (v41 & 1)
{
if (*((WORD*)v12 + 3) <= 1u)
{
if (v11[191] == 2)
v43 = 1;
v11[191] = 1;
v19 = *((DWORD*)v11 + 96);
v11[196] = 1;
goto LABEL_39;
}
if (v11[84] > 1u)
{
if (v11[191] == 1)
v43 = 1;
v11[191] = 2;
v18 = *((DWORD*)v11 + 96);
v11[196] = 2;
v19 = 2 * v18;
LABEL_39:
*((DWORD*)v11 + 97) = v19;
goto LABEL_40;
}
}
LABEL_40:
if (v41 & 2)
{
v20 = *((unsigned int*)v12 + 4);
if (v20 == 22)
{
if (*((DWORD*)v11 + 96) != 22050)
v43 = 1;
*((DWORD*)v11 + 96) = 22050;
v22 = 22050 * (unsigned int)v11[191];
}
else
{
v15 = v20 == 44;
v21 = v11 + 192;
if (v15)
{
if (*v21 != 44100)
v43 = 1;
*v21 = 44100;
v22 = 44100 * (unsigned int)v11[191];
}
else
{
if (*v21 != 11025)
v43 = 1;
*v21 = 11025;
v22 = 11025 * (unsigned int)v11[191];
}
}
*((DWORD*)v11 + 97) = v22;
}
if (v41 & 4)
{
v23 = *((unsigned int*)v12 + 5);
v24 = 2;
*((DWORD*)v11 + 100) = v23;
if (v23 < 2 || (v24 = 10, v23 > 10))
* ((DWORD*)v11 + 100) = v24;
v25 = v11 + 202;
v26 = *((DWORD*)v11 + 101);
if (v26 >= 0)
{
v27 = *((DWORD*)v11 + 100);
if (v26 > v27)
* v25 = v27;
}
else
{
*v25 = 0;
}
}
if (v43)
* ((DWORD*)v11 + 99) = FigureOutDMABufferSize(0, (int)(v11 + 190));
if (v41 & 8)
{
v28 = *((WORD*)v12 + 6);
if (v28)
* ((DWORD*)v11 + 99) = v28;
}
v29 = *((DWORD*)v11 + 99);
v30 = 344;
if (v29 < 0x158 || (v30 = 11025, v29 > 0x2B11))
* ((DWORD*)v11 + 99) = v30;
v31 = v41;
if (v41 & 0x10)
* ((DWORD*)v11 + 107) = cmixit;
if (v31 & 0x20)
{
v32 = ResetRemix;
if (!*((WORD*)v12 + 8))
v32 = NoResetRemix;
*((DWORD*)v11 + 108) = v32;
}
if (v31 & 0x40)
* ((DWORD*)v11 + 105) = *((WORD*)v12 + 9) != 0;
if (v31 & 0x200)
{
v33 = *((unsigned int*)v12 + 11);
v34 = v11 + 202;
*((DWORD*)v11 + 101) = v33;
if (v33 >= 0)
{
v35 = *((DWORD*)v11 + 100);
if (v33 > v35)
* v34 = v35;
}
else
{
*v34 = 0;
}
}
WaveMixGetConfig(v40, (int)v12);
if (v39)
* v39 = v43;
if (a5)
SaveConfigSettings(v41);
if (dword_1027BE4)
ShowCurrentSettings();
return 0;
}
// 1027BE4: using guessed type int dword_1027BE4;
//----- (01020A36) --------------------------------------------------------
signed int ReadConfigSettings(int a1)
{
UINT v2; // eax
UINT_PTR* v3; // ebx
const char* v4; // eax
unsigned int v5; // eax
UINT v6; // eax
signed int (*v7)(int, int); // ecx
LPARAM v8; // eax
UINT v9; // ecx
LPARAM v10; // eax
signed int v11; // eax
LPARAM v12; // ecx
signed int v13; // edx
int v14; // eax
signed int v15; // eax
LPARAM v16; // ecx
signed int v17; // edx
unsigned int v18; // ax
LPARAM v19; // ecx
int v20; // eax
int v21; // eax
unsigned int v22; // eax
int v23; // esi
const CHAR* v24; // [esp-10h] [ebp-24h]
int v25; // [esp-Ch] [ebp-20h]
UINT v26; // [esp+4h] [ebp-10h]
UINT v27; // [esp+8h] [ebp-Ch]
UINT v28; // [esp+Ch] [ebp-8h]
unsigned int nDefault; // [esp+10h] [ebp-4h]
UINT nDefaulta; // [esp+10h] [ebp-4h]
INT nDefaultb; // [esp+10h] [ebp-4h]
nDefault = waveOutGetNumDevs();
if (!nDefault)
return 0;
if (*(_BYTE*)(a1 + 3) & 4 && ReadRegistryForAppSpecificConfigs(a1))
{
WaveMixConfigure(hMem, 0, a1, 0, 0);
return 1;
}
if (*(_BYTE*)(a1 + 2) >= 0)
{
v3 = (UINT_PTR*)(hMem + 24);
v2 = GetPrivateProfileIntA("general", "WaveOutDevice", 0, FileName);
}
else
{
v2 = *(unsigned int*)(a1 + 20);
v3 = (UINT_PTR*)(hMem + 24);
}
*v3 = v2;
if (*v3 >= nDefault)
* v3 = 0;
if (waveOutGetDevCapsA(*v3, (LPWAVEOUTCAPSA)(hMem + 124), 0x34u)
|| !RemoveInvalidIniNameCharacters((LPCSTR)(hMem + 132)))
{
lstrcpyA((LPSTR)(hMem + 132), "Unkown Device");
}
if (!ReadRegistryToGetMachineSpecificInfSection(*(DWORD*)(hMem + 24), (LPSTR)(hMem + 28), 96))
{
v4 = GetOperatingSystemPrefix();
lstrcpyA((LPSTR)(hMem + 28), v4);
lstrcatA((LPSTR)(hMem + 28), (LPCSTR)(hMem + 132));
}
nDefaulta = GetPrivateProfileIntA("default", "Remix", 1, FileName);
v5 = DefaultGoodWavePos(*(DWORD*)(hMem + 24));
v28 = GetPrivateProfileIntA("default", "GoodWavePos", v5, FileName);
v27 = GetPrivateProfileIntA("default", "WaveBlocks", 3, FileName);
v26 = GetPrivateProfileIntA("default", "SamplesPerSec", 11, FileName);
if (*(_BYTE*)(hMem + 172) & 0x10)
{
if (!dword_1027BE4)
return 0;
v25 = hMem + 132;
v24 = "%s is a syncronous (blocking) wave output device. This will not permit audio to play while other applications are running.";
LABEL_19:
_wsprintfA(aWavemixV23ByAn, v24, v25);
MessageBoxA(0, aWavemixV23ByAn, "WavMix32", 0x40u);
return 0;
}
if (GetPrivateProfileIntA("not compatible", (LPCSTR)(hMem + 28), 0, FileName))
{
if (!dword_1027BE4)
return 0;
v25 = hMem + 28;
v24 = "%s is not compatible with the realtime wavemixer.";
goto LABEL_19;
}
v6 = GetPrivateProfileIntA((LPCSTR)(hMem + 28), "Remix", nDefaulta, FileName);
v7 = NoResetRemix;
if (v6 != 2)
v7 = ResetRemix;
v8 = hMem;
*(DWORD*)(hMem + 432) = v7;
v9 = GetPrivateProfileIntA((LPCSTR)(v8 + 28), "GoodWavePos", v28, FileName);
v10 = hMem;
*(DWORD*)(hMem + 420) = v9 != 0;
v11 = GetPrivateProfileIntA((LPCSTR)(v10 + 28), "WaveBlocks", v27, FileName);
v12 = hMem;
v13 = 2;
*(DWORD*)(hMem + 400) = v11;
if (v11 < 2 || (v13 = 10, v11 > 10))
* (DWORD*)(v12 + 400) = v13;
v14 = DefaultPauseBlocks(*(DWORD*)(v12 + 400));
v15 = GetPrivateProfileIntA((LPCSTR)(hMem + 28), "PauseBlocks", v14, FileName);
v16 = hMem;
*(DWORD*)(hMem + 404) = v15;
if (v15 >= 0)
{
v17 = *(DWORD*)(v16 + 400);
if (v15 > v17)
* (DWORD*)(v16 + 404) = v17;
}
else
{
*(DWORD*)(v16 + 404) = 0;
}
nDefaultb = GetPrivateProfileIntA((LPCSTR)(v16 + 28), "SamplesPerSec", v26, FileName);
v18 = GetPrivateProfileIntA((LPCSTR)(hMem + 28), "Channels", 1, FileName);
v19 = hMem;
*(WORD*)(hMem + 382) = v18;
if (v18 >= 1u)
{
if (v18 > 2u)
* (WORD*)(v19 + 382) = 2;
}
else
{
*(WORD*)(v19 + 382) = 1;
}
v20 = *(unsigned int*)(v19 + 382);
if (nDefaultb == 22)
{
*(DWORD*)(v19 + 384) = 22050;
v21 = 22050 * v20;
}
else if (nDefaultb == 44)
{
*(DWORD*)(v19 + 384) = 44100;
v21 = 44100 * v20;
}
else
{
v21 = 11025 * v20;
}
*(DWORD*)(v19 + 388) = v21;
v22 = GetPrivateProfileIntA("default", "WaveBlockLen", 0, FileName);
v23 = hMem;
*(DWORD*)(v23 + 396) = FigureOutDMABufferSize(v22, hMem + 380);
WaveMixConfigure(v23, 0, a1, 0, 0);
return 1;
}
// 1027BE4: using guessed type int dword_1027BE4;
//----- (01020D99) --------------------------------------------------------
int WaveMixConfigureInit(WORD* a1)
{
unsigned int v1; // ecx
HMODULE v2; // eax
int result; // eax
BOOL v4; // eax
DWORD* v5; // eax
WORD* v6; // eax
void* v7; // ST0C_4
int v8; // [esp+8h] [ebp-20h]
char v9; // [esp+Bh] [ebp-1Dh]
int v10; // [esp+20h] [ebp-8h]
int v11; // [esp+24h] [ebp-4h]
memset(&v8, 0, 0x1Cu);
v1 = 30;
v11 = 0;
v8 = 30;
if (a1)
{
if (*a1 < 0x1Eu)
v1 = (unsigned int)* a1;
qmemcpy(&v8, a1, v1);
}
if (dword_1027BF4 || (v2 = GetModuleHandleA(0), (result = WaveMixStartup(v2)) != 0))
{
if (v9 & 1)
v4 = v10 != 0;
else
v4 = GetPrivateProfileIntA("general", "ShowDebugDialogs", 0, FileName) != 0;
dword_1027BE4 = v4;
if (!waveOutGetNumDevs())
{
if (dword_1027BE4)
{
_wsprintfA(aWavemixV23ByAn, "This system does not have a valid wave output device.");
MessageBoxA(0, aWavemixV23ByAn, "WavMix32", 0x40u);
}
return 0;
}
if (GetPrivateProfileIntA("general", "ShowDevices", 0, FileName))
ShowWaveOutDevices();
v5 = LocalAlloc(0x40u, 0x1C0u);
hMem = (LPARAM)v5;
if (!v5)
return 0;
v5[107] = dword_1025968;
*((WORD*)v5 + 222) = 21554;
*(WORD*)v5 = 21554;
v5[102] = 0;
v5[5] = 0;
*((WORD*)v5 + 88) = 10;
*((WORD*)v5 + 89) = 10;
memset(v5 + 61, 0xFFu, 0x40u);
_memmove(v5 + 95, gpFormat, 0x10u);
if (!ReadConfigSettings((int)& v8))
{
v6 = (WORD*)hMem;
v7 = (void*)hMem;
*(WORD*)(hMem + 444) = 0;
*v6 = 0;
LocalFree(v7);
hMem = 0;
}
result = hMem;
}
return result;
}
// 10028C0: using guessed type int gpFormat[4];
// 1025968: using guessed type int dword_1025968;
// 1027BE4: using guessed type int dword_1027BE4;
// 1027BF4: using guessed type int dword_1027BF4;
//----- (01020F2D) --------------------------------------------------------
int WaveMixInit()
{
return WaveMixConfigureInit(0);
}
//----- (01020F3A) --------------------------------------------------------
HLOCAL WaveMixCloseSession(HLOCAL hMem)
{
void* v1; // edi
HLOCAL result; // eax
::hMem = (LPARAM)SessionToGlobalDataPtr(hMem);
if (!::hMem
|| (WaveMixActivate(hMem, 0),
WaveMixCloseChannel(hMem, 0, 1),
v1 = (void*)::hMem,
::hMem = 0,
memset(v1, 0, 0x1C0u),
!hMem)
|| (result = LocalFree(hMem)) != 0)
{
result = (HLOCAL)5;
}
return result;
}