From 74306179a72e52ff8ebbd3e2fd59c919dea57f5c Mon Sep 17 00:00:00 2001 From: oz Date: Thu, 28 Jan 2021 12:46:48 +0300 Subject: [PATCH] WaveMix ready. Fixed ball Z reset in TKickout. --- Doc/FuncStats.xlsx | Bin 39409 -> 39382 bytes SpaceCadetPinball/Sound.cpp | 2 +- SpaceCadetPinball/TKickout.cpp | 8 +- SpaceCadetPinball/TKickout.h | 2 +- SpaceCadetPinball/WaveMix.cpp | 287 ++++++++++++++++++++++++++++++- SpaceCadetPinball/WaveMix.h | 46 ++--- SpaceCadetPinball/high_score.cpp | 2 +- 7 files changed, 300 insertions(+), 47 deletions(-) diff --git a/Doc/FuncStats.xlsx b/Doc/FuncStats.xlsx index d957b4608bcce0b38f5c13a8b42cc3f24fa54861..03d4a9f4d2e863eaccd64a0f8d2d79844fef0060 100644 GIT binary patch delta 26233 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 diff --git a/SpaceCadetPinball/Sound.cpp b/SpaceCadetPinball/Sound.cpp index ae1456f..f53756a 100644 --- a/SpaceCadetPinball/Sound.cpp +++ b/SpaceCadetPinball/Sound.cpp @@ -241,7 +241,7 @@ void Sound::NullCallback(int a1, MIXWAVE* a2, int a3) LRESULT Sound::SoundCallBackWndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { - if (Msg != 957) + if (Msg != MM_WOM_DONE) return DefWindowProcA(hWnd, Msg, wParam, lParam); auto wavePtr = reinterpret_cast(lParam); diff --git a/SpaceCadetPinball/TKickout.cpp b/SpaceCadetPinball/TKickout.cpp index 1ce63bd..e802853 100644 --- a/SpaceCadetPinball/TKickout.cpp +++ b/SpaceCadetPinball/TKickout.cpp @@ -113,9 +113,9 @@ void TKickout::Collision(TBall* ball, vector_type* nextPosition, vector_type* di KickFlag1 = 1; ball->CollisionComp = this; ball->Position.X = Circle.Center.X; - ball->Position.Y = Circle.Center.Y; - ball->Position.Z = CollisionBallSetZ; - FieldBallZSet = ball->Position.Z; + ball->Position.Y = Circle.Center.Y; + OriginalBallZ = ball->Position.Z; + ball->Position.Z = CollisionBallSetZ; if (PinballTable->TiltLockFlag) { Message(55, 0.1f); @@ -153,7 +153,7 @@ void TKickout::TimerExpired(int timerId, void* caller) kick->Timer = timer::set(kick->TimerTime2, kick, ResetTimerExpired); if (kick->Ball) { - kick->Ball->Position.Z = kick->FieldBallZSet; + kick->Ball->Position.Z = kick->OriginalBallZ; TBall::throw_ball(kick->Ball, &kick->BallAcceleration, kick->ThrowAngleMult, kick->ThrowSpeedMult1, kick->ThrowSpeedMult2); kick->UnknownBaseFlag2 = 0; diff --git a/SpaceCadetPinball/TKickout.h b/SpaceCadetPinball/TKickout.h index 1079041..d027d81 100644 --- a/SpaceCadetPinball/TKickout.h +++ b/SpaceCadetPinball/TKickout.h @@ -27,7 +27,7 @@ public: TBall* Ball; float FieldMult; circle_type Circle; - float FieldBallZSet; + float OriginalBallZ; vector_type BallAcceleration; float ThrowAngleMult; float ThrowSpeedMult1; diff --git a/SpaceCadetPinball/WaveMix.cpp b/SpaceCadetPinball/WaveMix.cpp index b473e13..552ce71 100644 --- a/SpaceCadetPinball/WaveMix.cpp +++ b/SpaceCadetPinball/WaveMix.cpp @@ -22,6 +22,7 @@ XWAVEHDR* WaveMix::block_array1[10]; XWAVEHDR* WaveMix::block_array2[10]; unsigned char* WaveMix::play_data[MAXCHANNELS]; volume_struct WaveMix::play_volume[MAXCHANNELS]; +int WaveMix::play_counter = 0; HANDLE WaveMix::Init() { @@ -573,7 +574,253 @@ void WaveMix::Pump() int WaveMix::Play(MIXPLAYPARAMS* lpMixPlayParams) { - return 0; + ++play_counter; + auto result = 12; + auto remixFlag = 0; + + do + { + if (play_counter > 1) + break; + + if (!lpMixPlayParams) + { + if (ShowDebugDialogs) + MessageBoxA(nullptr, "NULL parameters pointer passed to WaveMixPlay!", "WavMix32", 0x30u); + result = 5; + break; + } + + auto globals = SessionToGlobalDataPtr(lpMixPlayParams->hMixSession); + Globals = globals; + if (!globals) + { + if (ShowDebugDialogs) + MessageBoxA(nullptr, "Invalid session handle passed to WaveMixPlay", "WavMix32", 0x30u); + result = 5; + break; + } + + if (!IsValidLPMIXWAVE(lpMixPlayParams->lpMixWave)) + { + if (ShowDebugDialogs) + MessageBoxA(nullptr, "Invalid or NULL wave pointer passed to WaveMixPlay!", "WavMix32", 0x30u); + break; + } + + if (!HasCurrentOutputFormat(lpMixPlayParams->lpMixWave)) + { + wsprintfA( + string_buffer, + "The LPMIXWAVE 0x%lx is not in the current output format, close the wave and reopen it.", + lpMixPlayParams->lpMixWave); + if (ShowDebugDialogs) + MessageBoxA(nullptr, string_buffer, "WavMix32", 0x30u); + result = 8; + break; + } + if (!globals->fActive) + { + if (ShowDebugDialogs) + MessageBoxA(nullptr, "Wave device not allocated, call WaveMixActivate(hMixSession,TRUE)", "WavMix32", + 0x30u); + result = 4; + break; + } + if (!globals->iChannels) + { + if (ShowDebugDialogs) + MessageBoxA(nullptr, "You must open a channel before you can play a wave!", "WavMix32", 0x30u); + result = 5; + break; + } + + int iChannel; + if ((lpMixPlayParams->dwFlags & WMIX_USELRUCHANNEL) != 0) + { + iChannel = 0; + for (auto channelIndex = 0; channelIndex < 16; ++channelIndex) + { + if (globals->aChannel[channelIndex] != reinterpret_cast(-1)) + { + if (!globals->aChannel[iChannel]) + break; + if (channelIndex != iChannel && globals->MRUChannel[channelIndex] < globals->MRUChannel[iChannel]) + iChannel = channelIndex; + } + } + lpMixPlayParams->iChannel = iChannel; + } + else + { + iChannel = lpMixPlayParams->iChannel; + } + ++globals->dwMRU; + globals->MRUChannel[iChannel] = globals->dwMRU; + if (globals->aChannel[iChannel] == reinterpret_cast(-1)) + { + result = 5; + break; + } + + auto channel = GetChannelNode(); + if (!channel) + break; + + memcpy(&channel->PlayParams, lpMixPlayParams, sizeof(channel->PlayParams)); + channel->lpMixWave = channel->PlayParams.lpMixWave; + channel->dwNumSamples = channel->PlayParams.lpMixWave->wh.dwBufferLength; + auto lpData = (unsigned __int8*)channel->PlayParams.lpMixWave->wh.lpData; + channel->lpPos = lpData; + channel->lpEnd = &lpData[channel->dwNumSamples - globals->PCM.wf.nBlockAlign]; + channel->PlayParams.iChannel = iChannel; + if (globals->pWaitList) + { + channel->next = globals->pWaitList->next; + globals->pWaitList->next = channel; + globals->pWaitList = channel; + } + else + { + globals->pWaitList = channel; + channel->next = channel; + } + + if ((channel->PlayParams.dwFlags & WMIX_WAIT) != 0) + { + result = 0; + break; + } + + ResetWavePosIfNoChannelData(); + auto globals2 = Globals; + unsigned wavePosition; + if (Globals->pfnRemix == ResetRemix) + { + wavePosition = MyWaveOutGetPosition(Globals->hWaveOut, Globals->fGoodGetPos); + globals2 = Globals; + } + else + { + wavePosition = Globals->dwCurrentSample; + } + + while (globals2->pWaitList) + { + auto curChannel = globals2->pWaitList->next; + if (globals2->pWaitList->next == globals2->pWaitList) + globals2->pWaitList = nullptr; + else + globals2->pWaitList->next = curChannel->next; + + iChannel = curChannel->PlayParams.iChannel; + curChannel->next = nullptr; + if ((curChannel->PlayParams.dwFlags & WMIX_CustomVolume) != 0) + { + curChannel->Volume.L = curChannel->PlayParams.Volume.L; + curChannel->Volume.R = curChannel->PlayParams.Volume.R; + } + else + { + curChannel->Volume.L = globals2->ChannelVolume[iChannel].L; + curChannel->Volume.R = globals2->ChannelVolume[iChannel].R; + } + if (curChannel->Volume.L > 10u) + curChannel->Volume.L = 10; + if (curChannel->Volume.R > 10u) + curChannel->Volume.R = 10; + + if ((curChannel->PlayParams.dwFlags & WMIX_CLEARQUEUE) != 0) + { + for (auto tmpCh = globals2->aChannel[iChannel]; tmpCh;) + { + auto nextChannel = tmpCh->next; + FreeChannelNode(tmpCh); + tmpCh = nextChannel; + } + globals2->aChannel[iChannel] = curChannel; + if (play_queue.first != nullptr) + remixFlag = 1; + if ((curChannel->PlayParams.dwFlags & WMIX_HIPRIORITY) != 0) + curChannel->dwStartPos = wavePosition; + else + curChannel->dwStartPos = globals2->dwCurrentSample; + } + else + { + DWORD dwStartPos; + if (globals2->aChannel[iChannel]) + { + auto tmpCh = globals2->aChannel[iChannel]; + while (tmpCh->next) + tmpCh = tmpCh->next; + tmpCh->next = curChannel; + dwStartPos = tmpCh->dwEndPos; + + if ((curChannel->PlayParams.dwFlags & WMIX_HIPRIORITY) != 0) + { + if (dwStartPos <= wavePosition) + dwStartPos = wavePosition; + } + else if (globals2->dwCurrentSample > dwStartPos) + { + dwStartPos = globals2->dwCurrentSample; + } + } + else + { + dwStartPos = wavePosition; + globals2->aChannel[iChannel] = curChannel; + if ((curChannel->PlayParams.dwFlags & WMIX_HIPRIORITY) == 0) + dwStartPos = globals2->dwCurrentSample; + } + curChannel->dwStartPos = dwStartPos; + if (globals2->dwCurrentSample > curChannel->dwStartPos) + remixFlag = 1; + } + if (curChannel->PlayParams.wLoops == 0xFFFF) + curChannel->dwEndPos = -1; + else + curChannel->dwEndPos = curChannel->dwStartPos + curChannel->dwNumSamples * (curChannel + ->PlayParams.wLoops + 1) - + globals2->PCM.wf.nBlockAlign; + } + + if (!remixFlag || !globals2->pfnRemix(wavePosition, nullptr)) + { + int pauseFlag; + if (play_queue.first || globals2->PauseBlocks <= 0) + { + pauseFlag = 0; + } + else + { + waveOutPause(globals2->hWaveOut); + pauseFlag = 1; + } + + auto pauseCounter = 0; + while (MixerPlay(GetWaveBlock(), 1)) + { + if (pauseFlag) + { + if (++pauseCounter >= Globals->PauseBlocks) + { + waveOutRestart(Globals->hWaveOut); + pauseFlag = 0; + } + } + } + if (pauseFlag) + waveOutRestart(Globals->hWaveOut); + } + + result = 0; + } + while (false); + + --play_counter; + return result; } GLOBALS* WaveMix::SessionToGlobalDataPtr(HANDLE hMixSession) @@ -2255,6 +2502,38 @@ void WaveMix::FreePlayedBlocks() } } +int WaveMix::HasCurrentOutputFormat(MIXWAVE* lpMixWave) +{ + return memcmp(lpMixWave, &Globals->PCM, 0x10u) == 0; +} + +CHANNELNODE* WaveMix::GetChannelNode() +{ + CHANNELNODE* result = free_channel_nodes; + if (result) + { + free_channel_nodes = free_channel_nodes->next; + result->next = nullptr; + } + return result; +} + +void WaveMix::ResetWavePosIfNoChannelData() +{ + if (!play_queue.first) + { + int channelIndex = 0; + for (CHANNELNODE** i = Globals->aChannel; !*i || *i == reinterpret_cast(-1); ++i) + { + if (++channelIndex >= 16) + { + SetWaveOutPosition(0); + return; + } + } + } +} + void WaveMix::cmixit(unsigned __int8* lpDest, unsigned __int8** rgWaveSrc, volume_struct* volumeArr, int iNumWaves, unsigned __int16 length) { @@ -2326,7 +2605,7 @@ void WaveMix::cmixit(unsigned __int8* lpDest, unsigned __int8** rgWaveSrc, volum LRESULT WaveMix::WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { - if (Msg != 957 && Msg != 1024) + if (Msg != MM_WOM_DONE && Msg != WM_USER) return DefWindowProcA(hWnd, Msg, wParam, lParam); Pump(); return 0; @@ -2334,9 +2613,9 @@ LRESULT WaveMix::WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) INT_PTR WaveMix::SettingsDlgProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { - if (Msg == 272) + if (Msg == WM_INITDIALOG) return Settings_OnInitDialog(hWnd, wParam, (MIXCONFIG*)lParam); - if (Msg != 273) + if (Msg != WM_COMMAND) return 0; Settings_OnCommand(hWnd, static_cast(wParam), lParam, HIWORD(wParam)); return 1; diff --git a/SpaceCadetPinball/WaveMix.h b/SpaceCadetPinball/WaveMix.h index 0908c7f..f92794c 100644 --- a/SpaceCadetPinball/WaveMix.h +++ b/SpaceCadetPinball/WaveMix.h @@ -6,6 +6,7 @@ #define WMIX_USELRUCHANNEL 0x02 #define WMIX_HIPRIORITY 0x04 #define WMIX_WAIT 0x08 +#define WMIX_CustomVolume 0x10 #define MAXCHANNELS 16 #define MAXQUEUEDWAVES 100 @@ -36,7 +37,7 @@ struct MIXPLAYPARAMS HWND hWndNotify; DWORD dwFlags; WORD wLoops; - int Unknown0; + volume_struct Volume; }; struct CHANNELNODE @@ -94,45 +95,14 @@ struct GLOBALS int fActive; int SettingsDialogActiveFlag; unsigned int wDeviceID; - char szDevicePName[32]; - 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; + char szDevicePName[96]; WAVEOUTCAPSA WaveoutCaps; volume_struct DefaultVolume; volume_struct ChannelVolume[MAXCHANNELS]; CHANNELNODE* aChannel[MAXCHANNELS]; int iChannels; - 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; + DWORD MRUChannel[MAXCHANNELS]; + DWORD dwMRU; PCMWAVEFORMAT PCM; DWORD dwWaveBlockLen; int WaveBlockCount; @@ -146,7 +116,7 @@ struct GLOBALS unsigned __int16 length); int (* pfnRemix)(DWORD, CHANNELNODE*); DWORD (* pfnSampleAdjust)(DWORD, DWORD); - int unknown110; + CHANNELNODE* pWaitList; __int16 wMagic2; __int16 unknown112; }; @@ -242,6 +212,9 @@ private: static void RepSample(HPSTR lpOutData, HPSTR lpInData, unsigned nRep, int nBytesPerSample, int nChannels); static bool IsValidLPMIXWAVE(MIXWAVE* lpMixWave); static void FreePlayedBlocks(); + static int HasCurrentOutputFormat(MIXWAVE* lpMixWave); + static CHANNELNODE* GetChannelNode(); + static void ResetWavePosIfNoChannelData(); static void cmixit(unsigned __int8* lpDest, unsigned __int8** rgWaveSrc, volume_struct* volumeArr, int iNumWaves, unsigned __int16 length); static LRESULT __stdcall WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); @@ -266,4 +239,5 @@ private: static XWAVEHDR* block_array2[10]; static unsigned char* play_data[MAXCHANNELS]; static volume_struct play_volume[MAXCHANNELS]; + static int play_counter; }; diff --git a/SpaceCadetPinball/high_score.cpp b/SpaceCadetPinball/high_score.cpp index 9311781..e30c5ab 100644 --- a/SpaceCadetPinball/high_score.cpp +++ b/SpaceCadetPinball/high_score.cpp @@ -187,7 +187,7 @@ void high_score::show_and_set_high_score_dialog(high_score_struct* table, int sc } } -INT_PTR __stdcall high_score::HighScore(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) +INT_PTR high_score::HighScore(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { HWND parent; int nIDDlgItem;