4b0223b4b73701df6c1dbd628235837b0fc08692
[speexdsp.git] / libspeex / misc.c
1 /* Copyright (C) 2002-2005 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 <stdlib.h>
38 #include <string.h>
39 #include <stdio.h>
40 #include "misc.h"
41
42 #ifdef BFIN_ASM
43 #include "misc_bfin.h"
44 #endif
45
46 #ifndef RELEASE
47 void print_vec(float *vec, int len, char *name)
48 {
49    int i;
50    printf ("%s ", name);
51    for (i=0;i<len;i++)
52       printf (" %f", vec[i]);
53    printf ("\n");
54 }
55 #endif
56
57 #ifdef FIXED_DEBUG
58 long long spx_mips=0;
59 #endif
60
61
62 spx_uint32_t be_int(spx_uint32_t i)
63 {
64    spx_uint32_t ret=i;
65 #ifndef WORDS_BIGENDIAN
66    ret =  i>>24;
67    ret += (i>>8)&0x0000ff00;
68    ret += (i<<8)&0x00ff0000;
69    ret += (i<<24);
70 #endif
71    return ret;
72 }
73
74 spx_uint32_t le_int(spx_uint32_t i)
75 {
76    spx_uint32_t ret=i;
77 #ifdef WORDS_BIGENDIAN
78    ret =  i>>24;
79    ret += (i>>8)&0x0000ff00;
80    ret += (i<<8)&0x00ff0000;
81    ret += (i<<24);
82 #endif
83    return ret;
84 }
85
86 #if BYTES_PER_CHAR == 2
87 void speex_memcpy_bytes(char *dst, char *src, int nbytes)
88 {
89   int i;
90   int nchars = nbytes/BYTES_PER_CHAR;
91   for (i=0;i<nchars;i++)
92     dst[i]=src[i];
93   if (nbytes & 1) {
94     /* copy in the last byte */
95     int last_i = nchars;
96     char last_dst_char = dst[last_i];
97     char last_src_char = src[last_i];
98     last_dst_char &= 0xff00;
99     last_dst_char |= (last_src_char & 0x00ff);
100     dst[last_i] = last_dst_char;
101   }
102 }
103 void speex_memset_bytes(char *dst, char c, int nbytes)
104 {
105   int i;
106   spx_int16_t cc = ((c << 8) | c);
107   int nchars = nbytes/BYTES_PER_CHAR;
108   for (i=0;i<nchars;i++)
109     dst[i]=cc;
110   if (nbytes & 1) {
111     /* copy in the last byte */
112     int last_i = nchars;
113     char last_dst_char = dst[last_i];
114     last_dst_char &= 0xff00;
115     last_dst_char |= (c & 0x00ff);
116     dst[last_i] = last_dst_char;
117   }
118 }
119 #else
120 void speex_memcpy_bytes(char *dst, char *src, int nbytes)
121 {
122   memcpy(dst, src, nbytes);
123 }
124 void speex_memset_bytes(char *dst, char src, int nbytes)
125 {
126   memset(dst, src, nbytes);
127 }
128 #endif
129
130 void *speex_alloc (int size)
131 {
132    return calloc(size,1);
133 }
134 void *speex_alloc_scratch (int size)
135 {
136    return calloc(size,1);
137 }
138
139 void *speex_realloc (void *ptr, int size)
140 {
141    return realloc(ptr, size);
142 }
143
144 void speex_free (void *ptr)
145 {
146    free(ptr);
147 }
148 void speex_free_scratch (void *ptr)
149 {
150    free(ptr);
151 }
152
153 #ifndef OVERRIDE_SPEEX_MOVE
154 void *speex_move (void *dest, void *src, int n)
155 {
156    return memmove(dest,src,n);
157 }
158 #endif
159
160 void speex_error(const char *str)
161 {
162    fprintf (stderr, "Fatal error: %s\n", str);
163    exit(1);
164 }
165
166 void speex_warning(const char *str)
167 {
168    fprintf (stderr, "warning: %s\n", str);
169 }
170
171 void speex_warning_int(const char *str, int val)
172 {
173    fprintf (stderr, "warning: %s %d\n", str, val);
174 }
175
176 #ifdef FIXED_POINT
177 spx_word32_t speex_rand(spx_word16_t std, spx_int32_t *seed)
178 {
179    *seed = 1664525 * *seed + 1013904223;
180    return MULT16_16(EXTRACT16(SHR32(*seed,16)),std);
181 }
182 #else
183 spx_word16_t speex_rand(spx_word16_t std, spx_int32_t *seed)
184 {
185    const unsigned int jflone = 0x3f800000;
186    const unsigned int jflmsk = 0x007fffff;
187    union {int i; float f;} ran;
188    *seed = 1664525 * *seed + 1013904223;
189    ran.i = jflone | (jflmsk & *seed);
190    ran.f -= 1;
191    return 1.7321*std*ran.f;
192 }
193 #endif
194
195 void speex_rand_vec(float std, spx_sig_t *data, int len)
196 {
197    int i;
198    for (i=0;i<len;i++)
199       data[i]+=SIG_SCALING*3*std*((((float)rand())/RAND_MAX)-.5);
200 }
201
202
203 /*float speex_rand(float std)
204 {
205    return 3*std*((((float)rand())/RAND_MAX)-.5);
206 }*/
207
208 void _speex_putc(int ch, void *file)
209 {
210    FILE *f = (FILE *)file;
211    fprintf(f, "%c", ch);
212 }