forked from soneek/3DSUSoundArchiveTool
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathWAR.h
124 lines (114 loc) · 3.84 KB
/
WAR.h
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
typedef struct {
int id;
u32 offset;
u32 fileId;
u16 sectionCount;
u32 infoOffset;
u32 infoLength;
u32 fileOffset;
u32 fileLength;
u32 wavCount;
vector<bwav> bWavs;
string name;
string warcfolder;
void processWarc(FILE * &csar) {
fseek(csar, files[fileId].fileOffset, SEEK_SET);
printf("Processing wave archive %d at %X\n", id, ftell(csar));
fseek(csar, 0x10, SEEK_CUR); // Skipping to pointers for INFO and FILE sections of wave archive
sectionCount = ReadLE(csar, 16);
fseek(csar, 2, SEEK_CUR);
for (j = 0; j < (int)sectionCount; j++) {
tempHeader = ReadLE(csar, 16);
fseek(csar, 2, SEEK_CUR);
if (tempHeader == 0x6800) {
// Found INFO pointer
infoOffset = ReadLE(csar, 32);
infoLength = ReadLE(csar, 32);
// printf("Found INFO pointer\n");
}
else if (tempHeader == 0x6801) {
// Found FILE pointer
fileOffset = ReadLE(csar, 32);
fileLength = ReadLE(csar, 32);
// printf("Found FILE pointer\n");
}
}
// Going to INFO table
fseek(csar, files[fileId].fileOffset + infoOffset + 8, SEEK_SET);
wavCount = ReadLE(csar, 32);
// printf("%d wavs in this archive\n", wavCount);
bWavs.resize((int)wavCount);
// Fetching b(c/f)wav offsets...
for (j = 0; j < int(wavCount); j++) {
fseek(csar, files[fileId].fileOffset + infoOffset + 12 + j * 12, SEEK_SET);
tempHeader = ReadLE(csar, 16);
fseek(csar, 2, SEEK_CUR);
if (tempHeader == 0x1f00) {
bWavs[j].offset = ReadLE(csar, 32); // Found string pointer
bWavs[j].size = ReadLE(csar, 32);
// Now to get b(c/f)wav info
fseek(csar, files[fileId].fileOffset + fileOffset + 8 + bWavs[j].offset, SEEK_SET);
typeHeader = ReadBE(csar, 32);
fseek(csar, 0xC, SEEK_CUR);
// printf("Wav %d out of %d - %X\n", j, wavCount, typeHeader);
if (typeHeader != 0x43574156)
continue;
else {
bWavs[j].sectionCount = ReadLE(csar, 16);
fseek(csar, 2, SEEK_CUR);
for (k = 0; k < (int)bWavs[j].sectionCount; k++) {
tempHeader = ReadLE(csar, 16);
fseek(csar, 2, SEEK_CUR);
if (tempHeader == 0x7000) {
// Found INFO pointer
bWavs[j].infoOffset = ReadLE(csar, 32);
bWavs[j].infoLength = ReadLE(csar, 32);
}
else if (tempHeader == 0x7001) {
// Found FILE pointer
bWavs[j].dataOffset = ReadLE(csar, 32);
bWavs[j].dataLength = ReadLE(csar, 32);
}
}
fseek(csar, files[fileId].fileOffset + fileOffset + 8 + bWavs[j].offset + bWavs[j].infoOffset + 8, SEEK_SET);
bWavs[j].type = ReadLE(csar, 8);
bWavs[j].loopFlag = ReadLE(csar, 8);
fseek(csar, 2, SEEK_CUR);
bWavs[j].sampleRate = ReadLE(csar, 32);
// printf("sample rate = %d\n", bWavs[j].sampleRate);
bWavs[j].loopStart = ReadLE(csar, 32);
bWavs[j].loopEnd = ReadLE(csar, 32);
fseek(csar, 4, SEEK_CUR);
bWavs[j].channels = ReadLE(csar, 32);
}
}
else {
fseek(csar, 8, SEEK_CUR);
}
}
#if defined(_WIN32)
_mkdir(warcfolder.c_str());
#else
mkdir(warcfolder.c_str(), 0777); // notice that 777 is different than 0777
#endif
files[fileId].fileName = name + "." + files[fileId].type;
/*
fseek(csar, files[fileId].fileOffset, SEEK_SET);
ofstream tempFile(warcfolder + files[fileId].fileName, ofstream::binary);
buffer = (char*) malloc((int)files[fileId].size + 1);
fread(buffer, 1, (int)files[fileId].size, sar);
tempFile.write(buffer, (int)files[fileId].size);
tempFile.close();
*/
// Exporting b(c/f)wavs
for (j = 0; j < wavCount; j++) {
fseek(csar, files[fileId].fileOffset + fileOffset + 8 + bWavs[j].offset, SEEK_SET);
ofstream tempFile(warcfolder + name + "_" + to_string(j) + ".bcwav", ofstream::binary);
buffer = (char*) malloc((int)bWavs[j].size + 1);
fread(buffer, 1, (int)bWavs[j].size, csar);
tempFile.write(buffer, (int)bWavs[j].size);
tempFile.close();
}
}
} warc;
vector<warc> warcs;