Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
MorsGames
GitHub Repository: MorsGames/sm64plus
Path: blob/master/tools/sdk-tools/adpcm/quant.c
7861 views
1
#include "vadpcm.h"
2
3
/**
4
* Compute x / scale rounded to the nearest integer, with x.5 (fuzzy with an
5
* epsilon of 1e-7) rounding towards zero.
6
*/
7
s16 qsample(f32 x, s32 scale)
8
{
9
if (x > 0.0f)
10
{
11
return (s16) ((x / scale) + 0.4999999);
12
}
13
else
14
{
15
return (s16) ((x / scale) - 0.4999999);
16
}
17
}
18
19
/**
20
* Round all ('fs' many) values in 'e' to the nearest 'bits'-bit integer,
21
* outputting to 'ie'.
22
*/
23
void clamp(s32 fs, f32 *e, s32 *ie, s32 bits)
24
{
25
s32 i;
26
f32 ulevel;
27
f32 llevel;
28
29
llevel = -(f32) (1 << (bits - 1));
30
ulevel = -llevel - 1.0f;
31
for (i = 0; i < fs; i++)
32
{
33
if (e[i] > ulevel)
34
{
35
e[i] = ulevel;
36
}
37
if (e[i] < llevel)
38
{
39
e[i] = llevel;
40
}
41
42
if (e[i] > 0.0f)
43
{
44
ie[i] = (s32) (e[i] + 0.5);
45
}
46
else
47
{
48
ie[i] = (s32) (e[i] - 0.5);
49
}
50
}
51
}
52
53
/**
54
* Clamp ix to within [llevel, ulevel].
55
*/
56
s32 clip(s32 ix, s32 llevel, s32 ulevel)
57
{
58
if (ix < llevel || ix > ulevel)
59
{
60
if (ix < llevel)
61
{
62
return llevel;
63
}
64
if (ix > ulevel)
65
{
66
return ulevel;
67
}
68
}
69
return ix;
70
}
71
72