reword union data for better readability

This commit is contained in:
RadWolfie 2020-05-10 22:51:39 -05:00
parent 06af046c13
commit 0c5117dc06
2 changed files with 66 additions and 63 deletions

View File

@ -150,60 +150,63 @@ void Init(T& settings, bool is3D)
XTL::CDirectSoundVoice::CDirectSoundVoice(bool is3D)
{
u = { 0 };
settings = { 0 };
if (g_LibVersion_DSOUND < 4039) {
u.settings_4034_lower.p_audio_format = new XBOXADPCMWAVEFORMAT;
memset(&u.settings_4034_lower.p_audio_format->wfx, 0, sizeof(XBOXADPCMWAVEFORMAT));
settings.r4034_lower.p_audio_format = new XBOXADPCMWAVEFORMAT;
memset(&settings.r4034_lower.p_audio_format->wfx, 0, sizeof(XBOXADPCMWAVEFORMAT));
Init<_u::_settings_4034_lower>(u.settings_4034_lower, is3D);
using settings_template = _settings::_r4034_lower;
Init<settings_template>(settings.r4034_lower, is3D);
funcs.GetFormat = reinterpret_cast<pGetFormat>(::GetFormat_4034_lower<_u::_settings_4034_lower>);
funcs.SetFormat = reinterpret_cast<pSetFormat>(::SetFormat_4034_lower<_u::_settings_4034_lower>);
funcs.GetFrequencyDefault = reinterpret_cast<pGetUint32>(::GetFrequencyDefault_4034_lower<_u::_settings_4034_lower>);
funcs.GetPitch = reinterpret_cast<pGetInt32>(::GetPitch<_u::_settings_4034_lower>);
funcs.SetPitch = reinterpret_cast<pSetInt32>(::SetPitch<_u::_settings_4034_lower>);
funcs.GetVolume = reinterpret_cast<pGetInt32>(::GetVolume<_u::_settings_4034_lower>);
funcs.SetVolume = reinterpret_cast<pSetInt32>(::SetVolume<_u::_settings_4034_lower>);
funcs.GetHeadroom = reinterpret_cast<pGetUint32>(::GetHeadroom<_u::_settings_4034_lower>);
funcs.SetHeadroom = reinterpret_cast<pSetUint32>(::SetHeadroom<_u::_settings_4034_lower>);
funcs.GetFormat = reinterpret_cast<pGetFormat>(::GetFormat_4034_lower<settings_template>);
funcs.SetFormat = reinterpret_cast<pSetFormat>(::SetFormat_4034_lower<settings_template>);
funcs.GetFrequencyDefault = reinterpret_cast<pGetUint32>(::GetFrequencyDefault_4034_lower<settings_template>);
funcs.GetPitch = reinterpret_cast<pGetInt32>(::GetPitch<settings_template>);
funcs.SetPitch = reinterpret_cast<pSetInt32>(::SetPitch<settings_template>);
funcs.GetVolume = reinterpret_cast<pGetInt32>(::GetVolume<settings_template>);
funcs.SetVolume = reinterpret_cast<pSetInt32>(::SetVolume<settings_template>);
funcs.GetHeadroom = reinterpret_cast<pGetUint32>(::GetHeadroom<settings_template>);
funcs.SetHeadroom = reinterpret_cast<pSetUint32>(::SetHeadroom<settings_template>);
}
else if (g_LibVersion_DSOUND == 4039) {
Init<_u::_settings_4039_only>(u.settings_4039_only, is3D);
using settings_template = _settings::_r4039_only;
Init<settings_template>(settings.r4039_only, is3D);
funcs.GetFormat = reinterpret_cast<pGetFormat>(::GetFormat_4039_upper<_u::_settings_4039_only>);
funcs.SetFormat = reinterpret_cast<pSetFormat>(::SetFormat_4039_only<_u::_settings_4039_only>);
funcs.GetFrequencyDefault = reinterpret_cast<pGetUint32>(::GetFrequencyDefault_4039_upper<_u::_settings_4039_only>);
funcs.GetPitch = reinterpret_cast<pGetInt32>(::GetPitch<_u::_settings_4039_only>);
funcs.SetPitch = reinterpret_cast<pSetInt32>(::SetPitch<_u::_settings_4039_only>);
funcs.GetVolume = reinterpret_cast<pGetInt32>(::GetVolume<_u::_settings_4039_only>);
funcs.SetVolume = reinterpret_cast<pSetInt32>(::SetVolume<_u::_settings_4039_only>);
funcs.GetHeadroom = reinterpret_cast<pGetUint32>(::GetHeadroom<_u::_settings_4039_only>);
funcs.SetHeadroom = reinterpret_cast<pSetUint32>(::SetHeadroom<_u::_settings_4039_only>);
funcs.GetFormat = reinterpret_cast<pGetFormat>(::GetFormat_4039_upper<settings_template>);
funcs.SetFormat = reinterpret_cast<pSetFormat>(::SetFormat_4039_only<settings_template>);
funcs.GetFrequencyDefault = reinterpret_cast<pGetUint32>(::GetFrequencyDefault_4039_upper<settings_template>);
funcs.GetPitch = reinterpret_cast<pGetInt32>(::GetPitch<settings_template>);
funcs.SetPitch = reinterpret_cast<pSetInt32>(::SetPitch<settings_template>);
funcs.GetVolume = reinterpret_cast<pGetInt32>(::GetVolume<settings_template>);
funcs.SetVolume = reinterpret_cast<pSetInt32>(::SetVolume<settings_template>);
funcs.GetHeadroom = reinterpret_cast<pGetUint32>(::GetHeadroom<settings_template>);
funcs.SetHeadroom = reinterpret_cast<pSetUint32>(::SetHeadroom<settings_template>);
}
else {
Init<_u::_settings_4134_upper>(u.settings_4134_upper, is3D);
using settings_template = _settings::_r4134_upper;
Init<settings_template>(settings.r4134_upper, is3D);
funcs.GetFormat = reinterpret_cast<pGetFormat>(::GetFormat_4039_upper<_u::_settings_4134_upper>);
funcs.SetFormat = reinterpret_cast<pSetFormat>(::SetFormat_4134_upper<_u::_settings_4134_upper>);
funcs.GetFrequencyDefault = reinterpret_cast<pGetUint32>(::GetFrequencyDefault_4039_upper<_u::_settings_4134_upper>);
funcs.GetPitch = reinterpret_cast<pGetInt32>(::GetPitch<_u::_settings_4134_upper>);
funcs.SetPitch = reinterpret_cast<pSetInt32>(::SetPitch<_u::_settings_4134_upper>);
funcs.GetVolume = reinterpret_cast<pGetInt32>(::GetVolume<_u::_settings_4134_upper>);
funcs.SetVolume = reinterpret_cast<pSetInt32>(::SetVolume<_u::_settings_4134_upper>);
funcs.GetHeadroom = reinterpret_cast<pGetUint32>(::GetHeadroom<_u::_settings_4134_upper>);
funcs.SetHeadroom = reinterpret_cast<pSetUint32>(::SetHeadroom<_u::_settings_4134_upper>);
funcs.GetFormat = reinterpret_cast<pGetFormat>(::GetFormat_4039_upper<settings_template>);
funcs.SetFormat = reinterpret_cast<pSetFormat>(::SetFormat_4134_upper<settings_template>);
funcs.GetFrequencyDefault = reinterpret_cast<pGetUint32>(::GetFrequencyDefault_4039_upper<settings_template>);
funcs.GetPitch = reinterpret_cast<pGetInt32>(::GetPitch<settings_template>);
funcs.SetPitch = reinterpret_cast<pSetInt32>(::SetPitch<settings_template>);
funcs.GetVolume = reinterpret_cast<pGetInt32>(::GetVolume<settings_template>);
funcs.SetVolume = reinterpret_cast<pSetInt32>(::SetVolume<settings_template>);
funcs.GetHeadroom = reinterpret_cast<pGetUint32>(::GetHeadroom<settings_template>);
funcs.SetHeadroom = reinterpret_cast<pSetUint32>(::SetHeadroom<settings_template>);
}
}
XTL::CDirectSoundVoice::~CDirectSoundVoice()
{
if (g_LibVersion_DSOUND < 4039) {
if (!u.settings_4034_lower.p_audio_format) {
delete u.settings_4034_lower.p_audio_format;
u.settings_4034_lower.p_audio_format = nullptr;
if (!settings.r4034_lower.p_audio_format) {
delete settings.r4034_lower.p_audio_format;
settings.r4034_lower.p_audio_format = nullptr;
}
}
}

View File

@ -100,22 +100,22 @@ struct CDirectSoundVoice : CUnknownGenericManager {
virtual ~CDirectSoundVoice();
// CUnknownGenericManager // 0x00 - ???
union _u {
struct _settings_interface
union _settings {
struct _unknown
{
uint32_t unknown_08[0x300 / 4]; // 0x000 - 0x300 (unknown size, likely over 0x200 size.
} settings_interface;
} unknown;
struct _settings_4034_lower {
struct _r4034_lower {
xbaddr p_unknown_08; // 0x008
uint16_t unknown_0C; // 0x00C // zero'd - unknown
XBOXADPCMWAVEFORMAT* p_audio_format; // 0x010 // Same as XBOXADPCMWAVEFORMAT / WAVEFORMATEX structure
int32_t pitch; // 0x014 // Always init and custom pitch from SetFrequency, SetPitch, SetFormat, etc calls.
int32_t volume; // 0x018 // default: (set volume - headroom)
uint32_t headroom; // 0x01C // default: (set headroom then update volume)
} settings_4034_lower;
} r4034_lower;
struct _settings_4039_only {
struct _r4039_only {
uint32_t unknown_08; // 0x008
uint32_t audio_codec; // 0x00C // Setter is 32 bit, yet getter is 16 bit integer reader
uint32_t nChannels; // 0x010
@ -126,9 +126,9 @@ struct CDirectSoundVoice : CUnknownGenericManager {
int32_t volume; // 0x024 // (set volume - headroom)
uint32_t headroom; // 0x028 // (set headroom then update volume)
uint32_t unknown_2C[(0x300 - 0x2C) / 4]; // 0x02C - 0x300 (unknown size, likely over 0x200 size.
} settings_4039_only;
} r4039_only;
struct _settings_4134_upper {
struct _r4134_upper {
uint32_t unknown_08; // 0x008
uint16_t audio_codec; // 0x00C
uint8_t nChannels; // 0x00E
@ -139,17 +139,17 @@ struct CDirectSoundVoice : CUnknownGenericManager {
int32_t volume; // 0x01C // (set volume - headroom)
uint32_t headroom; // 0x020 // (set headroom then update volume)
uint32_t unknown_24[(0x300 - 0x24) / 4]; // 0x024 - 0x300 (unknown size, likely over 0x200 size.
} settings_4134_upper;
} u;
static_assert(sizeof(_u) == 0x300); // Not really require
} r4134_upper;
} settings;
static_assert(sizeof(_settings) == 0x300); // Not really require
// Generic interface without need to check xdk's build revision every time.
typedef void (*pGetFormat)(_u& u, audio_format& format);
typedef void (*pSetFormat)(_u& u, audio_format format);
typedef uint32_t (*pGetUint32)(_u& u);
typedef void (*pSetUint32)(_u& u, uint32_t value);
typedef int32_t (*pGetInt32)(_u& u);
typedef void (*pSetInt32)(_u& u, int32_t value);
typedef void (*pGetFormat)(_settings& settings, audio_format& format);
typedef void (*pSetFormat)(_settings& settings, audio_format format);
typedef uint32_t (*pGetUint32)(_settings& settings);
typedef void (*pSetUint32)(_settings& settings, uint32_t value);
typedef int32_t (*pGetInt32)(_settings& settings);
typedef void (*pSetInt32)(_settings& settings, int32_t value);
struct {
pGetFormat GetFormat;
pSetFormat SetFormat;
@ -164,35 +164,35 @@ struct CDirectSoundVoice : CUnknownGenericManager {
static_assert(sizeof(funcs) == 0x24); // Not really require
inline void GetFormat(audio_format& format) {
funcs.GetFormat(u, format);
funcs.GetFormat(settings, format);
};
inline void SetFormat(audio_format format) {
funcs.SetFormat(u, format);
funcs.SetFormat(settings, format);
};
inline uint32_t GetFrequencyDefault() {
return funcs.GetFrequencyDefault(u);
return funcs.GetFrequencyDefault(settings);
};
inline int32_t GetPitch() {
return funcs.GetPitch(u);
return funcs.GetPitch(settings);
};
inline void SetPitch(int32_t pitch) {
funcs.SetPitch(u, pitch);
funcs.SetPitch(settings, pitch);
};
inline int32_t GetVolume() {
return funcs.GetVolume(u);
return funcs.GetVolume(settings);
};
inline void SetVolume(int32_t volume) {
funcs.SetVolume(u, volume);
funcs.SetVolume(settings, volume);
};
inline uint32_t GetHeadroom() {
return funcs.GetHeadroom(u);
return funcs.GetHeadroom(settings);
};
inline void SetHeadroom(uint32_t headroom) {
funcs.SetHeadroom(u, headroom);
funcs.SetHeadroom(settings, headroom);
};
};
// Require to verify there is no other unknown additional data by compiler itself.
static_assert(sizeof(CDirectSoundVoice) == sizeof(CUnknownGenericManager) + sizeof(CDirectSoundVoice::_u) + sizeof(CDirectSoundVoice::funcs));
static_assert(sizeof(CDirectSoundVoice) == sizeof(CUnknownGenericManager) + sizeof(CDirectSoundVoice::_settings) + sizeof(CDirectSoundVoice::funcs));
struct DSBUFFER_S : CUnknownTemplate {