diff --git a/src/SokuAddresses.hpp b/src/SokuAddresses.hpp index 6414f3c..e86d1ef 100644 --- a/src/SokuAddresses.hpp +++ b/src/SokuAddresses.hpp @@ -45,6 +45,7 @@ namespace SokuLib ADDR_SWR_FONT_CREATE = 0x004116D0, ADDR_SWR_FONT_DESTRUCT = 0x00411760, ADDR_SWR_FONT_SET_INDIRECT = 0x00411840, + ADDR_SWR_CONVERT_VOLUME_TO_DSOUND = 0x00418B30, ADDR_CNUMBER_RENDER = 0x00414940, ADDR_GET_PACKAGED_BGM_CALLER = 0x00418BE1, ADDR_GET_PACKAGED_SFL_CALLER = 0x00418F41, @@ -140,6 +141,8 @@ namespace SokuLib ADDR_VTBL_CDESIGN_SPRITE = 0x008710E4, ADDR_VTBL_CDESIGN_GAUGE = 0x00871104, ADDR_VTBL_CDESIGN_NUMBER = 0x00871124, + ADDR_VTBL_CDSBUFFER = 0x008713a8, + ADDR_VTBL_CDS3DBUFFER = 0x00871384, ADDR_VTBL_BITMAPDATA = 0x00871474, ADDR_VTBL_PACKAGEREADER = 0x0087148C, @@ -167,6 +170,7 @@ namespace SokuLib ADDR_RCHARID = 0x00899D30, ADDR_INPUT_MANAGER_CLUSTER = 0x0089A248, ADDR_MENU_LIST = 0x0089A884, + ADDR_SOUND_MANAGER = 0x0089F9F8, ADDR_TEXTURE_MANAGER = 0x0089FF08, ADDR_WINDOW_HWND = 0x0089FF90, ADDR_LOAD_GRAPHICS_THREAD = 0x0089FFF4, diff --git a/src/SoundManager.cpp b/src/SoundManager.cpp index 09eae1a..233337d 100644 --- a/src/SoundManager.cpp +++ b/src/SoundManager.cpp @@ -9,4 +9,26 @@ namespace SokuLib { void (* const playSEWaveBuffer)(int id) = reinterpret_cast(ADDR_PLAY_SE_WAVE_BUFFER); void (* const playNetBell)(int id) = reinterpret_cast(ADDR_PLAY_NET_BELL); + void DSBuffer::Initialize(LPWAVEFORMATEX waveformatex, DWORD bufSize) { + (* ((void (__thiscall **)(DSBuffer* , LPWAVEFORMATEX, DWORD)) ADDR_VTBL_CDSBUFFER))(this, waveformatex, bufSize); + } + void DSBuffer::Delete(bool free) { + (* ((void (__thiscall **)(DSBuffer* , bool free)) (ADDR_VTBL_CDSBUFFER + 4)))(this, free); + } + void DS3DBuffer::Initialize(LPWAVEFORMATEX waveformatex, DWORD bufSize) { + (* ((void (__thiscall **)(DSBuffer* , LPWAVEFORMATEX, DWORD)) ADDR_VTBL_CDS3DBUFFER))(this, waveformatex, bufSize); + } + void DS3DBuffer::Delete(bool free) { + (* ((void (__thiscall **)(DSBuffer* , bool free)) (ADDR_VTBL_CDS3DBUFFER + 4)))(this, free); + } + int (__stdcall *const ConvertFloatVolumeToDSoundVolume)(float volume) = (int (__stdcall *)(float)) ADDR_SWR_CONVERT_VOLUME_TO_DSOUND; + bool SoundManager::SetVolumeByDSBufferManagerID(unsigned int id) { + if (!id) + return false; + DSBuffer **buffer = this->DSBufferManager.Get(id); + if (!buffer || !*buffer) + return false; + return (*buffer)->pIDirectSoundBuffer->SetVolume(ConvertFloatVolumeToDSoundVolume(this->SEVolume * this->SEVolumeCoefficient)) == DS_OK; + } + SoundManager &soundMgr = * (SoundManager *) ADDR_SOUND_MANAGER; } \ No newline at end of file diff --git a/src/SoundManager.hpp b/src/SoundManager.hpp index 06307ec..1392539 100644 --- a/src/SoundManager.hpp +++ b/src/SoundManager.hpp @@ -4,7 +4,8 @@ #ifndef SOKULIB_SOUNDMANAGER_HPP #define SOKULIB_SOUNDMANAGER_HPP - +#include "HandleManager.hpp" +#include "dsound.h" namespace SokuLib { @@ -16,6 +17,33 @@ namespace SokuLib { ((void (*)(const char *))0x43ff10)(path); } + + class WaveBuffer{}; + class DSBuffer { + public: + IDirectSoundBuffer * pIDirectSoundBuffer = 0; + uint32_t sizeToLock = 0; + virtual void Initialize(LPWAVEFORMATEX waveformatex, DWORD bufSize); + virtual void Delete(bool free); + }; + class DS3DBuffer : public DSBuffer { + public: + IDirectSound3DBuffer * pIDirectSound3DBuffer; + void Initialize(LPWAVEFORMATEX waveformatex, DWORD bufSize); + void Delete(bool free); + }; + class SoundManager : public HandleManager { + public: + HandleManager DSBufferManager; + DSBuffer DSBuffers[32]; + DS3DBuffer DS3DBuffer[32]; + char unknown[8]; + float SEVolume; + float SEVolumeCoefficient; + bool SetVolumeByDSBufferManagerID(unsigned int id); + }; + extern int (__stdcall *const ConvertFloatVolumeToDSoundVolume)(float volume); + extern SoundManager &soundMgr; }