Alex: Added the new sources for terminatorX 3.5
[terminatorX.git] / src / endian.c
1 /*
2     terminatorX - realtime audio scratching software
3     Copyright (C) 1999  Alexander K├Ânig
4  
5     This program is free software; you can redistribute it and/or modify
6     it under the terms of the GNU General Public License as published by
7     the Free Software Foundation; either version 2 of the License, or
8     (at your option) any later version.
9  
10     This program is distributed in the hope that it will be useful,
11     but WITHOUT ANY WARRANTY; without even the implied warranty of
12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13     GNU General Public License for more details.
14  
15     You should have received a copy of the GNU General Public License
16     along with this program; if not, write to the Free Software
17     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18  
19     File: endian.c
20  
21     Description: swap byte order for big endian systems/audiohardware.
22 */    
23
24
25 #if defined (BIG_ENDIAN_MACHINE) || defined(BIG_ENDIAN_AUDIO) || defined (TEST_ENDIAN)
26
27 #include "tX_types.h"
28
29 void swap16(int16_t * val)
30 {
31         int8_t temp;
32         int8_t *p;
33         
34         p=(int8_t *) val;
35         temp=*p;
36         *p=*++p;
37         *p=temp;
38 }
39
40 void swap32(int32_t * val)
41 {
42         /*
43                 This one is very inefficient but it wont be
44                 called from performace critical areas so
45                 who cares...
46        */
47         int8_t temp;
48         int8_t *p;
49         
50         p=(int8_t *) val;
51         temp=p[0];
52         p[0]=p[3];
53         p[3]=temp;
54         
55         temp=p[1];
56         p[1]=p[2];
57         p[2]=temp;
58 }
59
60 void swapbuffer(int16_t *buffer, int samples)
61 {
62         int i;
63         int8_t temp;
64         int8_t *p;
65         int16_t *val;
66         
67         val=buffer;
68
69         for (i=0; i<samples; i++)
70         {
71                 p=(int8_t *) val;               
72                 temp=*p;
73                 *p=*++p;
74                 *p=temp;                
75                 val++;
76         }
77 }
78
79
80 /* The following main() is just for testing */
81
82 #ifdef TEST_ENDIAN
83
84 #include <netinet/in.h>
85
86 int main(int argc, char **argv)
87 {
88         int16_t t16=0x1234;
89         int32_t t32=0x12345678;
90         
91         int16_t buffer[8]={0x1234, 0x5678, 0x9ABC, 0xDEF0, 10, 20, 30, 0};
92
93         int i;
94         
95         printf("16: %4x\n", (int) t16);
96         swap16(&t16);
97         printf("16: %4x\n", (int) t16);
98         swap16(&t16);
99         printf("16: %4x\n", (int) t16);
100         t16=htons(t16);
101         printf("16: %4x\n", (int) t16);
102         t16=htons(t16);
103         printf("16: %4x\n", (int) t16);
104
105         printf("32: %8x\n", (int) t32);
106         swap32(&t32);
107         printf("32: %8x\n", (int) t32);
108         swap32(&t32);
109         printf("32: %8x\n", (int) t32);
110         t32=htonl(t32);
111         printf("32: %8x\n", (int) t32);
112         t32=htonl(t32);
113         printf("32: %8x\n", (int) t32);
114         
115         printf("buf: ");
116         for (i=0; i<8; i++) printf("%4hx ", buffer[i]); 
117         swapbuffer(buffer, 8);
118         printf("\nbuf: ");      
119         for (i=0; i<8; i++) printf("%4hx ",  buffer[i]);
120         swapbuffer(buffer, 8);
121         printf("\nbuf: ");      
122         for (i=0; i<8; i++) printf("%4hx ", buffer[i]);
123         
124         puts("\nDone.\n");
125 }
126 #endif
127
128 #endif