2
* gwavefile.c: wave utilities
4
* Copyright (c) 2000, 2001 David A. Bartold, Richard Guenther
6
* This library is free software; you can redistribute it and/or
7
* modify it under the terms of the GNU Library General Public
8
* License as published by the Free Software Foundation; either
9
* version 2 of the License, or (at your option) any later version.
11
* This library is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14
* Library General Public License for more details.
16
* You should have received a copy of the GNU Library General Public
17
* License along with this library; if not, write to the
18
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19
* Boston, MA 02111-1307, USA.
24
#include "gwavefile.h"
28
g_wavefile_type_width (GWavefileType dtype)
32
case G_WAVEFILE_TYPE_F8: case G_WAVEFILE_TYPE_F8NI:
35
case G_WAVEFILE_TYPE_S32: case G_WAVEFILE_TYPE_U32: case G_WAVEFILE_TYPE_F4: case G_WAVEFILE_TYPE_F4NI:
38
case G_WAVEFILE_TYPE_S16: case G_WAVEFILE_TYPE_U16:
41
case G_WAVEFILE_TYPE_S8: case G_WAVEFILE_TYPE_U8:
52
g_wavefile_type_convert (guint32 n_channels,
54
GWavefileType out_type,
56
GWavefileType in_type,
70
frames = length * n_channels;
72
if (in_type == out_type)
76
width = g_wavefile_type_width (in_type);
77
memcpy (out, in, frames * width);
83
case G_WAVEFILE_TYPE_F8:
88
case G_WAVEFILE_TYPE_F4:
90
for (i = 0; i < frames; i++)
94
case G_WAVEFILE_TYPE_U32:
96
for (i = 0; i < frames; i++)
97
*f8++ = s32_to_double ((*u32++) ^ 0x80000000);
100
case G_WAVEFILE_TYPE_S32:
102
for (i = 0; i < frames; i++)
103
*f8++ = s32_to_double (*s32++);
106
case G_WAVEFILE_TYPE_U16:
108
for (i = 0; i < frames; i++)
109
*f8++ = s16_to_double ((*u16++) ^ 0x8000);
112
case G_WAVEFILE_TYPE_S16:
114
for (i = 0; i < frames; i++)
115
*f8++ = s16_to_double (*s16++);
118
case G_WAVEFILE_TYPE_U8:
120
for (i = 0; i < frames; i++)
121
*f8++ = s16_to_double (((*u8++) << 8) ^ 0x8000);
124
case G_WAVEFILE_TYPE_S8:
126
for (i = 0; i < frames; i++)
127
*f8++ = s16_to_double ((*s8++) << 8);
135
case G_WAVEFILE_TYPE_F4:
140
case G_WAVEFILE_TYPE_F8:
142
for (i = 0; i < frames; i++)
146
case G_WAVEFILE_TYPE_U32:
148
for (i = 0; i < frames; i++)
149
*f4++ = s32_to_double ((*u32++) ^ 0x80000000);
152
case G_WAVEFILE_TYPE_S32:
154
for (i = 0; i < frames; i++)
155
*f4++ = s32_to_double (*s32++);
158
case G_WAVEFILE_TYPE_U16:
160
for (i = 0; i < frames; i++)
161
*f4++ = s16_to_double ((*u16++) ^ 0x8000);
164
case G_WAVEFILE_TYPE_S16:
166
for (i = 0; i < frames; i++)
167
*f4++ = s16_to_double (*s16++);
170
case G_WAVEFILE_TYPE_U8:
172
for (i = 0; i < frames; i++)
173
*f4++ = s16_to_double (((*u8++) << 8) ^ 0x8000);
176
case G_WAVEFILE_TYPE_S8:
178
for (i = 0; i < frames; i++)
179
*f4++ = s16_to_double ((*s8++) << 8);
187
case G_WAVEFILE_TYPE_S32:
192
case G_WAVEFILE_TYPE_F8:
194
for (i = 0; i < frames; i++)
195
*s32++ = double_to_s32 (*f8++);
198
case G_WAVEFILE_TYPE_F4:
200
for (i = 0; i < frames; i++)
201
*s32++ = double_to_s32 (*f4++);
204
case G_WAVEFILE_TYPE_U32:
206
for (i = 0; i < frames; i++)
207
*s32++ = (*u32++) ^ 0x80000000;
210
case G_WAVEFILE_TYPE_S16:
212
for (i = 0; i < frames; i++)
213
*s32++ = (*u16++) << 16;
216
case G_WAVEFILE_TYPE_U16:
218
for (i = 0; i < frames; i++)
219
*s32++ = ((*u16++) << 16) ^ 0x80000000;
222
case G_WAVEFILE_TYPE_S8:
224
for (i = 0; i < frames; i++)
225
*s32++ = (*s8++) << 24;
228
case G_WAVEFILE_TYPE_U8:
230
for (i = 0; i < frames; i++)
231
*s32++ = ((*u8++) << 24) ^ 0x8000000;
239
case G_WAVEFILE_TYPE_U32:
240
u32 = (guint32*) out;
244
case G_WAVEFILE_TYPE_S32:
246
for (i = 0; i < frames; i++)
247
*u32++ = (*s32++) ^ 0x80000000;
251
g_wavefile_type_convert (n_channels, length, G_WAVEFILE_TYPE_S32, out, in_type, in);
252
g_wavefile_type_convert (n_channels, length, out_type, out, G_WAVEFILE_TYPE_S32, out);
256
case G_WAVEFILE_TYPE_S16:
261
case G_WAVEFILE_TYPE_F8:
263
for (i = 0; i < frames; i++)
264
*s16++ = double_to_s16 (*f8++);
267
case G_WAVEFILE_TYPE_F8NI: {
268
gint16 *s16temp = s16;
270
for (j=0; j<n_channels; j++) {
272
for (i=0; i<length; i++) {
273
*s16temp = double_to_s16(*f8++);
274
s16temp += n_channels;
281
case G_WAVEFILE_TYPE_F4:
283
for (i = 0; i < frames; i++)
284
*s16++ = double_to_s16 (*f4++);
287
case G_WAVEFILE_TYPE_F4NI: {
288
gint16 *s16temp = s16;
290
for (j=0; j<n_channels; j++) {
292
for (i=0; i<length; i++) {
293
*s16temp = double_to_s16(*f4++);
294
s16temp += n_channels;
301
case G_WAVEFILE_TYPE_S32:
303
for (i = 0; i < frames; i++)
304
*s16++ = (*s32++) >> 16;
307
case G_WAVEFILE_TYPE_U32:
309
for (i = 0; i < frames; i++)
310
*s16++ = ((*u32++) >> 16) ^ 0x8000;
313
case G_WAVEFILE_TYPE_U16:
315
for (i = 0; i < frames; i++)
316
*s16++ = (*u16++) ^ 0x8000;
319
case G_WAVEFILE_TYPE_S8:
321
for (i = 0; i < frames; i++)
322
*s16++ = (*s8++) << 8;
325
case G_WAVEFILE_TYPE_U8:
327
for (i = 0; i < frames; i++)
328
*s16++ = ((*u8++) << 8) ^ 0x8000;
336
case G_WAVEFILE_TYPE_U16:
337
u16 = (guint16*) out;
341
case G_WAVEFILE_TYPE_S16:
343
for (i = 0; i < frames; i++)
344
*u16++ = (*s16++) ^ 0x80000000;
348
g_wavefile_type_convert (n_channels, length, G_WAVEFILE_TYPE_S16, out, in_type, in);
349
g_wavefile_type_convert (n_channels, length, out_type, out, G_WAVEFILE_TYPE_S16, out);
353
case G_WAVEFILE_TYPE_S8:
358
case G_WAVEFILE_TYPE_F8:
360
for (i = 0; i < frames; i++)
361
*s8++ = double_to_s16 (*f8++) >> 8;
364
case G_WAVEFILE_TYPE_F4:
366
for (i = 0; i < frames; i++)
367
*s8++ = double_to_s16 (*f4++) >> 8;
370
case G_WAVEFILE_TYPE_S32:
372
for (i = 0; i < frames; i++)
373
*s8++ = (*s32++) >> 24;
376
case G_WAVEFILE_TYPE_U32:
378
for (i = 0; i < frames; i++)
379
*s8++ = ((*u32++) >> 24) ^ 0x80;
382
case G_WAVEFILE_TYPE_S16:
384
for (i = 0; i < frames; i++)
385
*s8++ = (*u16++) >> 8;
388
case G_WAVEFILE_TYPE_U16:
390
for (i = 0; i < frames; i++)
391
*s8++ = ((*u16++) >> 8) ^ 0x80;
394
case G_WAVEFILE_TYPE_U8:
396
for (i = 0; i < frames; i++)
397
*s8++ = (*u8++) ^ 0x80;
405
case G_WAVEFILE_TYPE_U8:
410
case G_WAVEFILE_TYPE_S8:
412
for (i = 0; i < frames; i++)
413
*u8++ = (*s8++) ^ 0x80000000;
417
g_wavefile_type_convert (n_channels, length, G_WAVEFILE_TYPE_S8, out, in_type, in);
418
g_wavefile_type_convert (n_channels, length, out_type, out, G_WAVEFILE_TYPE_S8, out);
429
g_wavefile_type_clear (guint32 n_channels,
439
frames = n_channels * length;
443
case G_WAVEFILE_TYPE_U32:
445
for (i = 0; i < frames; i++)
446
*s32++ = 0x80000000L;
449
case G_WAVEFILE_TYPE_U16:
451
for (i = 0; i < frames; i++)
455
case G_WAVEFILE_TYPE_U8:
457
for (i = 0; i < frames; i++)
462
memset (out, 0, g_wavefile_type_width (type) * frames);