Skip to content

Commit 97306bc

Browse files
committed
Add SoundManager
1 parent 08d0086 commit 97306bc

File tree

3 files changed

+55
-1
lines changed

3 files changed

+55
-1
lines changed

src/SokuAddresses.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ namespace SokuLib
4545
ADDR_SWR_FONT_CREATE = 0x004116D0,
4646
ADDR_SWR_FONT_DESTRUCT = 0x00411760,
4747
ADDR_SWR_FONT_SET_INDIRECT = 0x00411840,
48+
ADDR_SWR_CONVERT_VOLUME_TO_DSOUND = 0x00418B30,
4849
ADDR_CNUMBER_RENDER = 0x00414940,
4950
ADDR_GET_PACKAGED_BGM_CALLER = 0x00418BE1,
5051
ADDR_GET_PACKAGED_SFL_CALLER = 0x00418F41,
@@ -140,6 +141,8 @@ namespace SokuLib
140141
ADDR_VTBL_CDESIGN_SPRITE = 0x008710E4,
141142
ADDR_VTBL_CDESIGN_GAUGE = 0x00871104,
142143
ADDR_VTBL_CDESIGN_NUMBER = 0x00871124,
144+
ADDR_VTBL_CDSBUFFER = 0x008713a8,
145+
ADDR_VTBL_CDS3DBUFFER = 0x00871384,
143146
ADDR_VTBL_BITMAPDATA = 0x00871474,
144147
ADDR_VTBL_PACKAGEREADER = 0x0087148C,
145148

@@ -167,6 +170,7 @@ namespace SokuLib
167170
ADDR_RCHARID = 0x00899D30,
168171
ADDR_INPUT_MANAGER_CLUSTER = 0x0089A248,
169172
ADDR_MENU_LIST = 0x0089A884,
173+
ADDR_SOUND_MANAGER = 0x0089F9F8,
170174
ADDR_TEXTURE_MANAGER = 0x0089FF08,
171175
ADDR_WINDOW_HWND = 0x0089FF90,
172176
ADDR_LOAD_GRAPHICS_THREAD = 0x0089FFF4,

src/SoundManager.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,26 @@ namespace SokuLib
99
{
1010
void (* const playSEWaveBuffer)(int id) = reinterpret_cast<void (*)(int id)>(ADDR_PLAY_SE_WAVE_BUFFER);
1111
void (* const playNetBell)(int id) = reinterpret_cast<void (*)(int id)>(ADDR_PLAY_NET_BELL);
12+
void DSBuffer::Initialize(LPWAVEFORMATEX waveformatex, DWORD bufSize) {
13+
(* ((void (__thiscall **)(DSBuffer* , LPWAVEFORMATEX, DWORD)) ADDR_VTBL_CDSBUFFER))(this, waveformatex, bufSize);
14+
}
15+
void DSBuffer::Delete(bool free) {
16+
(* ((void (__thiscall **)(DSBuffer* , bool free)) (ADDR_VTBL_CDSBUFFER + 4)))(this, free);
17+
}
18+
void DS3DBuffer::Initialize(LPWAVEFORMATEX waveformatex, DWORD bufSize) {
19+
(* ((void (__thiscall **)(DSBuffer* , LPWAVEFORMATEX, DWORD)) ADDR_VTBL_CDS3DBUFFER))(this, waveformatex, bufSize);
20+
}
21+
void DS3DBuffer::Delete(bool free) {
22+
(* ((void (__thiscall **)(DSBuffer* , bool free)) (ADDR_VTBL_CDS3DBUFFER + 4)))(this, free);
23+
}
24+
int (__stdcall *const ConvertFloatVolumeToDSoundVolume)(float volume) = (int (__stdcall *)(float)) ADDR_SWR_CONVERT_VOLUME_TO_DSOUND;
25+
bool SoundManager::SetVolumeByDSBufferManagerID(unsigned int id) {
26+
if (!id)
27+
return false;
28+
DSBuffer **buffer = this->DSBufferManager.Get(id);
29+
if (!buffer || !*buffer)
30+
return false;
31+
return (*buffer)->pIDirectSoundBuffer->SetVolume(ConvertFloatVolumeToDSoundVolume(this->SEVolume * this->SEVolumeCoefficient)) == DS_OK;
32+
}
33+
SoundManager &soundMgr = * (SoundManager *) ADDR_SOUND_MANAGER;
1234
}

src/SoundManager.hpp

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44

55
#ifndef SOKULIB_SOUNDMANAGER_HPP
66
#define SOKULIB_SOUNDMANAGER_HPP
7-
7+
#include "HandleManager.hpp"
8+
#include "dsound.h"
89

910
namespace SokuLib
1011
{
@@ -16,6 +17,33 @@ namespace SokuLib
1617
{
1718
((void (*)(const char *))0x43ff10)(path);
1819
}
20+
21+
class WaveBuffer{};
22+
class DSBuffer {
23+
public:
24+
IDirectSoundBuffer * pIDirectSoundBuffer = 0;
25+
uint32_t sizeToLock = 0;
26+
virtual void Initialize(LPWAVEFORMATEX waveformatex, DWORD bufSize);
27+
virtual void Delete(bool free);
28+
};
29+
class DS3DBuffer : public DSBuffer {
30+
public:
31+
IDirectSound3DBuffer * pIDirectSound3DBuffer;
32+
void Initialize(LPWAVEFORMATEX waveformatex, DWORD bufSize);
33+
void Delete(bool free);
34+
};
35+
class SoundManager : public HandleManager<class WaveBuffer *> {
36+
public:
37+
HandleManager<class DSBuffer *> DSBufferManager;
38+
DSBuffer DSBuffers[32];
39+
DS3DBuffer DS3DBuffer[32];
40+
char unknown[8];
41+
float SEVolume;
42+
float SEVolumeCoefficient;
43+
bool SetVolumeByDSBufferManagerID(unsigned int id);
44+
};
45+
extern int (__stdcall *const ConvertFloatVolumeToDSoundVolume)(float volume);
46+
extern SoundManager &soundMgr;
1947
}
2048

2149

0 commit comments

Comments
 (0)