-
Notifications
You must be signed in to change notification settings - Fork 0
/
C815_SFX.C
140 lines (128 loc) · 2.55 KB
/
C815_SFX.C
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
#include <C815_STD.H>
#include "C815_SFX.H"
#include "C815_API.H"
extern
void
GAudio__DumpSound(
const
GAudio__SoundPCM_t *
const
gAudio__SoundPCM,
unsigned
gAudio__SoundPCM__Indx
)
{
char
name[80];
snprintf(
name,
sizeof(
name),
"DUMP\\SNDOBJ%02X.RAW",
gAudio__SoundPCM__Indx);
FILE * __attribute__((__cleanup__(GStdIO__Close)))
hndl__file =
fopen(
name, "wb");
if (!!
hndl__file)
fwrite__alt(
gAudio__SoundPCM->data,
gAudio__SoundPCM->size,
hndl__file);
return;
}
extern
void
GAudio__LoadSound(
GAudio__SoundPCM_t *
const
gAudio__SoundPCM,
FILE *
const
file__hndl
)
{
static
unsigned
gAudio__Sound__N = 0;
FREAD(
gAudio__SoundPCM->size, file__hndl);
gAudio__SoundPCM->data =
GAlloc(
gAudio__SoundPCM->size);
fread__alt(
gAudio__SoundPCM->data,
gAudio__SoundPCM->size, file__hndl);
#if \
GAUDIO__LOADSOUND__TRANSFORM
GAudio__SamplePCM_t *
__gAudio__Sound__data =
gAudio__SoundPCM->data;
const
GAudio__SamplePCM_t *
__gAudio__Sound__tail =
&__gAudio__Sound__data[
gAudio__SoundPCM->size]
#endif // ..
;
#if \
GAUDIO__LOADSOUND__TRANSFORM
while (
__gAudio__Sound__data
<
__gAudio__Sound__tail)
{
/*
0001067C xor bl, 80h ; Logical Exclusive OR
0001067F and ebx, 0FFh ; Logical AND
00010685 sar ebx, 1 ; Shift Arithmetic Right
*/
// Note: This is effectively the same adding 128, i.e. making the signed
// number unsigned (and zero level at 128). This is done as both of the
// supported sound cards operate on unsigned PCM samples.
*__gAudio__Sound__data ^= 0x80;
/* // Note: Not enabled -- practially a noop here.
*__gAudio__Sound__data &= 0xff; */
// Note: Simply attenuate by 3 dB. I do not know why the game does this.
*__gAudio__Sound__data++ >>= 1;
}
#endif // ..
if (!
gAudio__Sound__N)
{
const
size_t
gAudio__Sound__Size = 0x800;
GAudio__SamplePCM_t *
__gAudio__Sound__Data =
GAlloc(
gAudio__Sound__Size);
for (unsigned
n = 0,
N = gAudio__Sound__Size;
n < N;
++n)
__gAudio__Sound__Data[n] =
gAudio__SoundPCM->data[n %
gAudio__SoundPCM->size];
GAlloc__Free((void **)
&gAudio__SoundPCM->data);
gAudio__SoundPCM->data =
__gAudio__Sound__Data;
}
++gAudio__Sound__N;
return;
}
extern
void
GAudio__Free(
GAudio__SoundPCM_t *
const
gAudio__SoundPCM
)
{
GAlloc__Free((void **)
&gAudio__SoundPCM->data);
return;
}