File faac-1.28-strict-aliasing-punning.patch of Package faac
69
1
Index: faac-1.28/frontend/input.c
2
===================================================================
3
--- faac-1.28.orig/frontend/input.c
4
+++ faac-1.28/frontend/input.c
5
6
size_t wav_read_float32(pcmfile_t *sndf, float *buf, size_t num, int *map)
7
{
8
size_t i = 0;
9
- unsigned char bufi[8];
10
+ union {
11
+ unsigned char c[8];
12
+ int i;
13
+ double d;
14
+ } bufi;
15
16
if ((sndf->samplebytes > 8) || (sndf->samplebytes < 1))
17
return 0;
18
19
while (i<num) {
20
- if (fread(bufi, sndf->samplebytes, 1, sndf->f) != 1)
21
+ if (fread(&bufi, sndf->samplebytes, 1, sndf->f) != 1)
22
break;
23
24
if (sndf->isfloat)
25
26
switch (sndf->samplebytes) {
27
case 1:
28
/* this is endian clean */
29
- buf[i] = ((float)bufi[0] - 128) * (float)256;
30
+ buf[i] = ((float)bufi.c[0] - 128) * (float)256;
31
break;
32
33
case 2:
34
35
#endif
36
{
37
// swap bytes
38
- int16_t s = ((int16_t *)bufi)[0];
39
+ int16_t s = ((int16_t *)&bufi)[0];
40
s = SWAP16(s);
41
buf[i] = (float)s;
42
}
43
else
44
{
45
// no swap
46
- int s = ((int16_t *)bufi)[0];
47
+ int s = ((int16_t *)&bufi)[0];
48
buf[i] = (float)s;
49
}
50
break;
51
52
case 3:
53
if (!sndf->bigendian)
54
{
55
- int s = bufi[0] | (bufi[1] << 8) | (bufi[2] << 16);
56
+ int s = bufi.c[0] | (bufi.c[1] << 8) | (bufi.c[2] << 16);
57
58
// fix sign
59
if (s & 0x800000)
60
61
}
62
else // big endian input
63
{
64
- int s = (bufi[0] << 16) | (bufi[1] << 8) | bufi[2];
65
+ int s = (bufi.c[0] << 16) | (bufi.c[1] << 8) | bufi.c[2];
66
67
// fix sign
68
if (s & 0x800000)
69