From b0080fd80ace8a25a1e22252360413137b08671c Mon Sep 17 00:00:00 2001 From: oz Date: Sat, 23 Jan 2021 19:28:29 +0300 Subject: [PATCH] Sound ready. --- .gitignore | 1 + Doc/FuncStats.xlsx | Bin 39284 -> 39276 bytes SpaceCadetPinball/Sound.cpp | 245 +++++++++++++++++- SpaceCadetPinball/Sound.h | 25 +- SpaceCadetPinball/SpaceCadetPinball.vcxproj | 2 + .../SpaceCadetPinball.vcxproj.filters | 6 + SpaceCadetPinball/WaveMix.cpp | 51 ++++ SpaceCadetPinball/WaveMix.h | 44 ++++ SpaceCadetPinball/loader.cpp | 2 +- SpaceCadetPinball/loader.h | 3 +- SpaceCadetPinball/pch.h | 5 +- 11 files changed, 363 insertions(+), 21 deletions(-) create mode 100644 SpaceCadetPinball/WaveMix.cpp create mode 100644 SpaceCadetPinball/WaveMix.h diff --git a/.gitignore b/.gitignore index 77cf21f..0e6b0e2 100644 --- a/.gitignore +++ b/.gitignore @@ -262,3 +262,4 @@ __pycache__/ /Ida /Export /DrMem +/Doc private diff --git a/Doc/FuncStats.xlsx b/Doc/FuncStats.xlsx index 44a23b53454fa99a2aeaf214ad769578023d4aad..fb21803d8b54fbccbd71a7b6088d9490e71655dc 100644 GIT binary patch delta 31048 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 Q=}C-IB0cJ1?9H+N2fWfsN&o-= delta 31038 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 z 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¨AO>8HHat#8rUFtfwY*`rIXRyXb;BFObgc~O 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 BIBfs` diff --git a/SpaceCadetPinball/Sound.cpp b/SpaceCadetPinball/Sound.cpp index c7c3b38..6097d31 100644 --- a/SpaceCadetPinball/Sound.cpp +++ b/SpaceCadetPinball/Sound.cpp @@ -1,33 +1,146 @@ #include "pch.h" #include "Sound.h" -int Sound::Init(HINSTANCE hInstance, int voices, void (__stdcall* someFuncPtr)(int, int, int)) +#include "pinball.h" +#include "WaveMix.h" +#include "winmain.h" + +int Sound::num_channels; +HWND Sound::wavemix_window; +HANDLE Sound::pMem; +unsigned int Sound::enabled_flag; +int Sound::channel_time[8]; +MIXWAVE* Sound::channel_wavePtr[8]; +void (*Sound::callback_ptr)(int, MIXWAVE*, int); +HMODULE Sound::HInstance; + + +int Sound::Init(HINSTANCE hInstance, int voices, void (* someFuncPtr)(int, MIXWAVE*, int)) { + WNDCLASSA WndClass; + char FileName[300]; + + int channelCount = voices; + if (voices > 8) + channelCount = 8; + num_channels = channelCount; + if (wavemix_window || pMem) + return 0; + enabled_flag = -1; + for (int i = 0; i < channelCount; ++i) + { + channel_time[i] = 0; + channel_wavePtr[i] = nullptr; + } + callback_ptr = someFuncPtr; + if (!someFuncPtr) + callback_ptr = NullCallback; + + pinball::make_path_name(FileName, "wavemix.inf", 300); + FILE* wavemixIniFile = nullptr; + fopen_s(&wavemixIniFile, FileName, "r"); + if (wavemixIniFile) + { + fclose(wavemixIniFile); + } + else + { + MessageBoxA(winmain::hwnd_frame, pinball::get_rc_string(42, 0), pinball::WindowName, 0x2000u); + } + + WndClass.style = 0; + WndClass.lpfnWndProc = SoundCallBackWndProc; + WndClass.cbClsExtra = 0; + WndClass.cbWndExtra = 0; + WndClass.hInstance = hInstance; + WndClass.hIcon = nullptr; + WndClass.hCursor = nullptr; + WndClass.hbrBackground = nullptr; + WndClass.lpszMenuName = nullptr; + WndClass.lpszClassName = "WaveMixSoundGuy"; + RegisterClassA(&WndClass); + wavemix_window = CreateWindowExA( + 0, + "WaveMixSoundGuy", + nullptr, + 0x80000000, + 0x80000000, + 0, + 0x80000000, + 0, + nullptr, + nullptr, + hInstance, + nullptr); + if (!wavemix_window) + return 0; + + HInstance = hInstance; + HANDLE hMixSession = WaveMix::Init(); + pMem = hMixSession; + if (!hMixSession) + return 0; + WaveMix::OpenChannel(hMixSession, num_channels, 2u); return 1; } -void Sound::Enable(int a1, int a2, int a3) +void Sound::Enable(int channelFrom, int channelTo, int enableFlag) { -} + if (pMem) + { + if (channelTo >= num_channels) + channelTo = num_channels - 1; -void Sound::nullsub_1(int a1, int a2, int a3) -{ + if (channelFrom >= 0 && channelTo < num_channels) + { + for (int index = channelFrom; index <= channelTo; ++index) + { + int channelFlag = 1 << index; + if (enableFlag) + { + enabled_flag |= channelFlag; + } + else + { + enabled_flag &= ~channelFlag; + Flush(index, index); + } + } + } + } } void Sound::Idle() { + if (pMem) + WaveMix::Pump(); } void Sound::Activate() { + if (pMem) + WaveMix::Activate(pMem, true); } void Sound::Deactivate() { + if (pMem) + WaveMix::Activate(pMem, false); } void Sound::Close() { + if (wavemix_window) + { + DestroyWindow(wavemix_window); + wavemix_window = nullptr; + } + if (pMem) + { + WaveMix::CloseChannel(pMem, 0, 1); + WaveMix::CloseSession(pMem); + pMem = nullptr; + } } int Sound::SubFactor(int a1, int a2) @@ -40,16 +153,124 @@ int Sound::AddFactor(int a1, int a2) return a1 + a2; } -void Sound::PlaySoundA(int a1, int a2, int a3, unsigned short a4, short a5) +void Sound::PlaySound(MIXWAVE* wavePtr, int minChannel, int maxChannel, unsigned int dwFlags, __int16 loops) +{ + MIXPLAYPARAMS mixParams{}; + + if (!pMem) + return; + + if (maxChannel >= num_channels) + maxChannel = num_channels - 1; + if (!wavePtr || minChannel < 0 || maxChannel >= num_channels) + return; + + if ((dwFlags & 0x8000) != 0 && num_channels > 0) + { + int index2 = 0; + bool ok = false; + while (channel_wavePtr[index2] != wavePtr) + { + if (++index2 >= num_channels) + { + ok = true; + break; + } + } + if (!ok) + return; + } + + + int playChannel = minChannel; + if (minChannel < maxChannel) + { + int curChannel = minChannel; + do + { + ++curChannel; + if ((1 << curChannel) & enabled_flag && + channel_time[curChannel] < channel_time[playChannel]) + { + playChannel = curChannel; + } + } + while (curChannel < maxChannel); + } + + if ((1 << playChannel) & enabled_flag) + { + mixParams.hMixSession = pMem; + mixParams.hWndNotify = wavemix_window; + mixParams.dwFlags = dwFlags; + mixParams.wSize = 28; + mixParams.wLoops = loops; + mixParams.iChannel = playChannel; + mixParams.lpMixWave = wavePtr; + + callback_ptr(1, wavePtr, playChannel); + channel_time[playChannel] = timeGetTime(); + channel_wavePtr[playChannel] = wavePtr; + WaveMix::Play(&mixParams); + } +} + +MIXWAVE* Sound::LoadWaveFile(LPCSTR lpName) +{ + return pMem ? WaveMix::OpenWave(pMem, lpName, HInstance, 1u) : nullptr; +} + +void Sound::FreeSound(MIXWAVE* wave) +{ + if (wave && pMem) + WaveMix::FreeWave(pMem, wave); +} + +void Sound::Flush(int channelFrom, int channelTo) +{ + if (pMem) + { + if (channelTo >= num_channels) + channelTo = num_channels - 1; + + if (channelFrom >= 0 && channelTo < num_channels) + { + for (auto index = channelFrom; index <= channelTo; index++) + { + WaveMix::FlushChannel(pMem, index, 0); + channel_time[index] = 0; + channel_wavePtr[index] = nullptr; + } + } + } +} + +void Sound::NullCallback(int a1, MIXWAVE* a2, int a3) { } -CHAR* Sound::LoadWaveFile(LPCSTR lpName) +LRESULT Sound::SoundCallBackWndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { - return nullptr; -} + if (Msg != 957) + return DefWindowProcA(hWnd, Msg, wParam, lParam); -LPCVOID Sound::FreeSound(LPCVOID pMem) -{ - return nullptr; + auto wavePtr = reinterpret_cast(lParam); + int channel = -1; + for (auto index = 0; index < num_channels; ++index) + { + if (channel_wavePtr[index] == wavePtr && + (channel < 0 || channel_time[index] < channel_time[channel])) + { + channel = index; + } + } + + if (channel >= 0) + { + channel_time[channel] = 0; + channel_wavePtr[channel] = nullptr; + } + + callback_ptr(2, wavePtr, channel); + return 0; } diff --git a/SpaceCadetPinball/Sound.h b/SpaceCadetPinball/Sound.h index 00951bc..5eea4dd 100644 --- a/SpaceCadetPinball/Sound.h +++ b/SpaceCadetPinball/Sound.h @@ -1,17 +1,30 @@ #pragma once +#include "WaveMix.h" + class Sound { public: - static int Init(HINSTANCE hInstance, int voices, void (__stdcall* someFuncPtr)(int, int, int)); - static void Enable(int a1, int a2, int a3); - static void nullsub_1(int a1, int a2, int a3); + static int Init(HINSTANCE hInstance, int voices, void (* someFuncPtr)(int, MIXWAVE*, int)); + static void Enable(int channelFrom, int channelTo, int enableFlag); static void Idle(); static void Activate(); static void Deactivate(); static void Close(); static int SubFactor(int a1, int a2); static int AddFactor(int a1, int a2); - static void PlaySound(int a1, int a2, int a3, unsigned __int16 a4, __int16 a5); - static CHAR* LoadWaveFile(LPCSTR lpName); - static LPCVOID FreeSound(LPCVOID pMem); + static void PlaySound(MIXWAVE* wavePtr, int minChannel, int maxChannel, unsigned int dwFlags, __int16 loops); + static MIXWAVE* LoadWaveFile(LPCSTR lpName); + static void FreeSound(MIXWAVE* wave); + static void Flush(int channelFrom, int channelTo); + static void NullCallback(int a1, MIXWAVE* a2, int a3); + static LRESULT __stdcall SoundCallBackWndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); +private: + static int num_channels; + static HWND wavemix_window; + static HANDLE pMem; + static unsigned int enabled_flag; + static int channel_time[8]; + static MIXWAVE* channel_wavePtr[8]; + static void (* callback_ptr)(int, MIXWAVE*, int); + static HMODULE HInstance; }; diff --git a/SpaceCadetPinball/SpaceCadetPinball.vcxproj b/SpaceCadetPinball/SpaceCadetPinball.vcxproj index 87e3db8..170af74 100644 --- a/SpaceCadetPinball/SpaceCadetPinball.vcxproj +++ b/SpaceCadetPinball/SpaceCadetPinball.vcxproj @@ -217,6 +217,7 @@ + @@ -286,6 +287,7 @@ + diff --git a/SpaceCadetPinball/SpaceCadetPinball.vcxproj.filters b/SpaceCadetPinball/SpaceCadetPinball.vcxproj.filters index 7317e0e..6fcaf37 100644 --- a/SpaceCadetPinball/SpaceCadetPinball.vcxproj.filters +++ b/SpaceCadetPinball/SpaceCadetPinball.vcxproj.filters @@ -222,6 +222,9 @@ Header Files\TEdgeSegment + + Header Files + @@ -410,6 +413,9 @@ Source Files\TEdgeSegment + + Source Files + diff --git a/SpaceCadetPinball/WaveMix.cpp b/SpaceCadetPinball/WaveMix.cpp new file mode 100644 index 0000000..8af1ff6 --- /dev/null +++ b/SpaceCadetPinball/WaveMix.cpp @@ -0,0 +1,51 @@ +#include "pch.h" +#include "WaveMix.h" + +HANDLE WaveMix::Init() +{ + return (HANDLE)1; +} + +int WaveMix::CloseSession(HANDLE hMixSession) +{ + return 0; +} + +int WaveMix::OpenChannel(HANDLE hMixSession, int iChannel, unsigned dwFlags) +{ + return 0; +} + +int WaveMix::CloseChannel(HANDLE hMixSession, int iChannel, unsigned dwFlags) +{ + return 0; +} + +int WaveMix::FlushChannel(HANDLE hMixSession, int iChannel, unsigned dwFlags) +{ + return 0; +} + +MIXWAVE* WaveMix::OpenWave(HANDLE hMixSession, LPCSTR szWaveFilename, HINSTANCE hInst, unsigned dwFlags) +{ + return new MIXWAVE{}; +} + +int WaveMix::FreeWave(HANDLE hMixSession, MIXWAVE* lpMixWave) +{ + return 0; +} + +int WaveMix::Activate(HANDLE hMixSession, bool fActivate) +{ + return 0; +} + +void WaveMix::Pump() +{ +} + +int WaveMix::Play(MIXPLAYPARAMS* lpMixPlayParams) +{ + return 0; +} diff --git a/SpaceCadetPinball/WaveMix.h b/SpaceCadetPinball/WaveMix.h new file mode 100644 index 0000000..38f028f --- /dev/null +++ b/SpaceCadetPinball/WaveMix.h @@ -0,0 +1,44 @@ +#pragma once + +/* flag values for play params */ +#define WMIX_QUEUEWAVE 0x00 +#define WMIX_CLEARQUEUE 0x01 +#define WMIX_USELRUCHANNEL 0x02 +#define WMIX_HIPRIORITY 0x04 +#define WMIX_WAIT 0x08 + +#define MAXCHANNELS 16 + +struct MIXWAVE +{ + PCMWAVEFORMAT pcm; + WAVEHDR wh; + char szWaveFilename[16]; + short Unknown0; +}; + +struct MIXPLAYPARAMS +{ + WORD wSize; + HANDLE hMixSession; + int iChannel; + MIXWAVE* lpMixWave; + HWND hWndNotify; + DWORD dwFlags; + WORD wLoops; +}; + +class WaveMix +{ +public: + static HANDLE Init(); + 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); + static int FlushChannel(HANDLE hMixSession, int iChannel, unsigned int dwFlags); + static MIXWAVE* OpenWave(HANDLE hMixSession, LPCSTR szWaveFilename, HINSTANCE hInst, unsigned int dwFlags); + static int FreeWave(HANDLE hMixSession, MIXWAVE* lpMixWave); + static int Activate(HANDLE hMixSession, bool fActivate); + static void Pump(); + static int Play(MIXPLAYPARAMS* lpMixPlayParams); +}; diff --git a/SpaceCadetPinball/loader.cpp b/SpaceCadetPinball/loader.cpp index 8e0b581..7f1a0f9 100644 --- a/SpaceCadetPinball/loader.cpp +++ b/SpaceCadetPinball/loader.cpp @@ -325,7 +325,7 @@ float loader::play_sound(int soundIndex) { if (soundIndex <= 0) return 0.0; - Sound::PlaySound((int)sound_list[soundIndex].WavePtr, 0, 7, 5, 0); + Sound::PlaySound(sound_list[soundIndex].WavePtr, 0, 7, WMIX_HIPRIORITY | WMIX_CLEARQUEUE, 0); return sound_list[soundIndex].Duration; } diff --git a/SpaceCadetPinball/loader.h b/SpaceCadetPinball/loader.h index b8e6ba7..0c24529 100644 --- a/SpaceCadetPinball/loader.h +++ b/SpaceCadetPinball/loader.h @@ -1,6 +1,7 @@ #pragma once #include "gdrv.h" #include "maths.h" +#include "WaveMix.h" #include "zdrv.h" @@ -14,7 +15,7 @@ struct errorMsg struct soundListStruct { - char* WavePtr; + MIXWAVE* WavePtr; int GroupIndex; int Loaded; float Duration; diff --git a/SpaceCadetPinball/pch.h b/SpaceCadetPinball/pch.h index e0ebb64..7c74e54 100644 --- a/SpaceCadetPinball/pch.h +++ b/SpaceCadetPinball/pch.h @@ -19,7 +19,10 @@ #include /*For control template*/ //#include -// Use (void) to silent unused warnings. +/*Use (void) to silent unused warnings.*/ #define assertm(exp, msg) assert(((void)msg, exp)) +/*Sound uses PlaySound*/ +#undef PlaySound + #endif //PCH_H