From e824307b270dc41215281f83638586e4cf5a4b12 Mon Sep 17 00:00:00 2001 From: oz Date: Sun, 24 Jan 2021 17:30:37 +0300 Subject: [PATCH] WaveMix v1. --- Doc/FuncStats.xlsx | Bin 39276 -> 39327 bytes SpaceCadetPinball/WaveMix.cpp | 402 +++++++++++++++++++++++++++++++++- SpaceCadetPinball/WaveMix.h | 154 +++++++++++++ 3 files changed, 555 insertions(+), 1 deletion(-) diff --git a/Doc/FuncStats.xlsx b/Doc/FuncStats.xlsx index fb21803d8b54fbccbd71a7b6088d9490e71655dc..032240bc0f849e3bc6c51434ef7816ee4a1f705d 100644 GIT binary patch delta 31296 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 O(c%g8;3mjd=lwqf3Y-%F delta 31294 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 < 30u) + copySize = lpConfig->wSize; + memcpy(&mixConfig, lpConfig, copySize); + } + if (initialized_flag || Startup(GetModuleHandleA(nullptr)) != 0) + { + bool showDebugDialogs; + if ((mixConfig.dwFlags & 0x100) != 0) + showDebugDialogs = mixConfig.ShowDebugDialogs != 0; + else + showDebugDialogs = GetPrivateProfileIntA("general", "ShowDebugDialogs", 0, FileName) != 0; + ShowDebugDialogs = showDebugDialogs; + if (!waveOutGetNumDevs()) + { + if (ShowDebugDialogs) + { + wsprintfA(string_buffer, "This system does not have a valid wave output device."); + MessageBoxA(nullptr, string_buffer, "WavMix32", 0x40u); + } + return nullptr; + } + + if (GetPrivateProfileIntA("general", "ShowDevices", 0, FileName)) + ShowWaveOutDevices(); + auto globals = static_cast(LocalAlloc(0x40u, 0x1C0u)); + Globals = globals; + if (!globals) + return nullptr; + globals->CmixPtr = cmixit_ptr; + globals->wMagic2 = 21554; + globals->wMagic1 = 21554; + globals->unknown102 = 0; + globals->unknown5 = 0; + globals->unknown44 = 655370; + memset(globals->aChannel, 0xFFu, sizeof globals->aChannel); + memmove(&globals->PCM, &gpFormat, 0x10u); + if (!ReadConfigSettings(&mixConfig)) + { + Globals->wMagic2 = 0; + Globals->wMagic1 = 0; + LocalFree(Globals); + Globals = nullptr; + } + return Globals; + } + + return nullptr; } int WaveMix::CloseSession(HANDLE hMixSession) @@ -23,6 +95,52 @@ int WaveMix::CloseChannel(HANDLE hMixSession, int iChannel, unsigned dwFlags) int WaveMix::FlushChannel(HANDLE hMixSession, int iChannel, unsigned dwFlags) { + int channelId; + int lastChannel; + + int remixFlag = 0; + auto globals = SessionToGlobalDataPtr(hMixSession); + Globals = globals; + if (!globals) + return 5; + + if ((dwFlags & 1) != 0) + { + channelId = 0; + lastChannel = 16; + } + else + { + channelId = iChannel; + if (iChannel < 0 || iChannel >= 16) + return 11; + if (globals->aChannel[iChannel] == reinterpret_cast(-1)) + return 5; + lastChannel = iChannel + 1; + if (iChannel >= lastChannel) + return 0; + } + + for (auto index = channelId; index < lastChannel; index++) + { + auto curChannel = globals->aChannel[index]; + if (curChannel != reinterpret_cast(-1)) + { + globals->aChannel[index] = nullptr; + remixFlag |= curChannel != nullptr; + while (curChannel) + { + auto tmp = curChannel->next; + FreeChannelNode(curChannel); + curChannel = tmp; + } + } + } + + if (remixFlag && (dwFlags & 2) == 0 && globals->fActive) + { + globals->pfnRemix(MyWaveOutGetPosition(globals->hWaveOut, globals->fGoodGetPos), nullptr); + } return 0; } @@ -49,3 +167,285 @@ int WaveMix::Play(MIXPLAYPARAMS* lpMixPlayParams) { return 0; } + +GLOBALS* WaveMix::SessionToGlobalDataPtr(HANDLE hMixSession) +{ + auto globals = static_cast(hMixSession); + if (hMixSession && globals->wMagic1 == 21554 && globals->wMagic2 == 21554) + return globals; + MessageBeep(0xFFFFFFFF); + wsprintfA(string_buffer, "Invalid session handle 0x%04X passed to WaveMix API", hMixSession); + MessageBoxA(nullptr, string_buffer, "WavMix32", 0x30u); + return nullptr; +} + +int WaveMix::Startup(HMODULE hModule) +{ + WNDCLASSA WndClass; + + if (initialized_flag) + return 1; + if (!SetIniFileName(hModule)) + return 0; + InitVolumeTable(); + debug_flag = GetPrivateProfileIntA("general", "debug", 0, FileName); + cmixit_ptr = (int)cmixit; + HModule = hModule; + + WndClass.hCursor = LoadCursorA(nullptr, IDC_ARROW); + WndClass.hIcon = nullptr; + WndClass.lpszMenuName = nullptr; + WndClass.lpszClassName = "WavMix32"; + WndClass.hbrBackground = static_cast(GetStockObject(1)); + WndClass.hInstance = HModule; + WndClass.style = 0; + WndClass.lpfnWndProc = WndProc; + WndClass.cbWndExtra = 0; + WndClass.cbClsExtra = 0; + if (!RegisterClassA(&WndClass)) + return 0; + InitChannelNodes(); + initialized_flag = 1; + return 1; +} + +int WaveMix::SetIniFileName(HMODULE hModule) +{ + int result = GetModuleFileNameA(hModule, FileName, 0x104u); + if (result) + { + char* i; + for (i = &FileName[result]; *i != '\\'; --i) + { + } + *i = 0; + lstrcpyA(i, "\\WAVEMIX.INF"); + result = 1; + } + return result; +} + +void WaveMix::InitChannelNodes() +{ + CHANNELNODE* channelPtr = channel_nodes; + do + { + channelPtr->next = channelPtr + 1; + ++channelPtr; + } + while (channelPtr < &channel_nodes[MAXQUEUEDWAVES - 2]); + channel_nodes[MAXQUEUEDWAVES - 1].next = nullptr; + free_channel_nodes = channel_nodes; +} + +void WaveMix::InitVolumeTable() +{ + int index2 = 0; + int index3Sub = 0; + char* tablePtr = &volume_table[128]; + do + { + int index1 = -128; + int divSmth = index3Sub; + do + { + tablePtr[index1] = static_cast(divSmth / 10 + 128); + divSmth += index2; + ++index1; + } + while (index1 < 128); + ++index2; + index3Sub -= 128; + tablePtr += 256; + } + while (tablePtr <= &volume_table[2688]); +} + +void WaveMix::ShowWaveOutDevices() +{ + tagWAVEOUTCAPSA pwoc{}; + + auto deviceCount = waveOutGetNumDevs(); + if (deviceCount) + { + wsprintfA(string_buffer, "%d waveOut Devices have been detected on your system.", deviceCount); + MessageBoxA(nullptr, string_buffer, "WavMix32", 0x40u); + for (auto uDeviceID = 0u; uDeviceID < deviceCount; ++uDeviceID) + { + if (!waveOutGetDevCapsA(uDeviceID, &pwoc, 0x34u) && RemoveInvalidIniNameCharacters(pwoc.szPname)) + wsprintfA( + string_buffer, + "Device %i: %s\n\tVersion %u.%u", + uDeviceID, + pwoc.szPname, + HIBYTE(pwoc.vDriverVersion), + LOBYTE(pwoc.vDriverVersion)); + else + wsprintfA(string_buffer, "waveOutGetDevCaps failed (err %u) for device %d", 1, uDeviceID); + MessageBoxA(nullptr, string_buffer, "WavMix32", 0x40u); + } + } +} + +int WaveMix::RemoveInvalidIniNameCharacters(char* lpString) +{ + auto stringPtr = lpString; + if (!lpString || !*lpString) + return 0; + do + { + if (!isalnum(*stringPtr) && !isspace(*stringPtr)) + break; + ++stringPtr; + } + while (*stringPtr); + + do + *stringPtr-- = 0; + while (stringPtr >= lpString && isspace(*stringPtr)); + return lstrlenA(lpString); +} + +int WaveMix::ReadConfigSettings(MIXCONFIG* lpConfig) +{ + auto waveDeviceCount = waveOutGetNumDevs(); + if (!waveDeviceCount) + return 0; + if ((lpConfig->dwFlags & 0x400) != 0 && ReadRegistryForAppSpecificConfigs(lpConfig)) + { + Configure(Globals, nullptr, lpConfig, nullptr, 0); + return 1; + } + + return 1; +} + +int WaveMix::ReadRegistryForAppSpecificConfigs(MIXCONFIG* lpConfig) +{ + HKEY phkResult; + CHAR SubKey[52]; + + DWORD dwFlags = lpConfig->dwFlags; + if ((dwFlags & 0x400) == 0 || !lpConfig->RegistryKey) + return 0; + if ((dwFlags & 0x80u) == 0) + { + lpConfig->wDeviceID = Globals->wDeviceID; + } + else if (lpConfig->wDeviceID >= waveOutGetNumDevs()) + { + lpConfig->wDeviceID = 0; + } + wsprintfA(SubKey, "WaveMix\\Device%u", lpConfig->wDeviceID); + if (RegOpenKeyA(lpConfig->RegistryKey, SubKey, &phkResult)) + return 0; + if ((dwFlags & 1) == 0) + lpConfig->wChannels = ReadRegistryInt(phkResult, "Channels", 1); + if ((dwFlags & 2) == 0) + lpConfig->wSamplingRate = ReadRegistryInt(phkResult, "SamplesPerSec", 11); + if ((dwFlags & 4) == 0) + lpConfig->WaveBlocks = static_cast(ReadRegistryInt(phkResult, "WaveBlocks", 3)); + if ((dwFlags & 8) == 0) + lpConfig->WaveBlockLen = static_cast(ReadRegistryInt(phkResult, "WaveBlockLen", 0)); + lpConfig->CmixPtrDefaultFlag = 1; + if ((dwFlags & 0x20) == 0) + lpConfig->ResetMixDefaultFlag = static_cast(ReadRegistryInt(phkResult, "Remix", 1)) != 2; + if ((dwFlags & 0x40) == 0) + { + int defaultGoodWavePos = DefaultGoodWavePos(lpConfig->wDeviceID); + lpConfig->GoodWavePos = static_cast(ReadRegistryInt( + phkResult, "GoodWavePos", defaultGoodWavePos)) != 0; + } + if ((dwFlags & 0x100) == 0) + lpConfig->ShowDebugDialogs = static_cast(ReadRegistryInt(phkResult, "ShowDebugDialogs", 0)); + if ((dwFlags & 0x200) == 0) + { + int defaultPauseBlocks = DefaultPauseBlocks(static_cast(lpConfig->WaveBlocks)); + lpConfig->PauseBlocks = static_cast(ReadRegistryInt(phkResult, "PauseBlocks", defaultPauseBlocks)); + } + lpConfig->dwFlags = 1023; + waveOutGetDevCapsA(lpConfig->wDeviceID, &Globals->WaveoutCaps, 0x34u); + RegCloseKey(phkResult); + return 1; +} + +int WaveMix::ReadRegistryInt(HKEY hKey, LPCSTR lpSubKey, int defaultValue) +{ + int result; + LONG cbData = 10; + char Data[12]; + + if (!hKey || RegQueryValueA(hKey, lpSubKey, Data, &cbData)) + result = defaultValue; + else + result = atol(Data); + return result; +} + +int WaveMix::DefaultGoodWavePos(unsigned uDeviceID) +{ + int result; + struct tagWAVEOUTCAPSA pwoc{}; + + auto deviceCount = waveOutGetNumDevs(); + if (uDeviceID > deviceCount || (uDeviceID & 0x80000000) != 0 || + !deviceCount || waveOutGetDevCapsA(uDeviceID, &pwoc, 0x34u)) + { + result = 0; + } + else + { + result = (LOBYTE(pwoc.dwSupport) >> 5) & 1; + } + return result; +} + +#pragma warning (disable : 4996)/*Original uses GetVersion*/ +int WaveMix::DefaultPauseBlocks(int waveBlocks) +{ + int result; + if (GetVersion() < 0x80000000 || static_cast(GetVersion()) < 4u) + result = waveBlocks; + else + result = 0; + return result; +} +#pragma warning (default : 4996) + +int WaveMix::Configure(GLOBALS* hMixSession, HWND hWndParent, MIXCONFIG* lpConfig, int* flag1Ptr, int saveConfigFlag) +{ + return 1; +} + +unsigned WaveMix::MyWaveOutGetPosition(HWAVEOUT hwo, int fGoodGetPos) +{ + mmtime_tag pmmt{}; + + if (!fGoodGetPos) + return ((timeGetTime() - Globals->dwBaseTime) * Globals->PCM.wf.nAvgBytesPerSec / 0x3E8) & 0xFFFFFFF8; + pmmt.wType = 4; + waveOutGetPosition(hwo, &pmmt, 0xCu); + return Globals->pfnSampleAdjust(pmmt.u.ms, Globals->dwWaveOutPos); +} + +void WaveMix::FreeChannelNode(CHANNELNODE* channel) +{ + if (channel) + { + channel->next = free_channel_nodes; + free_channel_nodes = channel; + } +} + +short WaveMix::cmixit(BYTE* a1, char* a2, char* a3, int a4, unsigned short a5) +{ + return 0; +} + +LRESULT WaveMix::WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) +{ + if (Msg != 957 && Msg != 1024) + return DefWindowProcA(hWnd, Msg, wParam, lParam); + Pump(); + return 0; +} diff --git a/SpaceCadetPinball/WaveMix.h b/SpaceCadetPinball/WaveMix.h index 38f028f..c6b7e2b 100644 --- a/SpaceCadetPinball/WaveMix.h +++ b/SpaceCadetPinball/WaveMix.h @@ -8,6 +8,7 @@ #define WMIX_WAIT 0x08 #define MAXCHANNELS 16 +#define MAXQUEUEDWAVES 100 struct MIXWAVE { @@ -28,10 +29,131 @@ struct MIXPLAYPARAMS WORD wLoops; }; +struct CHANNELNODE +{ + CHANNELNODE* next; + MIXPLAYPARAMS PlayParams; + MIXWAVE* lpMixWave; + DWORD dwNumSamples; + DWORD dwStartPos; + DWORD dwEndPos; + char* lpPos; + char* lpEnd; + int Unknown0; + int Unknown1; +}; + +struct MIXCONFIG +{ + WORD wSize; + DWORD dwFlags; + WORD wChannels; + WORD wSamplingRate; + __int16 WaveBlocks; + __int16 WaveBlockLen; + __int16 CmixPtrDefaultFlag; + unsigned __int16 ResetMixDefaultFlag; + unsigned __int16 GoodWavePos; + unsigned __int16 wDeviceID; + __int16 PauseBlocks; + __int16 ShowDebugDialogs; + HKEY RegistryKey; +}; + +struct GLOBALS +{ + WORD wMagic1; + __int16 unknown0; + int unknown1; + int unknown2; + HWAVEOUT hWaveOut; + int fActive; + int unknown5; + unsigned int wDeviceID; + int unknown7; + int unknown8; + int unknown9; + int unknown10; + int unknown11; + int unknown12; + int unknown13; + int unknown14; + int unknown15; + int unknown16; + int unknown17; + int unknown18; + int unknown19; + int unknown20; + int unknown21; + int unknown22; + int unknown23; + int unknown24; + int unknown25; + int unknown26; + int unknown27; + int unknown28; + int unknown29; + int unknown30; + WAVEOUTCAPSA WaveoutCaps; + int unknown44; + int unknown45; + int unknown46; + int unknown47; + int unknown48; + int unknown49; + int unknown50; + int unknown51; + int unknown52; + int unknown53; + int unknown54; + int unknown55; + int unknown56; + int unknown57; + int unknown58; + int unknown59; + int unknown60; + CHANNELNODE* aChannel[16]; + int unknown77; + int unknown78; + int unknown79; + int unknown80; + int unknown81; + int unknown82; + int unknown83; + int unknown84; + int unknown85; + int unknown86; + int unknown87; + int unknown88; + int unknown89; + int unknown90; + int unknown91; + int unknown92; + int unknown93; + int unknown94; + PCMWAVEFORMAT PCM; + int WaveBlockLen; + int WaveBlockCount; + int PauseBlocks; + int unknown102; + int unknown103; + DWORD dwBaseTime; + int fGoodGetPos; + int dwWaveOutPos; + int CmixPtr; + void(__stdcall* pfnRemix)(DWORD, CHANNELNODE*); + int (__stdcall* pfnSampleAdjust)(int, int); + int unknown110; + __int16 wMagic2; + __int16 unknown112; +}; + + class WaveMix { public: static HANDLE Init(); + static HANDLE ConfigureInit(MIXCONFIG* lpConfig); static int CloseSession(HANDLE hMixSession); static int OpenChannel(HANDLE hMixSession, int iChannel, unsigned int dwFlags); static int CloseChannel(HANDLE hMixSession, int iChannel, unsigned int dwFlags); @@ -41,4 +163,36 @@ public: static int Activate(HANDLE hMixSession, bool fActivate); static void Pump(); static int Play(MIXPLAYPARAMS* lpMixPlayParams); + +private: + static GLOBALS* SessionToGlobalDataPtr(HANDLE hMixSession); + static int Startup(HMODULE hModule); + static int SetIniFileName(HMODULE hModule); + static void InitChannelNodes(); + static void InitVolumeTable(); + static void ShowWaveOutDevices(); + static int RemoveInvalidIniNameCharacters(char* lpString); + static int ReadConfigSettings(MIXCONFIG* lpConfig); + static int ReadRegistryForAppSpecificConfigs(MIXCONFIG* lpConfig); + static int ReadRegistryInt(HKEY hKey, LPCSTR lpSubKey, int defaultValue); + static int DefaultGoodWavePos(unsigned int uDeviceID); + static int DefaultPauseBlocks(int waveBlocks); + static int Configure(GLOBALS* hMixSession, HWND hWndParent, MIXCONFIG* lpConfig, int* flag1Ptr, int saveConfigFlag); + static unsigned MyWaveOutGetPosition(HWAVEOUT hwo, int fGoodGetPos); + static void FreeChannelNode(CHANNELNODE* channel); + static __int16 cmixit(BYTE* a1, char* a2, char* a3, int a4, unsigned __int16 a5); + static LRESULT __stdcall WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); + + static int initialized_flag; + static char FileName[276]; + static CHANNELNODE channel_nodes[MAXQUEUEDWAVES]; + static CHANNELNODE* free_channel_nodes; + static char volume_table[256 * 11]; + static int debug_flag; + static int cmixit_ptr; + static HMODULE HModule; + static GLOBALS* Globals; + static PCMWAVEFORMAT gpFormat; + static int ShowDebugDialogs; + static char string_buffer[256]; };