blob: ef51a225e40400ba30324be790574bc61e8fbe01 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
|
#ifndef NW4HBM_SND_STRM_FILE_H
#define NW4HBM_SND_STRM_FILE_H
#include <revolution/os.h>
#include <revolution/types.h>
#include <revolution/hbm.h>
#include "Util.h"
#include "snd_global.h"
#include "../ut/FileStream.h"
#include "../ut/binaryFileFormat.h"
namespace nw4hbm {
namespace snd {
namespace detail {
namespace StrmFile {
static const u32 SIGNATURE_FILE = 'RSTM';
static const u32 SIGNATURE_HEAD_BLOCK = 'HEAD';
static const int FILE_VERSION = NW4HBM_VERSION(1, 0);
typedef struct StrmDataInfo {
/* 0x00 */ u8 format;
/* 0x01 */ u8 loopFlag;
/* 0x02 */ u8 numChannels;
/* 0x03 */ u8 sampleRate24;
/* 0x04 */ u16 sampleRate;
/* 0x06 */ u16 blockHeaderOffset;
/* 0x08 */ u32 loopStart;
/* 0x0C */ u32 loopEnd;
/* 0x10 */ u32 dataOffset;
/* 0x14 */ u32 numBlocks;
/* 0x18 */ u32 blockSize;
/* 0x1C */ u32 blockSamples;
/* 0x20 */ u32 lastBlockSize;
/* 0x24 */ u32 lastBlockSamples;
/* 0x28 */ u32 lastBlockPaddedSize;
/* 0x2C */ u32 adpcmDataInterval;
/* 0x30 */ u32 adpcmDataSize;
} StrmDataInfo;
typedef struct TrackInfo {
/* 0x00 */ u8 channelCount;
/* 0x01 */ u8 channelIndexTable[];
} TrackInfo;
typedef struct TrackTable {
/* 0x00 */ u8 trackCount;
/* 0x01 */ u8 trackDataType;
/* 0x04 */ Util::DataRef<TrackInfo> refTrackHeader[];
} TrackTable;
typedef struct ChannelInfo {
/* 0x00 */ Util::DataRef<AdpcmInfo> refAdpcmInfo;
} ChannelInfo;
typedef struct ChannelTable {
/* 0x00 */ u8 channelCount;
/* 0x04 */ Util::DataRef<ChannelInfo> refChannelHeader[];
} ChannelTable;
typedef struct Header {
/* 0x00 */ ut::BinaryFileHeader fileHeader;
/* 0x10 */ u32 headBlockOffset;
/* 0x14 */ u32 headBlockSize;
/* 0x18 */ u32 adpcBlockOffset;
/* 0x1C */ u32 adpcBlockSize;
/* 0x20 */ u32 dataBlockOffset;
/* 0x24 */ u32 dataBlockSize;
} Header;
typedef struct HeadBlock {
/* 0x00 */ ut::BinaryBlockHeader blockHeader;
/* 0x08 */ Util::DataRef<StrmDataInfo> refDataHeader;
/* 0x10 */ Util::DataRef<TrackTable> refTrackTable;
/* 0x18 */ Util::DataRef<ChannelTable> refChannelTable;
} HeadBlock;
} // namespace StrmFile
typedef struct StrmInfo {
/* 0x00 */ u8 format;
/* 0x01 */ u8 loopFlag;
/* 0x02 */ u8 numChannels;
/* 0x04 */ int sampleRate;
/* 0x08 */ u16 blockHeaderOffset;
/* 0x0C */ u32 loopStart;
/* 0x10 */ u32 loopEnd;
/* 0x14 */ u32 dataOffset;
/* 0x18 */ u32 numBlocks;
/* 0x1C */ u32 blockSize;
/* 0x20 */ u32 blockSamples;
/* 0x24 */ u32 lastBlockSize;
/* 0x28 */ u32 lastBlockSamples;
/* 0x2C */ u32 lastBlockPaddedSize;
/* 0x30 */ u32 adpcmDataInterval;
/* 0x34 */ u32 adpcmDataSize;
} StrmInfo;
class StrmFileReader {
public:
StrmFileReader();
bool IsAvailable() const { return mHeader != NULL; }
bool IsValidFileHeader(const void* buffer);
void Setup(const void* buffer);
bool ReadStrmInfo(StrmInfo* strmInfo) const;
bool ReadAdpcmInfo(AdpcmInfo* adpcmInfo, int channels) const;
u32 GetAdpcBlockOffset() const {
if (IsAvailable()) {
return mHeader->adpcBlockOffset;
}
return 0;
}
private:
/* 0x00 */ const StrmFile::Header* mHeader;
/* 0x04 */ const StrmFile::HeadBlock* mHeadBlock;
};
class StrmFileLoader {
public:
explicit StrmFileLoader(ut::FileStream& rFileStream) : mStream(rFileStream) {}
bool LoadFileHeader(void* buffer, u32 size);
bool ReadAdpcBlockData(u16* yn1, u16* yn2, int block, int channels);
bool ReadStrmInfo(StrmInfo* strmInfo) const {
if (!mReader.IsAvailable()) {
return false;
}
return mReader.ReadStrmInfo(strmInfo);
}
bool ReadAdpcmInfo(AdpcmInfo* adpcmInfo, int channel) const {
if (!mReader.IsAvailable()) {
return false;
}
return mReader.ReadAdpcmInfo(adpcmInfo, channel);
}
private:
static const int HEADER_ALIGNED_SIZE = OSRoundUp32B(sizeof(StrmFile::Header));
/* 0x00 */ ut::FileStream& mStream;
/* 0x04 */ StrmFileReader mReader;
};
} // namespace detail
} // namespace snd
} // namespace nw4hbm
#endif
|