Files
3d-pinball-space-cadet/sound/wavemix.cpp
T

3656 lines
76 KiB
C++

#include "../pinball.h"
//----- (0101CFD0) --------------------------------------------------------
_WORD *__stdcall 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 __stdcall IsValidLPMIXWAVE(int a1)
{
BOOL result; // eax
result = a1;
if ( a1 )
result = *(_WORD *)(a1 + 64) == 21554;
return result;
}
//----- (0101D04E) --------------------------------------------------------
bool __stdcall HasCurrentOutputFormat(const void *a1)
{
return memcmp(a1, (const void *)(hMem + 380), 0x10u) == 0;
}
//----- (0101D079) --------------------------------------------------------
int __stdcall DefaultPauseBlocks(int a1)
{
int result; // eax
if ( GetVersion() < 0x80000000 || (unsigned __int8)GetVersion() < 4u )
result = a1;
else
result = 0;
return result;
}
//----- (0101D0A5) --------------------------------------------------------
unsigned int __stdcall 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 __stdcall 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 (__stdcall **)(DWORD, _DWORD))(hMem + 436))(pmmt.u.ms, *(_DWORD *)(hMem + 424));
}
//----- (0101D178) --------------------------------------------------------
int __stdcall AddFactor(int a1, int a2)
{
return a1 + a2;
}
//----- (0101D18E) --------------------------------------------------------
int __stdcall SubFactor(int a1, int a2)
{
return a1 - a2;
}
//----- (0101D1A2) --------------------------------------------------------
unsigned int __stdcall 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 __stdcall MyWaveOutReset(HWAVEOUT hwo)
{
unsigned int v1; // esi
v1 = MyWaveOutGetPosition(hwo, *(_DWORD *)(hMem + 420));
waveOutReset(hwo);
return SetWaveOutPosition(v1);
}
//----- (0101D285) --------------------------------------------------------
__int16 __stdcall cmixit(_BYTE *a1, char *a2, char *a3, int a4, unsigned __int16 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 __int16 *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 __int16 *v23; // ecx
int v24; // eax
int v26; // [esp+10h] [ebp-8h]
int v27; // [esp+10h] [ebp-8h]
unsigned __int16 v28; // [esp+14h] [ebp-4h]
unsigned __int16 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 __int16 *)a3 << 8;
v8 = *((unsigned __int16 *)a3 + 1) << 8;
v9 = (unsigned __int16)(((unsigned __int16)(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 __int16)(((unsigned __int16)(a5 - 1) >> 1) + 1);
do
{
v12 = 128;
v13 = 128;
if ( a4 > 0 )
{
v14 = (unsigned __int16 *)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 __int16 *)a3 + *((unsigned __int16 *)a3 + 1)) / 2;
if ( a5 )
{
v20 = a5;
v21 = a1;
v5 = (unsigned __int16)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 __int16 *)a3;
v31 = a4;
do
{
v24 = (unsigned __int8)byte_1025970[256 * (unsigned __int16)((*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 *__stdcall 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 __stdcall 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 *__stdcall 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 *__stdcall 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 __stdcall 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 *__stdcall 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 *__stdcall 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 *__stdcall 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 __stdcall 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 __stdcall 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 __stdcall 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 __stdcall 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 __stdcall 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 __stdcall 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 __int16 *)(v4 + 396);
while ( (_WORD)v10 )
{
if ( v9 >= v30 )
{
v26 = 0;
v29 = 0;
v11 = v9 + (unsigned __int16)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 (__stdcall **)(LPSTR, int *, __int16 *, 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 __int16)v10;
if ( (unsigned __int16)v10 + v9 >= v30 )
v10 = v30 - v9;
memset(v28, 0x80u, (unsigned __int16)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 __int16 word_1025810[];
// 1027BE4: using guessed type int dword_1027BE4;
//----- (0101DC8C) --------------------------------------------------------
DWORD __stdcall 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 __stdcall 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 __stdcall 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 __stdcall NoResetRemix(int a1, int a2)
{
WaveMixPump();
return 1;
}
//----- (0101DDE8) --------------------------------------------------------
signed int __stdcall 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 __stdcall 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 __stdcall 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
__int16 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 __int16 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 __int16)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 (__stdcall **)(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 __int16 *)(v14 + 392);
}
while ( *(_DWORD *)(v14 + 440) );
if ( !v36 )
goto LABEL_84;
if ( !(*(int (__stdcall **)(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 __stdcall 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 (__stdcall **)(DWORD, _DWORD *))v5 + 108))(v10, v3);
}
return 0;
}
}
return 5;
}
//----- (0101E434) --------------------------------------------------------
signed int __stdcall 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 __stdcall 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 *__userpurge BitsPerSampleAlign@<eax>(int a1@<eax>, LPCVOID pMem, int a3, __int16 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 __int16)a3 >> 3;
v7 = a1;
v8 = *(_DWORD *)a5 / (unsigned int)((unsigned __int16)a3 >> 3);
v9 = v8 * ((unsigned __int16)a4 >> 3);
*(_DWORD *)a5 = v9;
v10 = GlobalAlloc(0x2002u, v9);
v11 = GlobalLock(v10);
v12 = v11;
if ( v11 )
{
if ( (unsigned __int16)v7 <= (unsigned __int16)((unsigned __int16)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 *__stdcall ChannelAlign(LPCVOID pMem, __int16 a2, __int16 a3, __int16 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 __int16)a4 / (unsigned __int16)a2;
v7 = v6 * (unsigned __int16)a4 * (unsigned __int16)a3;
*(_DWORD *)a5 = v7;
v8 = GlobalAlloc(0x2002u, v7);
v9 = GlobalLock(v8);
v10 = v9;
if ( v9 )
{
v11 = (unsigned __int8 *)pMem;
if ( (unsigned __int16)a2 >= (unsigned __int16)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 __int16 *)v11 + *((signed __int16 *)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 __stdcall 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 __int16 *v12; // edi
signed __int16 *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 __int16 *)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 __int16 *)((char *)v13 + v16);
--v15;
}
while ( v15 );
}
v17 = v18-- == 1;
*a1 = v14 / a3;
if ( v17 )
break;
v11 = a5;
}
}
}
}
//----- (0101E83A) --------------------------------------------------------
int __stdcall 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 __int16)v13[v12] - *(signed __int16 *)v19) / a3;
*v13 = *(_WORD *)v19;
v15 = (signed __int16)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 __stdcall SamplesPerSecAlign(LPCVOID pMem, int a2, int a3, __int16 a4, __int16 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 __int16)a4 * (unsigned __int16)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 __int16)a4, (unsigned __int16)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 __int16)a4, (unsigned __int16)a5);
pMem = (char *)pMem + v8;
v13 += v8 * v24;
--v27;
}
while ( v27 );
}
v16 = v24;
if ( v24 > 0 )
{
do
{
v17 = pMem;
if ( v8 > 0 )
{
v18 = (unsigned __int16)a4 * (unsigned __int16)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 __stdcall 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 __int16 *)(a2 + 14), pMem, *(unsigned __int16 *)(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 *__stdcall 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 __int16)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 __int16)lpName);
}
return v8;
}
// 1027BE4: using guessed type int dword_1027BE4;
//----- (0101F093) --------------------------------------------------------
unsigned int __stdcall FigureOutDMABufferSize(unsigned int a1, int a2)
{
unsigned int result; // eax
signed int v3; // ecx
result = a1;
if ( !a1 )
result = *(_DWORD *)(a2 + 4) * *(unsigned __int16 *)(a2 + 2) * ((unsigned int)*(unsigned __int16 *)(a2 + 14) >> 3) >> 4;
v3 = 344;
if ( result < 0x158 || (v3 = 11025, result > 0x2B11) )
result = v3;
return result;
}
//----- (0101F0D4) --------------------------------------------------------
int __stdcall 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 __stdcall 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 *__stdcall 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 __stdcall 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 __stdcall 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 __stdcall 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 __int16 *)(a1 + 20) >= waveOutGetNumDevs() )
{
*(_WORD *)(a1 + 20) = 0;
}
_wsprintfA(&SubKey, "WaveMix\\Device%u", *(unsigned __int16 *)(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 __int16)ReadRegistryInt(phkResult, "Remix", 1) != 2;
if ( !(v1 & 0x40) )
{
v3 = DefaultGoodWavePos(*(unsigned __int16 *)(a1 + 20));
*(_WORD *)(a1 + 18) = (unsigned __int16)ReadRegistryInt(phkResult, "GoodWavePos", v3) != 0;
}
if ( !(v1 & 0x100) )
*(_WORD *)(a1 + 24) = ReadRegistryInt(phkResult, "ShowDebugDialogs", 0);
if ( !(v1 & 0x200) )
{
v4 = DefaultPauseBlocks(*(unsigned __int16 *)(a1 + 10));
*(_WORD *)(a1 + 22) = ReadRegistryInt(phkResult, "PauseBlocks", v4);
}
v5 = (struct tagWAVEOUTCAPSA *)(hMem + 124);
v6 = *(unsigned __int16 *)(a1 + 20);
*(_DWORD *)(a1 + 2) = 1023;
waveOutGetDevCapsA(v6, v5, 0x34u);
RegCloseKey(phkResult);
return 1;
}
//----- (0101F50B) --------------------------------------------------------
int __stdcall 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 ( *(__int16 (__stdcall **)(_BYTE *, char *, char *, int, unsigned __int16))(hMem + 428) != cmixit )
v0 = "386 mixit";
v1 = "TRUE";
if ( !*(_DWORD *)(hMem + 420) )
v1 = "FALSE";
v2 = "Reset";
if ( *(signed int (__stdcall **)(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 __int16 *)(hMem + 382),
*(_DWORD *)(hMem + 404));
return MessageBoxA(0, aWavemixV23ByAn, "WavMix32", 0x40u);
}
//----- (0101F5F1) --------------------------------------------------------
int __stdcall 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 __int16 *)(a3 + 10));
v26 = GetDlgItem(hWnd, 1003);
SetWindowTextA(v26, aWavemixV23ByAn);
_wsprintfA(aWavemixV23ByAn, "%d", *(unsigned __int16 *)(a3 + 12));
v27 = GetDlgItem(hWnd, 1007);
SetWindowTextA(v27, aWavemixV23ByAn);
_wsprintfA(aWavemixV23ByAn, "%d", *(unsigned __int16 *)(a3 + 8));
v28 = GetDlgItem(hWnd, 1008);
SetWindowTextA(v28, aWavemixV23ByAn);
_wsprintfA(aWavemixV23ByAn, "%d", *(unsigned __int16 *)(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 __int16 *)(a3 + 20);
v33 = GetDlgItem(hWnd, 1009);
SendMessageA(v33, 0x14Eu, v32, 0);
return 1;
}
//----- (0101FA63) --------------------------------------------------------
int __stdcall 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
__int16 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 __stdcall 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 __int16)a3, a4, a3 >> 16);
return 1;
}
//----- (0101FC6D) --------------------------------------------------------
_DWORD *__stdcall MakeDlgTemplate(int a1, int a2, __int16 a3, __int16 a4, __int16 a5, __int16 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 *__stdcall AddDlgControl(int a1, LPCVOID pMem, __int16 a3, int a4, __int16 a5, __int16 a6, __int16 a7, __int16 a8, __int16 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 __int16)a3 << 16) | 0xFFFF;
_wcscpy((wchar_t *)&pMema[(_DWORD)v10 + 22], Str);
++*((_WORD *)v10 + 4);
}
}
return v10;
}
//----- (0101FDE1) --------------------------------------------------------
_WORD *__stdcall 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 __stdcall DestroySettingsDlgTemplate(LPCVOID pMem)
{
HGLOBAL v1; // eax
HGLOBAL v2; // eax
if ( pMem )
{
v1 = GlobalHandle(pMem);
GlobalUnlock(v1);
v2 = GlobalHandle(pMem);
GlobalFree(v2);
}
}
//----- (0102008D) --------------------------------------------------------
signed int __stdcall 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 __stdcall SaveConfigSettings(__int16 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 __int16 *)(hMem + 382));
result = WritePrivateProfileStringA((LPCSTR)(hMem + 28), "Channels", aWavemixV23ByAn, FileName);
}
if ( a1 & 2 )
{
_wsprintfA(aWavemixV23ByAn, "%d", (unsigned __int16)(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 __int16 *)(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 __stdcall 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 __stdcall 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 __stdcall 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 __stdcall 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 __stdcall 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 __int16 v28; // ax
unsigned int v29; // edx
signed int v30; // ecx
__int16 v31; // cx
signed int (__stdcall *v32)(int, int); // eax
int v33; // ecx
_DWORD *v34; // eax
int v35; // esi
LPARAM dwInitParam; // [esp+Ch] [ebp-6Ch]
unsigned __int16 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 __int16 *)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 __int16 *)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 __int16 *)v12 + 4);
if ( v20 == 22 )
{
if ( *((_DWORD *)v11 + 96) != 22050 )
v43 = 1;
*((_DWORD *)v11 + 96) = 22050;
v22 = 22050 * (unsigned __int16)v11[191];
}
else
{
v15 = v20 == 44;
v21 = v11 + 192;
if ( v15 )
{
if ( *v21 != 44100 )
v43 = 1;
*v21 = 44100;
v22 = 44100 * (unsigned __int16)v11[191];
}
else
{
if ( *v21 != 11025 )
v43 = 1;
*v21 = 11025;
v22 = 11025 * (unsigned __int16)v11[191];
}
}
*((_DWORD *)v11 + 97) = v22;
}
if ( v41 & 4 )
{
v23 = *((unsigned __int16 *)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 __int16 *)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 __stdcall ReadConfigSettings(int a1)
{
UINT v2; // eax
UINT_PTR *v3; // ebx
const char *v4; // eax
unsigned int v5; // eax
UINT v6; // eax
signed int (__stdcall *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 __int16 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 __int16 *)(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 __int16 *)(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 __stdcall 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
__int16 v8; // [esp+8h] [ebp-20h]
char v9; // [esp+Bh] [ebp-1Dh]
__int16 v10; // [esp+20h] [ebp-8h]
__int16 v11; // [esp+24h] [ebp-4h]
memset(&v8, 0, 0x1Cu);
v1 = 30;
v11 = 0;
v8 = 30;
if ( a1 )
{
if ( *a1 < 0x1Eu )
v1 = (unsigned __int16)*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 __stdcall WaveMixInit()
{
return WaveMixConfigureInit(0);
}
//----- (01020F3A) --------------------------------------------------------
HLOCAL __stdcall 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;
}