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
@@ -270,13 +270,17 @@ static void chan_remap(int32_t *buf, int
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
@@ -301,7 +305,7 @@ size_t wav_read_float32(pcmfile_t *sndf,
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
@@ -312,14 +316,14 @@ size_t wav_read_float32(pcmfile_t *sndf,
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
@@ -327,7 +331,7 @@ size_t wav_read_float32(pcmfile_t *sndf,
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
@@ -337,7 +341,7 @@ size_t wav_read_float32(pcmfile_t *sndf,
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