c7ce7a87b71f59bbf18c10239cf584384e8e1bb2
[speexdsp.git] / libspeex / misc.c
1 /* Copyright (C) 2002-2005 Jean-Marc Valin 
2    File: misc.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 USER_MISC
43 #include "user_misc.h"
44 #endif
45
46 #ifdef BFIN_ASM
47 #include "misc_bfin.h"
48 #endif
49
50 #ifndef RELEASE
51 void print_vec(float *vec, int len, char *name)
52 {
53    int i;
54    printf ("%s ", name);
55    for (i=0;i<len;i++)
56       printf (" %f", vec[i]);
57    printf ("\n");
58 }
59 #endif
60
61 #ifdef FIXED_DEBUG
62 long long spx_mips=0;
63 #endif
64
65
66 spx_uint32_t be_int(spx_uint32_t i)
67 {
68    spx_uint32_t ret=i;
69 #ifndef WORDS_BIGENDIAN
70    ret =  i>>24;
71    ret += (i>>8)&0x0000ff00;
72    ret += (i<<8)&0x00ff0000;
73    ret += (i<<24);
74 #endif
75    return ret;
76 }
77
78 spx_uint32_t le_int(spx_uint32_t i)
79 {
80    spx_uint32_t ret=i;
81 #ifdef WORDS_BIGENDIAN
82    ret =  i>>24;
83    ret += (i>>8)&0x0000ff00;
84    ret += (i<<8)&0x00ff0000;
85    ret += (i<<24);
86 #endif
87    return ret;
88 }
89
90 #ifndef OVERRIDE_SPEEX_ALLOC
91 void *speex_alloc (int size)
92 {
93    return calloc(size,1);
94 }
95 #endif
96
97 #ifndef OVERRIDE_SPEEX_ALLOC_SCRATCH
98 void *speex_alloc_scratch (int size)
99 {
100    return calloc(size,1);
101 }
102 #endif
103
104 #ifndef OVERRIDE_SPEEX_REALLOC
105 void *speex_realloc (void *ptr, int size)
106 {
107    return realloc(ptr, size);
108 }
109 #endif
110
111 #ifndef OVERRIDE_SPEEX_FREE
112 void speex_free (void *ptr)
113 {
114    free(ptr);
115 }
116 #endif
117
118 #ifndef OVERRIDE_SPEEX_FREE_SCRATCH
119 void speex_free_scratch (void *ptr)
120 {
121    free(ptr);
122 }
123 #endif
124
125 #ifndef OVERRIDE_SPEEX_MOVE
126 void *speex_move (void *dest, void *src, int n)
127 {
128    return memmove(dest,src,n);
129 }
130 #endif
131
132 #ifndef OVERRIDE_SPEEX_ERROR
133 void speex_error(const char *str)
134 {
135    fprintf (stderr, "Fatal (internal) error: %s\n", str);
136    exit(1);
137 }
138 #endif
139
140 #ifndef OVERRIDE_SPEEX_WARNING
141 void speex_warning(const char *str)
142 {
143 #ifndef DISABLE_WARNINGS
144    fprintf (stderr, "warning: %s\n", str);
145 #endif
146 }
147 #endif
148
149 #ifndef OVERRIDE_SPEEX_WARNING_INT
150 void speex_warning_int(const char *str, int val)
151 {
152 #ifndef DISABLE_WARNINGS
153    fprintf (stderr, "warning: %s %d\n", str, val);
154 #endif
155 }
156 #endif
157
158 #ifndef OVERRIDE_SPEEX_NOTIFY
159 void speex_notify(const char *str)
160 {
161 #ifndef DISABLE_NOTIFICATIONS
162    fprintf (stderr, "notification: %s\n", str);
163 #endif
164 }
165 #endif
166
167 #ifdef FIXED_POINT
168 spx_word16_t speex_rand(spx_word16_t std, spx_int32_t *seed)
169 {
170    spx_word32_t res;
171    *seed = 1664525 * *seed + 1013904223;
172    res = MULT16_16(EXTRACT16(SHR32(*seed,16)),std);
173    return EXTRACT16(PSHR32(SUB32(res, SHR32(res, 3)),14));
174 }
175 #else
176 spx_word16_t speex_rand(spx_word16_t std, spx_int32_t *seed)
177 {
178    const unsigned int jflone = 0x3f800000;
179    const unsigned int jflmsk = 0x007fffff;
180    union {int i; float f;} ran;
181    *seed = 1664525 * *seed + 1013904223;
182    ran.i = jflone | (jflmsk & *seed);
183    ran.f -= 1.5;
184    return 3.4642*std*ran.f;
185 }
186 #endif
187
188 #ifndef OVERRIDE_SPEEX_PUTC
189 void _speex_putc(int ch, void *file)
190 {
191    FILE *f = (FILE *)file;
192    fprintf(f, "%c", ch);
193 }
194 #endif