mirror of
https://github.com/zeldaret/ss
synced 2026-07-09 22:21:32 -04:00
233 lines
7.4 KiB
C++
233 lines
7.4 KiB
C++
#ifndef NW4R_SND_SOUND_ARCHIVE_H
|
|
#define NW4R_SND_SOUND_ARCHIVE_H
|
|
|
|
/*******************************************************************************
|
|
* headers
|
|
*/
|
|
|
|
#include "common.h"
|
|
|
|
#include "nw4r/snd/snd_global.h"
|
|
|
|
/*******************************************************************************
|
|
* types
|
|
*/
|
|
|
|
// forward declarations
|
|
namespace nw4r { namespace snd { namespace detail { class SoundArchiveFileReader; }}}
|
|
|
|
namespace nw4r { namespace ut { class FileStream; }}
|
|
|
|
/*******************************************************************************
|
|
* classes and functions
|
|
*/
|
|
|
|
namespace nw4r { namespace snd
|
|
{
|
|
// [R89JEL]:/bin/RVL/Debug/mainD.elf:.debug::0x265b9
|
|
class SoundArchive
|
|
{
|
|
// enums
|
|
public:
|
|
// [R89JEL]:/bin/RVL/Debug/mainD.elf:.debug::0x26182
|
|
enum SoundType
|
|
{
|
|
SOUND_TYPE_INVALID,
|
|
|
|
SOUND_TYPE_SEQ,
|
|
SOUND_TYPE_STRM,
|
|
SOUND_TYPE_WAVE,
|
|
};
|
|
|
|
// nested types
|
|
public:
|
|
// [R89JEL]:/bin/RVL/Debug/mainD.elf:.debug::0x25c18
|
|
struct BankInfo
|
|
{
|
|
u32 fileId; // size 0x04, offset 0x00
|
|
}; // size 0x04
|
|
|
|
// [R89JEL]:/bin/RVL/Debug/mainD.elf:.debug::0x25ac7
|
|
struct FileInfo
|
|
{
|
|
u32 fileSize; // size 0x04, offset 0x00
|
|
u32 waveDataFileSize; // size 0x04, offset 0x04
|
|
char const *extFilePath; // size 0x04, offset 0x08
|
|
u32 filePosCount; // size 0x04, offset 0x0c
|
|
}; // size 0x10
|
|
|
|
// [R89JEL]:/bin/RVL/Debug/mainD.elf:.debug::0x25a5b
|
|
struct FilePos
|
|
{
|
|
u32 groupId; // size 0x04, offset 0x00
|
|
u32 index; // size 0x04, offset 0x04
|
|
}; // size 0x08
|
|
|
|
// [R89JEL]:/bin/RVL/Debug/mainD.elf:.debug::0x2593d
|
|
struct GroupInfo
|
|
{
|
|
u32 itemCount; // size 0x04, offset 0x00
|
|
char const *extFilePath; // size 0x04, offset 0x04
|
|
u32 offset; // size 0x04, offset 0x08
|
|
u32 size; // size 0x04, offset 0x0c
|
|
u32 waveDataOffset; // size 0x04, offset 0x10
|
|
u32 waveDataSize; // size 0x04, offset 0x14
|
|
}; // size 0x18
|
|
|
|
// [R89JEL]:/bin/RVL/Debug/mainD.elf:.debug::0x2584d
|
|
struct GroupItemInfo
|
|
{
|
|
u32 fileId; // size 0x04, offset 0x00
|
|
u32 offset; // size 0x04, offset 0x04
|
|
u32 size; // size 0x04, offset 0x08
|
|
u32 waveDataOffset; // size 0x04, offset 0x0c
|
|
u32 waveDataSize; // size 0x04, offset 0x10
|
|
}; // size 0x14
|
|
|
|
// [R89JEL]:/bin/RVL/Debug/mainD.elf:.debug::0x25b9b
|
|
struct PlayerInfo
|
|
{
|
|
int playableSoundCount; // size 0x04, offset 0x00
|
|
u32 heapSize; // size 0x04, offset 0x04
|
|
}; // size 0x08
|
|
|
|
// [R89JEL]:/bin/RVL/Debug/mainD.elf:.debug::0x25dc1
|
|
struct SeqSoundInfo
|
|
{
|
|
u32 dataOffset; // size 0x04, offset 0x00
|
|
u32 bankId; // size 0x04, offset 0x04
|
|
u32 allocTrack; // size 0x04, offset 0x08
|
|
int channelPriority; // size 0x04, offset 0x0c
|
|
bool releasePriorityFixFlag; // size 0x01, offset 0x10
|
|
/* 3 bytes padding */
|
|
}; // size 0x14
|
|
|
|
// [R89JEL]:/bin/RVL/Debug/mainD.elf:.debug::0x25d0f
|
|
struct StrmSoundInfo
|
|
{
|
|
u32 startPosition; // size 0x04, offset 0x00
|
|
u16 allocChannelCount; // size 0x02, offset 0x04
|
|
u16 allocTrackFlag; // size 0x02, offset 0x06
|
|
}; // size 0x08
|
|
|
|
// [R89JEL]:/bin/RVL/Debug/mainD.elf:.debug::0x25c5f
|
|
struct WaveSoundInfo
|
|
{
|
|
s32 subNo; // size 0x04, offset 0x00
|
|
int channelPriority; // size 0x04, offset 0x04
|
|
bool releasePriorityFixFlag; // size 0x01, offset 0x08
|
|
/* 3 bytes padding */
|
|
}; // size 0x0c
|
|
|
|
struct Sound3DParam {
|
|
u32 flags; // at 0x0
|
|
u8 decayCurve; // at 0x4
|
|
u8 decayRatio; // at 0x5
|
|
};
|
|
|
|
// [R89JEL]:/bin/RVL/Debug/mainD.elf:.debug::0x256dc
|
|
struct SoundArchivePlayerInfo
|
|
{
|
|
int seqSoundCount; // size 0x04, offset 0x00
|
|
int seqTrackCount; // size 0x04, offset 0x04
|
|
int strmSoundCount; // size 0x04, offset 0x08
|
|
int strmTrackCount; // size 0x04, offset 0x0c
|
|
int strmChannelCount; // size 0x04, offset 0x10
|
|
int waveSoundCount; // size 0x04, offset 0x14
|
|
int waveTrackCount; // size 0x04, offset 0x18
|
|
}; // size 0x1c
|
|
|
|
// [R89JEL]:/bin/RVL/Debug/mainD.elf:.debug::0x26012
|
|
struct SoundInfo
|
|
{
|
|
u32 fileId; // size 0x04, offset 0x00
|
|
u32 playerId; // size 0x04, offset 0x04
|
|
int actorPlayerId; // size 0x04, offset 0x08
|
|
int playerPriority; // size 0x04, offset 0x0c
|
|
int volume; // size 0x04, offset 0x10
|
|
int remoteFilter; // size 0x04, offset 0x14
|
|
PanMode panMode; // size 0x04, offset 0x18
|
|
PanCurve panCurve; // size 0x04, offset 0x1c
|
|
}; // size 0x20
|
|
|
|
// methods
|
|
public:
|
|
// cdtors
|
|
SoundArchive();
|
|
virtual ~SoundArchive();
|
|
|
|
// virtual function ordering
|
|
// vtable SoundArchive
|
|
virtual void const *detail_GetFileAddress(u32 fileId) const = 0;
|
|
virtual void const *detail_GetWaveDataFileAddress(u32 fileId) const = 0;
|
|
virtual int detail_GetRequiredStreamBufferSize() const = 0;
|
|
virtual ut::FileStream *OpenStream(void *buffer, int size, u32 begin,
|
|
u32 length) const = 0;
|
|
virtual ut::FileStream *OpenExtStream(void *buffer, int size,
|
|
char const *extFilePath,
|
|
u32 begin, u32 length) const = 0;
|
|
|
|
// methods
|
|
void Setup(detail::SoundArchiveFileReader *fileReader);
|
|
void Shutdown();
|
|
|
|
u32 GetPlayerCount() const;
|
|
u32 GetGroupCount() const;
|
|
bool IsAvailable() const;
|
|
SoundType GetSoundType(u32 soundId) const;
|
|
|
|
const char* GetSoundLabelString(u32 id) const;
|
|
u32 ConvertLabelStringToSoundId(char const *label) const;
|
|
u32 ConvertLabelStringToPlayerId(const char* pLabel) const;
|
|
u32 ConvertLabelStringToGroupId(const char* pLabel) const;
|
|
u32 ConvertLabelStringToBankId(const char* pLabel) const;
|
|
u32 GetSoundUserParam(u32 id) const;
|
|
|
|
bool ReadSoundInfo(u32 soundId, SoundInfo *info) const;
|
|
bool ReadSeqSoundInfo(u32 soundId, SeqSoundInfo *info) const;
|
|
bool detail_ReadStrmSoundInfo(u32 soundId, StrmSoundInfo *info) const;
|
|
bool detail_ReadWaveSoundInfo(u32 soundId, WaveSoundInfo *info) const;
|
|
|
|
bool ReadPlayerInfo(u32 playerId, PlayerInfo *info) const;
|
|
bool ReadSoundArchivePlayerInfo(SoundArchivePlayerInfo *info) const;
|
|
bool detail_ReadSound3DParam(u32 soundId, nw4r::snd::SoundArchive::Sound3DParam*) const;
|
|
|
|
bool ReadBankInfo(u32 bankId, BankInfo *info) const;
|
|
|
|
bool detail_ReadGroupInfo(u32 groupId, GroupInfo *info) const;
|
|
bool detail_ReadGroupItemInfo(u32 groupId, u32 index,
|
|
GroupItemInfo *info) const;
|
|
|
|
u32 detail_GetFileCount() const;
|
|
bool detail_ReadFileInfo(u32 fileId, FileInfo *info) const;
|
|
bool detail_ReadFilePos(u32 fileId, u32 index, FilePos *info) const;
|
|
|
|
ut::FileStream *detail_OpenFileStream(u32 fileId, void *buffer,
|
|
int size) const;
|
|
ut::FileStream* detail_OpenGroupStream(u32 id, void* pBuffer,
|
|
int bufferSize) const;
|
|
ut::FileStream* detail_OpenGroupWaveDataStream(u32 id, void* pBuffer,
|
|
int bufferSize) const;
|
|
|
|
void SetExternalFileRoot(const char* pExtFileRoot);
|
|
|
|
private:
|
|
ut::FileStream *OpenExtStreamImpl(void *buffer, int size,
|
|
char const *extFilePath, u32 begin,
|
|
u32 length) const;
|
|
|
|
// static members
|
|
public:
|
|
static int const FILE_PATH_MAX = 255;
|
|
static u32 const INVALID_ID = -1;
|
|
|
|
// members
|
|
private:
|
|
/* vtable */ // size 0x004, offset 0x000
|
|
detail::SoundArchiveFileReader *mFileReader; // size 0x004, offset 0x004
|
|
char mExtFileRoot[FILE_PATH_MAX + 1]; // size 0x100, offset 0x008
|
|
}; // size 0x108
|
|
}} // namespace nw4r::snd
|
|
|
|
#endif // NW4R_SND_SOUND_ARCHIVE_H
|