mirror of
https://github.com/zeldaret/ss
synced 2026-05-24 23:21:41 -04:00
198 lines
5.7 KiB
C++
198 lines
5.7 KiB
C++
#ifndef NW4R_SND_WAVE_FILE_H
|
|
#define NW4R_SND_WAVE_FILE_H
|
|
|
|
/*******************************************************************************
|
|
* headers
|
|
*/
|
|
|
|
#include "common.h"
|
|
|
|
#include "nw4r/snd/snd_Channel.h"
|
|
#include "nw4r/snd/snd_global.h" // SampleFormat
|
|
#include "nw4r/snd/snd_adpcm.h"
|
|
|
|
#include "nw4r/ut/ut_binaryFileFormat.h"
|
|
|
|
/*******************************************************************************
|
|
* types
|
|
*/
|
|
|
|
namespace nw4r { namespace snd { namespace detail
|
|
{
|
|
struct WaveFile
|
|
{
|
|
/* Header */
|
|
|
|
// [R89JEL]:/bin/RVL/Debug/mainD.elf:.debug::0x2b2ab1
|
|
struct FileHeader
|
|
{
|
|
ut::BinaryFileHeader fileHeader; // size 0x10, offset 0x00
|
|
u32 infoChunkOffset; // size 0x04, offset 0x10
|
|
u32 infoChunkSize; // size 0x04, offset 0x14
|
|
u32 dataChunkOffset; // size 0x04, offset 0x18
|
|
u32 dataChunkSize; // size 0x04, offset 0x1c
|
|
}; // size 0x20
|
|
|
|
/* InfoBlock */
|
|
|
|
// [R89JEL]:/bin/RVL/Debug/mainD.elf:.debug::0x2b2185
|
|
struct WaveInfo
|
|
{
|
|
u8 format; // size 0x01, offset 0x00
|
|
u8 loopFlag; // size 0x01, offset 0x01
|
|
u8 numChannels; // size 0x01, offset 0x02
|
|
u8 sampleRate24; // size 0x01, offset 0x03
|
|
u16 sampleRate; // size 0x02, offset 0x04
|
|
u8 dataLocationType; // size 0x01, offset 0x06
|
|
u8 padding;
|
|
u32 loopStart; // size 0x04, offset 0x08
|
|
u32 loopEnd; // size 0x04, offset 0x0c
|
|
u32 channelInfoTableOffset; // size 0x04, offset 0x10
|
|
u32 dataLocation; // size 0x04, offset 0x14
|
|
u32 reserved;
|
|
}; // size 0x1c
|
|
|
|
// [R89JEL]:/bin/RVL/Debug/mainD.elf:.debug::0x2b2c9d
|
|
struct WaveChannelInfo
|
|
{
|
|
u32 channelDataOffset; // size 0x04, offset 0x00
|
|
u32 adpcmOffset; // size 0x04, offset 0x04
|
|
u32 volumeFrontLeft; // size 0x04, offset 0x08
|
|
u32 volumeFrontRight; // size 0x04, offset 0x0c
|
|
u32 volumeRearLeft; // size 0x04, offset 0x10
|
|
u32 volumeRearRight; // size 0x04, offset 0x14
|
|
u32 reserved;
|
|
}; // size 0x1c
|
|
|
|
static u32 const SIGNATURE_INFO_BLOCK =
|
|
NW4R_FOUR_BYTE('I', 'N', 'F', 'O');
|
|
|
|
// [R89JEL]:/bin/RVL/Debug/mainD.elf:.debug::0x3087c5
|
|
struct InfoBlock
|
|
{
|
|
ut::BinaryBlockHeader blockHeader; // size 0x08, offset 0x00
|
|
WaveInfo waveInfo; // size 0x1c, offset 0x08
|
|
}; // size 0x24
|
|
|
|
/* Other */
|
|
|
|
// [R89JEL]:/bin/RVL/Debug/mainD.elf:.debug::0x308a10
|
|
struct AdpcmParamSet
|
|
{
|
|
AdpcmParam adpcmParam; // size 0x28, offset 0x00
|
|
AdpcmLoopParam adpcmLoopParam; // size 0x06, offset 0x28
|
|
}; // size 0x2e
|
|
|
|
/* WaveFile */
|
|
|
|
static u32 const SIGNATURE_FILE =
|
|
NW4R_FOUR_BYTE('R', 'W', 'A', 'V');
|
|
static int const FILE_VERSION; // does it even have one?
|
|
}; // "namespace" WaveFile
|
|
|
|
// [R89JEL]:/bin/RVL/Debug/mainD.elf:.debug::0x29336
|
|
struct ChannelParam
|
|
{
|
|
void *dataAddr; // size 0x04, offset 0x00
|
|
AdpcmParam adpcmParam; // size 0x28, offset 0x04
|
|
AdpcmLoopParam adpcmLoopParam; // size 0x06, offset 0x2c
|
|
/* 2 bytes padding */
|
|
}; // size 0x34
|
|
|
|
// [R89JEL]:/bin/RVL/Debug/mainD.elf:.debug::0x29401
|
|
struct WaveInfo
|
|
{
|
|
SampleFormat sampleFormat; // size 0x04, offset 0x00
|
|
bool loopFlag; // size 0x01, offset 0x04
|
|
/* 3 bytes padding */
|
|
int numChannels; // size 0x04, offset 0x08
|
|
int sampleRate; // size 0x04, offset 0x0c
|
|
u32 loopStart; // size 0x04, offset 0x10
|
|
u32 loopEnd; // size 0x04, offset 0x14
|
|
ChannelParam channelParam[Channel::CHANNEL_MAX]; // size 0x68, offset 0x18
|
|
}; // size 0x80
|
|
|
|
// [R89JEL]:/bin/RVL/Debug/mainD.elf:.debug::0x2e58c
|
|
struct WaveSoundInfo
|
|
{
|
|
f32 pitch; // size 0x04, offset 0x00
|
|
u8 pan; // size 0x01, offset 0x04
|
|
u8 surroundPan; // size 0x01, offset 0x05
|
|
u8 fxSendA; // size 0x01, offset 0x06
|
|
u8 fxSendB; // size 0x01, offset 0x07
|
|
u8 fxSendC; // size 0x01, offset 0x08
|
|
u8 mainSend; // size 0x01, offset 0x09
|
|
/* 2 bytes padding */
|
|
}; // size 0x0c
|
|
|
|
// [R89JEL]:/bin/RVL/Debug/mainD.elf:.debug::0x2e6c2
|
|
struct WaveSoundNoteInfo
|
|
{
|
|
s32 waveIndex; // size 0x04, offset 0x00
|
|
u8 attack; // size 0x01, offset 0x04
|
|
u8 hold; // size 0x01, offset 0x05
|
|
u8 decay; // size 0x01, offset 0x06
|
|
u8 sustain; // size 0x01, offset 0x07
|
|
u8 release; // size 0x01, offset 0x08
|
|
u8 originalKey; // size 0x01, offset 0x09
|
|
u8 pan; // size 0x01, offset 0x0a
|
|
u8 surroundPan; // size 0x01, offset 0x0b
|
|
u8 volume; // size 0x01, offset 0x0c
|
|
/* 3 bytes padding */
|
|
f32 pitch; // size 0x04, offset 0x10
|
|
}; // size 0x14
|
|
}}} // namespace nw4r::snd::detail
|
|
|
|
/*******************************************************************************
|
|
* classes and functions
|
|
*/
|
|
|
|
namespace nw4r { namespace snd { namespace detail
|
|
{
|
|
// [R89JEL]:/bin/RVL/Debug/mainD.elf:.debug::0x2b2e05
|
|
class WaveFileReader
|
|
{
|
|
// methods
|
|
public:
|
|
// cdtors
|
|
WaveFileReader(WaveFile::FileHeader const *waveFileHeader);
|
|
WaveFileReader(WaveFile::WaveInfo const *waveInfo);
|
|
|
|
// methods
|
|
bool ReadWaveInfo(WaveInfo *waveData) const
|
|
{
|
|
return ReadWaveInfo(waveData, nullptr);
|
|
}
|
|
|
|
bool ReadWaveInfo(WaveInfo *waveData,
|
|
void const *waveDataOffsetOrigin) const;
|
|
|
|
void const *GetWaveDataAddress(
|
|
WaveFile::WaveChannelInfo const *waveChannelInfo,
|
|
void const *waveDataOffsetOrigin) const;
|
|
|
|
static SampleFormat GetSampleFormatFromWaveFileFormat(u8 format);
|
|
|
|
// members
|
|
private:
|
|
WaveFile::WaveInfo const *mWaveInfo; // size 0x04, offset 0x00
|
|
}; // size 0x04
|
|
|
|
// [R89JEL]:/bin/RVL/Debug/mainD.elf:.debug::0x2954b
|
|
class WaveDataLocationCallback
|
|
{
|
|
// methods
|
|
public:
|
|
// virtual function ordering
|
|
// vtable WaveDataLocationCallback
|
|
virtual WaveInfo *at_0x08();
|
|
virtual void at_0x0c(WaveInfo const *);
|
|
|
|
// members
|
|
private:
|
|
/* vtable */ // size 0x04, offset 0x00
|
|
}; // size 0x04
|
|
}}} // namespace nw4r::snd::detail
|
|
|
|
#endif // NW4R_SND_WAVE_FILE_H
|