Merged a modified version of Jamey Hicks' C55 patch, fixed a
[speexdsp.git] / libspeex / misc.c
1 /* Copyright (C) 2002 Jean-Marc Valin 
2    File: mics.c
3    Various utility routines for Speex
4
5    Redistribution and use in source and binary forms, with or without
6    modification, are permitted provided that the following conditions
7    are met:
8    
9    - Redistributions of source code must retain the above copyright
10    notice, this list of conditions and the following disclaimer.
11    
12    - Redistributions in binary form must reproduce the above copyright
13    notice, this list of conditions and the following disclaimer in the
14    documentation and/or other materials provided with the distribution.
15    
16    - Neither the name of the Xiph.org Foundation nor the names of its
17    contributors may be used to endorse or promote products derived from
18    this software without specific prior written permission.
19    
20    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21    ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23    A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR
24    CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25    EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
27    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
28    LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
29    NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
30    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 */
32
33 #ifdef HAVE_CONFIG_H
34 #include "config.h"
35 #endif
36
37 #include "misc.h"
38 #include <stdlib.h>
39 #include <string.h>
40 #include <stdio.h>
41
42 #ifndef RELEASE
43 void print_vec(float *vec, int len, char *name)
44 {
45    int i;
46    printf ("%s ", name);
47    for (i=0;i<len;i++)
48       printf (" %f", vec[i]);
49    printf ("\n");
50 }
51 #endif
52
53 #ifdef FIXED_DEBUG
54 long long spx_mips=0;
55 #endif
56
57
58 spx_uint32_t be_int(spx_uint32_t i)
59 {
60    spx_uint32_t ret=i;
61 #ifndef WORDS_BIGENDIAN
62    ret =  i>>24;
63    ret += (i>>8)&0x0000ff00;
64    ret += (i<<8)&0x00ff0000;
65    ret += (i<<24);
66 #endif
67    return ret;
68 }
69
70 spx_uint32_t le_int(spx_uint32_t i)
71 {
72    spx_uint32_t ret=i;
73 #ifdef WORDS_BIGENDIAN
74    ret =  i>>24;
75    ret += (i>>8)&0x0000ff00;
76    ret += (i<<8)&0x00ff0000;
77    ret += (i<<24);
78 #endif
79    return ret;
80 }
81
82 unsigned short be_short(unsigned short s)
83 {
84    unsigned short ret=s;
85 #ifndef WORDS_BIGENDIAN
86    ret =  s>>8;
87    ret += s<<8;
88 #endif
89    return ret;
90 }
91
92 unsigned short le_short(unsigned short s)
93 {
94    unsigned short ret=s;
95 #ifdef WORDS_BIGENDIAN
96    ret =  s>>8;
97    ret += s<<8;
98 #endif
99    return ret;
100 }
101
102 #if BYTES_PER_CHAR == 2
103 void speex_memcpy_bytes(char *dst, char *src, int nbytes)
104 {
105   int i;
106   int nchars = nbytes/BYTES_PER_CHAR;
107   for (i=0;i<nchars;i++)
108     dst[i]=src[i];
109   if (nbytes & 1) {
110     /* copy in the last byte */
111     int last_i = nchars;
112     char last_dst_char = dst[last_i];
113     char last_src_char = src[last_i];
114     last_dst_char &= 0xff00;
115     last_dst_char |= (last_src_char & 0x00ff);
116     dst[last_i] = last_dst_char;
117   }
118 }
119 void speex_memset_bytes(char *dst, char c, int nbytes)
120 {
121   int i;
122   short cc = ((c << 8) | c);
123   int nchars = nbytes/BYTES_PER_CHAR;
124   for (i=0;i<nchars;i++)
125     dst[i]=cc;
126   if (nbytes & 1) {
127     /* copy in the last byte */
128     int last_i = nchars;
129     char last_dst_char = dst[last_i];
130     last_dst_char &= 0xff00;
131     last_dst_char |= (c & 0x00ff);
132     dst[last_i] = last_dst_char;
133   }
134 }
135 #else
136 void speex_memcpy_bytes(char *dst, char *src, int nbytes)
137 {
138   memcpy(dst, src, nbytes);
139 }
140 void speex_memset_bytes(char *dst, char src, int nbytes)
141 {
142   memset(dst, src, nbytes);
143 }
144 #endif
145
146 void *speex_alloc (int size)
147 {
148    return calloc(size,1);
149 }
150
151 void *speex_realloc (void *ptr, int size)
152 {
153    return realloc(ptr, size);
154 }
155
156 void speex_free (void *ptr)
157 {
158    free(ptr);
159 }
160
161 void *speex_move (void *dest, void *src, int n)
162 {
163    return memmove(dest,src,n);
164 }
165
166 void speex_error(char *str)
167 {
168    fprintf (stderr, "Fatal error: %s\n", str);
169    exit(1);
170 }
171
172 void speex_warning(char *str)
173 {
174    fprintf (stderr, "warning: %s\n", str);
175 }
176
177 void speex_warning_int(char *str, int val)
178 {
179    fprintf (stderr, "warning: %s %d\n", str, val);
180 }
181
182 void speex_rand_vec(float std, spx_sig_t *data, int len)
183 {
184    int i;
185    for (i=0;i<len;i++)
186       data[i]+=SIG_SCALING*3*std*((((float)rand())/RAND_MAX)-.5);
187 }
188
189 float speex_rand(float std)
190 {
191    return 3*std*((((float)rand())/RAND_MAX)-.5);
192 }
193
194 void _speex_putc(int ch, void *file)
195 {
196    FILE *f = (FILE *)file;
197    fprintf(f, "%c", ch);
198 }