annotate decoders/shn.c @ 387:fb519e6028e3

Changed all the Sound_SetError() calls to __Sound_SetError (or BAIL*_MACRO)
author Ryan C. Gordon <icculus@icculus.org>
date Fri, 05 Jul 2002 23:11:51 +0000
parents cbb15ecf423a
children c42ac9ee2ce4
rev   line source
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1 /*
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
2 * SDL_sound -- An abstract sound format decoding API.
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
3 * Copyright (C) 2001 Ryan C. Gordon.
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
4 *
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
5 * This library is free software; you can redistribute it and/or
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
6 * modify it under the terms of the GNU Lesser General Public
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
7 * License as published by the Free Software Foundation; either
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
8 * version 2.1 of the License, or (at your option) any later version.
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
9 *
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
10 * This library is distributed in the hope that it will be useful,
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
13 * Lesser General Public License for more details.
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
14 *
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
15 * You should have received a copy of the GNU Lesser General Public
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
16 * License along with this library; if not, write to the Free Software
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
18 */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
19
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
20 /*
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
21 * Shorten decoder for SDL_sound.
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
22 *
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
23 * This driver handles Shorten-compressed waveforms. Despite the fact that
161
0f958979b1dd Updated my intro comments.
Ryan C. Gordon <icculus@icculus.org>
parents: 149
diff changeset
24 * SHNs tend to be much bigger than MP3s, they are still the de facto
0f958979b1dd Updated my intro comments.
Ryan C. Gordon <icculus@icculus.org>
parents: 149
diff changeset
25 * standard in online music trading communities. If an MP3 crunches the
0f958979b1dd Updated my intro comments.
Ryan C. Gordon <icculus@icculus.org>
parents: 149
diff changeset
26 * waveform to 10-20 percent of its original size, SHNs only go to about
0f958979b1dd Updated my intro comments.
Ryan C. Gordon <icculus@icculus.org>
parents: 149
diff changeset
27 * 50-60%. Why do the Phish fans of the world use this format then? Rabid
0f958979b1dd Updated my intro comments.
Ryan C. Gordon <icculus@icculus.org>
parents: 149
diff changeset
28 * music traders appreciate the sound quality; SHNs, unlike MP3s, do not
0f958979b1dd Updated my intro comments.
Ryan C. Gordon <icculus@icculus.org>
parents: 149
diff changeset
29 * throw away any part of the waveform. Yes, there are people that notice
0f958979b1dd Updated my intro comments.
Ryan C. Gordon <icculus@icculus.org>
parents: 149
diff changeset
30 * this, and further more, they demand it...and if they can't get a good
0f958979b1dd Updated my intro comments.
Ryan C. Gordon <icculus@icculus.org>
parents: 149
diff changeset
31 * transfer of those larger files over the 'net, they haven't underestimated
0f958979b1dd Updated my intro comments.
Ryan C. Gordon <icculus@icculus.org>
parents: 149
diff changeset
32 * the bandwidth of CDs travelling the world through the postal system.
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
33 *
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
34 * Shorten homepage: http://www.softsound.com/Shorten.html
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
35 *
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
36 * The Shorten format was gleaned from the shorten codebase, by Tony
101
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
37 * Robinson and SoftSound Limited.
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
38 *
184
47cc2de2ae36 Changed reference to "LICENSE" file to "COPYING".
Ryan C. Gordon <icculus@icculus.org>
parents: 161
diff changeset
39 * Please see the file COPYING in the source's root directory.
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
40 *
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
41 * This file written by Ryan C. Gordon. (icculus@clutteredmind.org)
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
42 */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
43
106
40de367eb59e Changing my include structure to do this right.
Ryan C. Gordon <icculus@icculus.org>
parents: 104
diff changeset
44 #if HAVE_CONFIG_H
40de367eb59e Changing my include structure to do this right.
Ryan C. Gordon <icculus@icculus.org>
parents: 104
diff changeset
45 # include <config.h>
40de367eb59e Changing my include structure to do this right.
Ryan C. Gordon <icculus@icculus.org>
parents: 104
diff changeset
46 #endif
100
6d9fdec2f708 added config.h, added --enable-debug flag, various other changes to the build system
fingolfin
parents: 86
diff changeset
47
114
dd95a12539fd Changed an #if defined to #ifdef, for consistency with the other
Ryan C. Gordon <icculus@icculus.org>
parents: 106
diff changeset
48 #ifdef SOUND_SUPPORTS_SHN
104
103cfcb3c014 Updated to fix build system problem.
Ryan C. Gordon <icculus@icculus.org>
parents: 101
diff changeset
49
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
50 #include <stdio.h>
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
51 #include <stdlib.h>
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
52 #include <string.h>
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
53
106
40de367eb59e Changing my include structure to do this right.
Ryan C. Gordon <icculus@icculus.org>
parents: 104
diff changeset
54 #include "SDL_sound.h"
40de367eb59e Changing my include structure to do this right.
Ryan C. Gordon <icculus@icculus.org>
parents: 104
diff changeset
55
40de367eb59e Changing my include structure to do this right.
Ryan C. Gordon <icculus@icculus.org>
parents: 104
diff changeset
56 #define __SDL_SOUND_INTERNAL__
40de367eb59e Changing my include structure to do this right.
Ryan C. Gordon <icculus@icculus.org>
parents: 104
diff changeset
57 #include "SDL_sound_internal.h"
40de367eb59e Changing my include structure to do this right.
Ryan C. Gordon <icculus@icculus.org>
parents: 104
diff changeset
58
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
59 static int SHN_init(void);
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
60 static void SHN_quit(void);
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
61 static int SHN_open(Sound_Sample *sample, const char *ext);
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
62 static void SHN_close(Sound_Sample *sample);
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
63 static Uint32 SHN_read(Sound_Sample *sample);
221
c9772a9f5271 Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents: 212
diff changeset
64 static int SHN_rewind(Sound_Sample *sample);
306
c97be6e1bd27 Added framework for Sound_Seek() support.
Ryan C. Gordon <icculus@icculus.org>
parents: 301
diff changeset
65 static int SHN_seek(Sound_Sample *sample, Uint32 ms);
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
66
149
1df5c106504e Decoders can now list multiple file extensions.
Ryan C. Gordon <icculus@icculus.org>
parents: 126
diff changeset
67 static const char *extensions_shn[] = { "SHN", NULL };
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
68 const Sound_DecoderFunctions __Sound_DecoderFunctions_SHN =
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
69 {
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
70 {
149
1df5c106504e Decoders can now list multiple file extensions.
Ryan C. Gordon <icculus@icculus.org>
parents: 126
diff changeset
71 extensions_shn,
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
72 "Shorten-compressed audio data",
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
73 "Ryan C. Gordon <icculus@clutteredmind.org>",
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
74 "http://www.icculus.org/SDL_sound/"
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
75 },
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
76
221
c9772a9f5271 Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents: 212
diff changeset
77 SHN_init, /* init() method */
c9772a9f5271 Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents: 212
diff changeset
78 SHN_quit, /* quit() method */
c9772a9f5271 Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents: 212
diff changeset
79 SHN_open, /* open() method */
c9772a9f5271 Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents: 212
diff changeset
80 SHN_close, /* close() method */
c9772a9f5271 Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents: 212
diff changeset
81 SHN_read, /* read() method */
306
c97be6e1bd27 Added framework for Sound_Seek() support.
Ryan C. Gordon <icculus@icculus.org>
parents: 301
diff changeset
82 SHN_rewind, /* rewind() method */
c97be6e1bd27 Added framework for Sound_Seek() support.
Ryan C. Gordon <icculus@icculus.org>
parents: 301
diff changeset
83 SHN_seek /* seek() method */
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
84 };
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
85
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
86
101
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
87 #define SHN_BUFSIZ 512
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
88
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
89 typedef struct
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
90 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
91 Sint32 version;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
92 Sint32 datatype;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
93 Sint32 nchan;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
94 Sint32 blocksize;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
95 Sint32 maxnlpc;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
96 Sint32 nmean;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
97 Sint32 nwrap;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
98 Sint32 **buffer;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
99 Sint32 **offset;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
100 Sint32 *qlpc;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
101 Sint32 lpcqoffset;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
102 Sint32 bitshift;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
103 int nbitget;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
104 int nbyteget;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
105 Uint8 *getbuf;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
106 Uint8 *getbufp;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
107 Uint32 gbuffer;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
108 Uint8 *backBuffer;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
109 Uint32 backBufferSize;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
110 Uint32 backBufLeft;
233
15a3b1a1291c Kludged implementation of the rewind method.
Ryan C. Gordon <icculus@icculus.org>
parents: 221
diff changeset
111 Uint32 start_pos;
101
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
112 } shn_t;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
113
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
114
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
115 static const Uint32 mask_table[] =
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
116 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
117 0x00000000, 0x00000001, 0x00000003, 0x00000007, 0x0000000F, 0x0000001F,
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
118 0x0000003F, 0x0000007F, 0x000000FF, 0x000001FF, 0x000003FF, 0x000007FF,
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
119 0x00000FFF, 0x00001FFF, 0x00003FFF, 0x00007FFF, 0x0000FFFF, 0x0001FFFF,
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
120 0x0003FFFF, 0x0007FFFF, 0x000FFFFF, 0x001FFFFF, 0x003FFFFF, 0x007FFFFF,
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
121 0x00FFFFFF, 0x01FFFFFF, 0x03FFFFFF, 0x07FFFFFF, 0x0FFFFFFF, 0x1FFFFFFF,
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
122 0x3FFFFFFF, 0x7FFFFFFF, 0xFFFFFFFF
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
123 };
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
124
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
125
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
126 static const Uint8 ulaw_outward[13][256] = {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
127 {127,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,255,254,253,252,251,250,249,248,247,246,245,244,243,242,241,240,239,238,237,236,235,234,233,232,231,230,229,228,227,226,225,224,223,222,221,220,219,218,217,216,215,214,213,212,211,210,209,208,207,206,205,204,203,202,201,200,199,198,197,196,195,194,193,192,191,190,189,188,187,186,185,184,183,182,181,180,179,178,177,176,175,174,173,172,171,170,169,168,167,166,165,164,163,162,161,160,159,158,157,156,155,154,153,152,151,150,149,148,147,146,145,144,143,142,141,140,139,138,137,136,135,134,133,132,131,130,129,128},
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
128 {112,114,116,118,120,122,124,126,127,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,113,115,117,119,121,123,125,255,253,251,249,247,245,243,241,239,238,237,236,235,234,233,232,231,230,229,228,227,226,225,224,223,222,221,220,219,218,217,216,215,214,213,212,211,210,209,208,207,206,205,204,203,202,201,200,199,198,197,196,195,194,193,192,191,190,189,188,187,186,185,184,183,182,181,180,179,178,177,176,175,174,173,172,171,170,169,168,167,166,165,164,163,162,161,160,159,158,157,156,155,154,153,152,151,150,149,148,147,146,145,144,143,142,141,140,139,138,137,136,135,134,133,132,131,130,129,128,254,252,250,248,246,244,242,240},
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
129 {96,98,100,102,104,106,108,110,112,113,114,116,117,118,120,121,122,124,125,126,127,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,97,99,101,103,105,107,109,111,115,119,123,255,251,247,243,239,237,235,233,231,229,227,225,223,222,221,220,219,218,217,216,215,214,213,212,211,210,209,208,207,206,205,204,203,202,201,200,199,198,197,196,195,194,193,192,191,190,189,188,187,186,185,184,183,182,181,180,179,178,177,176,175,174,173,172,171,170,169,168,167,166,165,164,163,162,161,160,159,158,157,156,155,154,153,152,151,150,149,148,147,146,145,144,143,142,141,140,139,138,137,136,135,134,133,132,131,130,129,128,254,253,252,250,249,248,246,245,244,242,241,240,238,236,234,232,230,228,226,224},
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
130 {80,82,84,86,88,90,92,94,96,97,98,100,101,102,104,105,106,108,109,110,112,113,114,115,116,117,118,120,121,122,123,124,125,126,127,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,81,83,85,87,89,91,93,95,99,103,107,111,119,255,247,239,235,231,227,223,221,219,217,215,213,211,209,207,206,205,204,203,202,201,200,199,198,197,196,195,194,193,192,191,190,189,188,187,186,185,184,183,182,181,180,179,178,177,176,175,174,173,172,171,170,169,168,167,166,165,164,163,162,161,160,159,158,157,156,155,154,153,152,151,150,149,148,147,146,145,144,143,142,141,140,139,138,137,136,135,134,133,132,131,130,129,128,254,253,252,251,250,249,248,246,245,244,243,242,241,240,238,237,236,234,233,232,230,229,228,226,225,224,222,220,218,216,214,212,210,208},
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
131 {64,66,68,70,72,74,76,78,80,81,82,84,85,86,88,89,90,92,93,94,96,97,98,99,100,101,102,104,105,106,107,108,109,110,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,65,67,69,71,73,75,77,79,83,87,91,95,103,111,255,239,231,223,219,215,211,207,205,203,201,199,197,195,193,191,190,189,188,187,186,185,184,183,182,181,180,179,178,177,176,175,174,173,172,171,170,169,168,167,166,165,164,163,162,161,160,159,158,157,156,155,154,153,152,151,150,149,148,147,146,145,144,143,142,141,140,139,138,137,136,135,134,133,132,131,130,129,128,254,253,252,251,250,249,248,247,246,245,244,243,242,241,240,238,237,236,235,234,233,232,230,229,228,227,226,225,224,222,221,220,218,217,216,214,213,212,210,209,208,206,204,202,200,198,196,194,192},
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
132 {49,51,53,55,57,59,61,63,64,66,67,68,70,71,72,74,75,76,78,79,80,81,82,84,85,86,87,88,89,90,92,93,94,95,96,97,98,99,100,101,102,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,50,52,54,56,58,60,62,65,69,73,77,83,91,103,255,231,219,211,205,201,197,193,190,188,186,184,182,180,178,176,175,174,173,172,171,170,169,168,167,166,165,164,163,162,161,160,159,158,157,156,155,154,153,152,151,150,149,148,147,146,145,144,143,142,141,140,139,138,137,136,135,134,133,132,131,130,129,128,254,253,252,251,250,249,248,247,246,245,244,243,242,241,240,239,238,237,236,235,234,233,232,230,229,228,227,226,225,224,223,222,221,220,218,217,216,215,214,213,212,210,209,208,207,206,204,203,202,200,199,198,196,195,194,192,191,189,187,185,183,181,179,177},
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
133 {32,34,36,38,40,42,44,46,48,49,51,52,53,55,56,57,59,60,61,63,64,65,66,67,68,70,71,72,73,74,75,76,78,79,80,81,82,83,84,85,86,87,88,89,90,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,33,35,37,39,41,43,45,47,50,54,58,62,69,77,91,255,219,205,197,190,186,182,178,175,173,171,169,167,165,163,161,159,158,157,156,155,154,153,152,151,150,149,148,147,146,145,144,143,142,141,140,139,138,137,136,135,134,133,132,131,130,129,128,254,253,252,251,250,249,248,247,246,245,244,243,242,241,240,239,238,237,236,235,234,233,232,231,230,229,228,227,226,225,224,223,222,221,220,218,217,216,215,214,213,212,211,210,209,208,207,206,204,203,202,201,200,199,198,196,195,194,193,192,191,189,188,187,185,184,183,181,180,179,177,176,174,172,170,168,166,164,162,160},
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
134 {16,18,20,22,24,26,28,30,32,33,34,36,37,38,40,41,42,44,45,46,48,49,50,51,52,53,55,56,57,58,59,60,61,63,64,65,66,67,68,69,70,71,72,73,74,75,76,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,17,19,21,23,25,27,29,31,35,39,43,47,54,62,77,255,205,190,182,175,171,167,163,159,157,155,153,151,149,147,145,143,142,141,140,139,138,137,136,135,134,133,132,131,130,129,128,254,253,252,251,250,249,248,247,246,245,244,243,242,241,240,239,238,237,236,235,234,233,232,231,230,229,228,227,226,225,224,223,222,221,220,219,218,217,216,215,214,213,212,211,210,209,208,207,206,204,203,202,201,200,199,198,197,196,195,194,193,192,191,189,188,187,186,185,184,183,181,180,179,178,177,176,174,173,172,170,169,168,166,165,164,162,161,160,158,156,154,152,150,148,146,144},
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
135 {2,4,6,8,10,12,14,16,17,18,20,21,22,24,25,26,28,29,30,32,33,34,35,36,37,38,40,41,42,43,44,45,46,48,49,50,51,52,53,54,55,56,57,58,59,60,61,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,0,1,3,5,7,9,11,13,15,19,23,27,31,39,47,62,255,190,175,167,159,155,151,147,143,141,139,137,135,133,131,129,254,253,252,251,250,249,248,247,246,245,244,243,242,241,240,239,238,237,236,235,234,233,232,231,230,229,228,227,226,225,224,223,222,221,220,219,218,217,216,215,214,213,212,211,210,209,208,207,206,205,204,203,202,201,200,199,198,197,196,195,194,193,192,191,189,188,187,186,185,184,183,182,181,180,179,178,177,176,174,173,172,171,170,169,168,166,165,164,163,162,161,160,158,157,156,154,153,152,150,149,148,146,145,144,142,140,138,136,134,132,130,128},
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
136 {1,2,4,5,6,8,9,10,12,13,14,16,17,18,19,20,21,22,24,25,26,27,28,29,30,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,0,3,7,11,15,23,31,47,255,175,159,151,143,139,135,131,254,253,252,251,250,249,248,247,246,245,244,243,242,241,240,239,238,237,236,235,234,233,232,231,230,229,228,227,226,225,224,223,222,221,220,219,218,217,216,215,214,213,212,211,210,209,208,207,206,205,204,203,202,201,200,199,198,197,196,195,194,193,192,191,190,189,188,187,186,185,184,183,182,181,180,179,178,177,176,174,173,172,171,170,169,168,167,166,165,164,163,162,161,160,158,157,156,155,154,153,152,150,149,148,147,146,145,144,142,141,140,138,137,136,134,133,132,130,129,128},
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
137 {1,2,3,4,5,6,8,9,10,11,12,13,14,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,0,7,15,31,255,159,143,135,254,253,252,251,250,249,248,247,246,245,244,243,242,241,240,239,238,237,236,235,234,233,232,231,230,229,228,227,226,225,224,223,222,221,220,219,218,217,216,215,214,213,212,211,210,209,208,207,206,205,204,203,202,201,200,199,198,197,196,195,194,193,192,191,190,189,188,187,186,185,184,183,182,181,180,179,178,177,176,175,174,173,172,171,170,169,168,167,166,165,164,163,162,161,160,158,157,156,155,154,153,152,151,150,149,148,147,146,145,144,142,141,140,139,138,137,136,134,133,132,131,130,129,128},
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
138 {1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,0,15,255,143,254,253,252,251,250,249,248,247,246,245,244,243,242,241,240,239,238,237,236,235,234,233,232,231,230,229,228,227,226,225,224,223,222,221,220,219,218,217,216,215,214,213,212,211,210,209,208,207,206,205,204,203,202,201,200,199,198,197,196,195,194,193,192,191,190,189,188,187,186,185,184,183,182,181,180,179,178,177,176,175,174,173,172,171,170,169,168,167,166,165,164,163,162,161,160,159,158,157,156,155,154,153,152,151,150,149,148,147,146,145,144,142,141,140,139,138,137,136,135,134,133,132,131,130,129,128},
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
139 {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,0,255,254,253,252,251,250,249,248,247,246,245,244,243,242,241,240,239,238,237,236,235,234,233,232,231,230,229,228,227,226,225,224,223,222,221,220,219,218,217,216,215,214,213,212,211,210,209,208,207,206,205,204,203,202,201,200,199,198,197,196,195,194,193,192,191,190,189,188,187,186,185,184,183,182,181,180,179,178,177,176,175,174,173,172,171,170,169,168,167,166,165,164,163,162,161,160,159,158,157,156,155,154,153,152,151,150,149,148,147,146,145,144,143,142,141,140,139,138,137,136,135,134,133,132,131,130,129,128}
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
140 };
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
141
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
142
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
143 #ifndef MIN_MACRO
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
144 #define MIN_MACRO(a,b) (((a)<(b))?(a):(b))
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
145 #endif
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
146
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
147 #ifndef MAX_MACRO
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
148 #define MAX_MACRO(a,b) (((a)>(b))?(a):(b))
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
149 #endif
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
150
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
151 #define POSITIVE_ULAW_ZERO 0xff
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
152 #define NEGATIVE_ULAW_ZERO 0x7f
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
153
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
154 #define CAPMAXSCHAR(x) ((x > 127) ? 127 : x)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
155 #define CAPMAXUCHAR(x) ((x > 255) ? 255 : x)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
156 #define CAPMAXSHORT(x) ((x > 32767) ? 32767 : x)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
157 #define CAPMAXUSHORT(x) ((x > 65535) ? 65535 : x)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
158
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
159 #define UNDEFINED_UINT -1
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
160 #define DEFAULT_BLOCK_SIZE 256
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
161 #define DEFAULT_V0NMEAN 0
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
162 #define DEFAULT_V2NMEAN 4
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
163 #define DEFAULT_MAXNLPC 0
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
164 #define DEFAULT_NCHAN 1
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
165 #define DEFAULT_NSKIP 0
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
166 #define DEFAULT_NDISCARD 0
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
167 #define NBITPERLONG 32
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
168 #define DEFAULT_MINSNR 256
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
169 #define DEFAULT_QUANTERROR 0
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
170 #define MINBITRATE 2.5
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
171
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
172 #define MEAN_VERSION0 0
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
173 #define MEAN_VERSION2 4
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
174
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
175 #define SHN_FN_DIFF0 0
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
176 #define SHN_FN_DIFF1 1
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
177 #define SHN_FN_DIFF2 2
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
178 #define SHN_FN_DIFF3 3
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
179 #define SHN_FN_QUIT 4
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
180 #define SHN_FN_BLOCKSIZE 5
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
181 #define SHN_FN_BITSHIFT 6
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
182 #define SHN_FN_QLPC 7
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
183 #define SHN_FN_ZERO 8
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
184 #define SHN_FN_VERBATIM 9
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
185
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
186 #define SHN_TYPE_AU1 0
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
187 #define SHN_TYPE_S8 1
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
188 #define SHN_TYPE_U8 2
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
189 #define SHN_TYPE_S16HL 3
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
190 #define SHN_TYPE_U16HL 4
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
191 #define SHN_TYPE_S16LH 5
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
192 #define SHN_TYPE_U16LH 6
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
193 #define SHN_TYPE_ULAW 7
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
194 #define SHN_TYPE_AU2 8
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
195 #define SHN_TYPE_AU3 9
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
196 #define SHN_TYPE_ALAW 10
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
197 #define SHN_TYPE_RIFF_WAVE 11
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
198 #define SHN_TYPE_EOF 12
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
199 #define SHN_TYPE_GENERIC_ULAW 128
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
200 #define SHN_TYPE_GENERIC_ALAW 129
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
201
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
202 #define SHN_FNSIZE 2
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
203 #define SHN_CHANNELSIZE 0
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
204 #define SHN_TYPESIZE 4
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
205 #define SHN_ULONGSIZE 2
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
206 #define SHN_NSKIPSIZE 1
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
207 #define SHN_LPCQSIZE 2
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
208 #define SHN_LPCQUANT 5
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
209 #define SHN_XBYTESIZE 7
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
210 #define SHN_VERBATIM_CKSIZE_SIZE 5
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
211 #define SHN_VERBATIM_BYTE_SIZE 8
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
212 #define SHN_ENERGYSIZE 3
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
213 #define SHN_BITSHIFTSIZE 2
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
214
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
215 #define SHN_LPCQOFFSET_VER2 (1 << SHN_LPCQUANT)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
216
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
217
212
8c2cb920a383 Changed the magic number macro to be more uniform with other decoders.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
218 #define SHN_MAGIC 0x676B6A61 /* looks like "ajkg" as chars. */
101
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
219
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
220 #ifndef M_LN2
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
221 #define M_LN2 0.69314718055994530942
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
222 #endif
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
223
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
224 #ifndef M_PI
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
225 #define M_PI 3.14159265358979323846
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
226 #endif
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
227
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
228
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
229 static int word_get(shn_t *shn, SDL_RWops *rw, Uint32 *word)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
230 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
231 if (shn->nbyteget < 4)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
232 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
233 shn->nbyteget += SDL_RWread(rw, shn->getbuf, 1, SHN_BUFSIZ);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
234 BAIL_IF_MACRO(shn->nbyteget < 4, NULL, 0);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
235 shn->getbufp = shn->getbuf;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
236 } /* if */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
237
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
238 if (word != NULL)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
239 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
240 *word = (((Sint32) shn->getbufp[0]) << 24) |
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
241 (((Sint32) shn->getbufp[1]) << 16) |
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
242 (((Sint32) shn->getbufp[2]) << 8) |
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
243 (((Sint32) shn->getbufp[3]) );
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
244 } /* if */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
245
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
246 shn->getbufp += 4;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
247 shn->nbyteget -= 4;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
248
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
249 return(1);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
250 } /* word_get */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
251
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
252
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
253 static int uvar_get(int nbin, shn_t *shn, SDL_RWops *rw, Sint32 *word)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
254 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
255 Sint32 result;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
256
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
257 if (shn->nbitget == 0)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
258 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
259 BAIL_IF_MACRO(!word_get(shn, rw, &shn->gbuffer), NULL, 0);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
260 shn->nbitget = 32;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
261 } /* if */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
262
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
263 for (result = 0; !(shn->gbuffer & (1L << --shn->nbitget)); result++)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
264 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
265 if (shn->nbitget == 0)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
266 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
267 BAIL_IF_MACRO(!word_get(shn, rw, &shn->gbuffer), NULL, 0);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
268 shn->nbitget = 32;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
269 } /* if */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
270 } /* for */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
271
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
272 while (nbin != 0)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
273 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
274 if (shn->nbitget >= nbin)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
275 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
276 result = ( (result << nbin) |
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
277 ((shn->gbuffer >> (shn->nbitget - nbin)) &
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
278 mask_table[nbin]) );
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
279 shn->nbitget -= nbin;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
280 break;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
281 } /* if */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
282 else
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
283 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
284 result = (result << shn->nbitget) |
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
285 (shn->gbuffer & mask_table[shn->nbitget]);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
286 BAIL_IF_MACRO(!word_get(shn, rw, &shn->gbuffer), NULL, 0);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
287 nbin -= shn->nbitget;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
288 shn->nbitget = 32;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
289 } /* else */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
290 } /* while */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
291
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
292 if (word != NULL)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
293 *word = result;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
294
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
295 return(1);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
296 } /* uvar_get */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
297
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
298
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
299 static int var_get(int nbin, shn_t *shn, SDL_RWops *rw, Sint32 *word)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
300 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
301 BAIL_IF_MACRO(!uvar_get(nbin + 1, shn, rw, word), NULL, 0);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
302
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
303 if ((*word) & 1)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
304 *word = (Sint32) ~((*word) >> 1);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
305 else
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
306 *word = (Sint32) ((*word) >> 1);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
307
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
308 return(1);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
309 } /* var_get */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
310
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
311
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
312 static int ulong_get(shn_t *shn, SDL_RWops *rw, Sint32 *word)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
313 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
314 Sint32 nbit;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
315 Sint32 retval;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
316 BAIL_IF_MACRO(!uvar_get(SHN_ULONGSIZE, shn, rw, &nbit), NULL, 0);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
317 BAIL_IF_MACRO(!uvar_get(nbit, shn, rw, &retval), NULL, 0);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
318
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
319 if (word != NULL)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
320 *word = retval;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
321
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
322 return(1);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
323 } /* ulong_get */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
324
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
325
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
326 static inline int uint_get(int nbit, shn_t *shn, SDL_RWops *rw, Sint32 *word)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
327 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
328 return((shn->version == 0) ?
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
329 uvar_get(nbit, shn, rw, word) :
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
330 ulong_get(shn, rw, word));
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
331 } /* uint_get */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
332
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
333
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
334 static int SHN_init(void)
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
335 {
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
336 return(1); /* initialization always successful. */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
337 } /* SHN_init */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
338
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
339
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
340 static void SHN_quit(void)
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
341 {
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
342 /* it's a no-op. */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
343 } /* SHN_quit */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
344
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
345
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
346 /*
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
347 * Look through the whole file for a SHN magic number. This is costly, so
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
348 * it should only be done if the user SWEARS they have a Shorten stream...
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
349 */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
350 static inline int extended_shn_magic_search(Sound_Sample *sample)
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
351 {
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
352 SDL_RWops *rw = ((Sound_SampleInternal *) sample->opaque)->rw;
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
353 Uint32 word = 0;
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
354 Uint8 ch;
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
355
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
356 while (1)
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
357 {
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
358 BAIL_IF_MACRO(SDL_RWread(rw, &ch, sizeof (ch), 1) != 1, NULL, -1);
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
359 word = ((word << 8) & 0xFFFFFF00) | ch;
212
8c2cb920a383 Changed the magic number macro to be more uniform with other decoders.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
360 if (SDL_SwapBE32(word) == SHN_MAGIC)
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
361 {
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
362 BAIL_IF_MACRO(SDL_RWread(rw, &ch, sizeof (ch), 1) != 1, NULL, -1);
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
363 return((int) ch);
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
364 } /* if */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
365 } /* while */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
366
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
367 return((int) ch);
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
368 } /* extended_shn_magic_search */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
369
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
370
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
371 /* look for the magic number in the RWops and see what kind of file this is. */
101
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
372 static inline int determine_shn_version(Sound_Sample *sample, const char *ext)
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
373 {
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
374 SDL_RWops *rw = ((Sound_SampleInternal *) sample->opaque)->rw;
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
375 Uint32 magic;
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
376 Uint8 ch;
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
377
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
378 /*
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
379 * Apparently the magic number can start at any byte offset in the file,
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
380 * and we should just discard prior data, but I'm going to restrict it
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
381 * to offset zero for now, so we don't chug down every file that might
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
382 * happen to pass through here. If the extension is explicitly "SHN", we
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
383 * check the whole stream, though.
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
384 */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
385
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
386 if (__Sound_strcasecmp(ext, "shn") == 0)
101
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
387 return(extended_shn_magic_search(sample));
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
388
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
389 BAIL_IF_MACRO(SDL_RWread(rw, &magic, sizeof (magic), 1) != 1, NULL, -1);
212
8c2cb920a383 Changed the magic number macro to be more uniform with other decoders.
Ryan C. Gordon <icculus@icculus.org>
parents: 184
diff changeset
390 BAIL_IF_MACRO(SDL_SwapLE32(magic) != SHN_MAGIC, "SHN: Not a SHN file", -1);
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
391 BAIL_IF_MACRO(SDL_RWread(rw, &ch, sizeof (ch), 1) != 1, NULL, -1);
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
392 BAIL_IF_MACRO(ch > 3, "SHN: Unsupported file version", -1);
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
393
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
394 return((int) ch);
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
395 } /* determine_shn_version */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
396
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
397
242
12a9c2e0b00f Fixed compiler warnings (thanks, Darrell!)
Ryan C. Gordon <icculus@icculus.org>
parents: 233
diff changeset
398 static void init_shn_offset(Sint32 **offset, int nchan, int nblock, int ftype)
101
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
399 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
400 Sint32 mean = 0;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
401 int chan;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
402
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
403 switch (ftype)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
404 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
405 case SHN_TYPE_AU1:
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
406 case SHN_TYPE_S8:
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
407 case SHN_TYPE_S16HL:
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
408 case SHN_TYPE_S16LH:
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
409 case SHN_TYPE_ULAW:
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
410 case SHN_TYPE_AU2:
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
411 case SHN_TYPE_AU3:
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
412 case SHN_TYPE_ALAW:
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
413 mean = 0;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
414 break;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
415 case SHN_TYPE_U8:
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
416 mean = 0x80;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
417 break;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
418 case SHN_TYPE_U16HL:
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
419 case SHN_TYPE_U16LH:
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
420 mean = 0x8000;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
421 break;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
422 default:
387
fb519e6028e3 Changed all the Sound_SetError() calls to __Sound_SetError (or BAIL*_MACRO)
Ryan C. Gordon <icculus@icculus.org>
parents: 377
diff changeset
423 __Sound_SetError("SHN: unknown file type");
245
82a37ef73ae9 Whoops; fixing a compiling bug I introduced.
Ryan C. Gordon <icculus@icculus.org>
parents: 242
diff changeset
424 return;
101
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
425 } /* switch */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
426
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
427 for(chan = 0; chan < nchan; chan++)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
428 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
429 int i;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
430 for(i = 0; i < nblock; i++)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
431 offset[chan][i] = mean;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
432 } /* for */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
433 } /* init_shn_offset */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
434
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
435
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
436 static inline Uint16 cvt_shnftype_to_sdlfmt(Sint16 shntype)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
437 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
438 switch (shntype)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
439 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
440 case SHN_TYPE_S8:
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
441 return(AUDIO_S8);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
442
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
443 case SHN_TYPE_ALAW:
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
444 case SHN_TYPE_ULAW:
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
445 case SHN_TYPE_AU1:
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
446 case SHN_TYPE_AU2:
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
447 case SHN_TYPE_AU3:
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
448 case SHN_TYPE_U8:
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
449 return(AUDIO_U8);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
450
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
451 case SHN_TYPE_S16HL:
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
452 return(AUDIO_S16MSB);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
453
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
454 case SHN_TYPE_S16LH:
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
455 return(AUDIO_S16LSB);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
456
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
457 case SHN_TYPE_U16HL:
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
458 return(AUDIO_U16MSB);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
459
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
460 case SHN_TYPE_U16LH:
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
461 return(AUDIO_U16LSB);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
462 } /* switch */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
463
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
464 return(0);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
465 } /* cvt_shnftype_to_sdlfmt */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
466
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
467
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
468 static inline int skip_bits(shn_t *shn, SDL_RWops *rw)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
469 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
470 int i;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
471 Sint32 skip;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
472 Sint32 trash;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
473
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
474 BAIL_IF_MACRO(!uint_get(SHN_NSKIPSIZE, shn, rw, &skip), NULL, 0);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
475 for(i = 0; i < skip; i++)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
476 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
477 BAIL_IF_MACRO(!uint_get(SHN_XBYTESIZE, shn, rw, &trash), NULL, 0);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
478 } /* for */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
479
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
480 return(1);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
481 } /* skip_bits */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
482
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
483
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
484 static Sint32 **shn_long2d(Uint32 n0, Uint32 n1)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
485 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
486 Sint32 **array0;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
487 Uint32 size = (n0 * sizeof (Sint32 *)) + (n0 * n1 * sizeof (Sint32));
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
488
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
489 array0 = (Sint32 **) malloc(size);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
490 if (array0 != NULL)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
491 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
492 int i;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
493 Sint32 *array1 = (Sint32 *) (array0 + n0);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
494 for(i = 0; i < n0; i++)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
495 array0[i] = array1 + (i * n1);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
496 } /* if */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
497
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
498 return(array0);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
499 } /* shn_long2d */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
500
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
501 #define riffID 0x46464952 /* "RIFF", in ascii. */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
502 #define waveID 0x45564157 /* "WAVE", in ascii. */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
503 #define fmtID 0x20746D66 /* "fmt ", in ascii. */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
504 #define dataID 0x61746164 /* "data", in ascii. */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
505
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
506 static int verb_ReadLE32(shn_t *shn, SDL_RWops *rw, Uint32 *word)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
507 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
508 int i;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
509 Uint8 chars[4];
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
510 Sint32 byte;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
511
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
512 for (i = 0; i < 4; i++)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
513 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
514 if (!uvar_get(SHN_VERBATIM_BYTE_SIZE, shn, rw, &byte))
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
515 return(0);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
516 chars[i] = (Uint8) byte;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
517 } /* for */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
518
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
519 memcpy(word, chars, sizeof (*word));
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
520 *word = SDL_SwapLE32(*word);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
521
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
522 return(1);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
523 } /* verb_ReadLE32 */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
524
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
525
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
526 static int verb_ReadLE16(shn_t *shn, SDL_RWops *rw, Uint16 *word)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
527 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
528 int i;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
529 Uint8 chars[2];
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
530 Sint32 byte;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
531
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
532 for (i = 0; i < 2; i++)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
533 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
534 if (!uvar_get(SHN_VERBATIM_BYTE_SIZE, shn, rw, &byte))
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
535 return(0);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
536 chars[i] = (Uint8) byte;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
537 } /* for */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
538
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
539 memcpy(word, chars, sizeof (*word));
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
540 *word = SDL_SwapLE16(*word);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
541
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
542 return(1);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
543 } /* verb_ReadLE16 */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
544
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
545
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
546 static inline int parse_riff_header(shn_t *shn, Sound_Sample *sample)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
547 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
548 Sound_SampleInternal *internal = (Sound_SampleInternal *) sample->opaque;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
549 SDL_RWops *rw = internal->rw;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
550 Uint16 u16;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
551 Uint32 u32;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
552 Sint32 cklen;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
553
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
554 BAIL_IF_MACRO(!uvar_get(SHN_VERBATIM_CKSIZE_SIZE, shn, rw, &cklen), NULL, 0);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
555
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
556 BAIL_IF_MACRO(!verb_ReadLE32(shn, rw, &u32), NULL, 0); /* RIFF header */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
557 BAIL_IF_MACRO(u32 != riffID, "SHN: No RIFF header.", 0);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
558 BAIL_IF_MACRO(!verb_ReadLE32(shn, rw, &u32), NULL, 0); /* length */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
559
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
560 BAIL_IF_MACRO(!verb_ReadLE32(shn, rw, &u32), NULL, 0); /* WAVE header */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
561 BAIL_IF_MACRO(u32 != waveID, "SHN: No WAVE header.", 0);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
562
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
563 BAIL_IF_MACRO(!verb_ReadLE32(shn, rw, &u32), NULL, 0); /* 'fmt ' header */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
564 BAIL_IF_MACRO(u32 != fmtID, "SHN: No 'fmt ' header.", 0);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
565
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
566 BAIL_IF_MACRO(!verb_ReadLE32(shn, rw, &u32), NULL, 0); /* chunksize */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
567 BAIL_IF_MACRO(!verb_ReadLE16(shn, rw, &u16), NULL, 0); /* format */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
568 BAIL_IF_MACRO(!verb_ReadLE16(shn, rw, &u16), NULL, 0); /* channels */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
569 sample->actual.channels = u16;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
570 BAIL_IF_MACRO(!verb_ReadLE32(shn, rw, &u32), NULL, 0); /* sample rate */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
571 sample->actual.rate = u32;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
572
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
573 BAIL_IF_MACRO(!verb_ReadLE32(shn, rw, &u32), NULL, 0); /* bytespersec */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
574 BAIL_IF_MACRO(!verb_ReadLE16(shn, rw, &u16), NULL, 0); /* blockalign */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
575 BAIL_IF_MACRO(!verb_ReadLE16(shn, rw, &u16), NULL, 0); /* bitspersample */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
576
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
577 BAIL_IF_MACRO(!verb_ReadLE32(shn, rw, &u32), NULL, 0); /* 'data' header */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
578 BAIL_IF_MACRO(u32 != dataID, "SHN: No 'data' header.", 0);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
579 BAIL_IF_MACRO(!verb_ReadLE32(shn, rw, &u32), NULL, 0); /* chunksize */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
580
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
581 return(1);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
582 } /* parse_riff_header */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
583
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
584
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
585 static int SHN_open(Sound_Sample *sample, const char *ext)
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
586 {
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
587 Sound_SampleInternal *internal = (Sound_SampleInternal *) sample->opaque;
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
588 SDL_RWops *rw = internal->rw;
101
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
589 shn_t _shn;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
590 shn_t *shn = &_shn; /* malloc and copy later. */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
591 Sint32 cmd;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
592 Sint32 chan;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
593
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
594 memset(shn, '\0', sizeof (shn_t));
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
595 shn->getbufp = shn->getbuf = (Uint8 *) malloc(SHN_BUFSIZ);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
596 shn->datatype = SHN_TYPE_EOF;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
597 shn->nchan = DEFAULT_NCHAN;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
598 shn->blocksize = DEFAULT_BLOCK_SIZE;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
599 shn->maxnlpc = DEFAULT_MAXNLPC;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
600 shn->nmean = UNDEFINED_UINT;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
601 shn->version = determine_shn_version(sample, ext);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
602
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
603 if (shn->version == -1) goto shn_open_puke;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
604 if (!uint_get(SHN_TYPESIZE, shn, rw, &shn->datatype)) goto shn_open_puke;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
605 if (!uint_get(SHN_CHANNELSIZE, shn, rw, &shn->nchan)) goto shn_open_puke;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
606
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
607 sample->actual.format = cvt_shnftype_to_sdlfmt(shn->datatype);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
608 if (sample->actual.format == 0)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
609 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
610 SDL_SetError(ERR_UNSUPPORTED_FORMAT);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
611 goto shn_open_puke;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
612 } /* if */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
613
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
614 if (shn->version > 0)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
615 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
616 int rc = uint_get((int) (log((double) DEFAULT_BLOCK_SIZE) / M_LN2),
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
617 shn, rw, &shn->blocksize);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
618 if (!rc) goto shn_open_puke;;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
619 if (!uint_get(SHN_LPCQSIZE, shn, rw, &shn->maxnlpc)) goto shn_open_puke;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
620 if (!uint_get(0, shn, rw, &shn->nmean)) goto shn_open_puke;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
621 if (!skip_bits(shn, rw)) goto shn_open_puke;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
622 } /* else */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
623
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
624 shn->nwrap = (shn->maxnlpc > 3) ? shn->maxnlpc : 3;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
625
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
626 /* grab some space for the input buffer */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
627 shn->buffer = shn_long2d((Uint32) shn->nchan, shn->blocksize + shn->nwrap);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
628 shn->offset = shn_long2d((Uint32) shn->nchan, MAX_MACRO(1, shn->nmean));
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
629
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
630 for (chan = 0; chan < shn->nchan; chan++)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
631 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
632 int i;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
633 for(i = 0; i < shn->nwrap; i++)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
634 shn->buffer[chan][i] = 0;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
635 shn->buffer[chan] += shn->nwrap;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
636 } /* for */
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
637
101
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
638 if (shn->maxnlpc > 0)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
639 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
640 shn->qlpc = (int *) malloc((Uint32) (shn->maxnlpc * sizeof (Sint32)));
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
641 if (shn->qlpc == NULL)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
642 {
387
fb519e6028e3 Changed all the Sound_SetError() calls to __Sound_SetError (or BAIL*_MACRO)
Ryan C. Gordon <icculus@icculus.org>
parents: 377
diff changeset
643 __Sound_SetError(ERR_OUT_OF_MEMORY);
101
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
644 goto shn_open_puke;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
645 } /* if */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
646 } /* if */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
647
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
648 if (shn->version > 1)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
649 shn->lpcqoffset = SHN_LPCQOFFSET_VER2;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
650
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
651 init_shn_offset(shn->offset, shn->nchan,
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
652 MAX_MACRO(1, shn->nmean), shn->datatype);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
653
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
654 if ( (!uvar_get(SHN_FNSIZE, shn, rw, &cmd)) ||
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
655 (cmd != SHN_FN_VERBATIM) ||
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
656 (!parse_riff_header(shn, sample)) )
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
657 {
387
fb519e6028e3 Changed all the Sound_SetError() calls to __Sound_SetError (or BAIL*_MACRO)
Ryan C. Gordon <icculus@icculus.org>
parents: 377
diff changeset
658 if (cmd != SHN_FN_VERBATIM) /* the other conditions set error state */
fb519e6028e3 Changed all the Sound_SetError() calls to __Sound_SetError (or BAIL*_MACRO)
Ryan C. Gordon <icculus@icculus.org>
parents: 377
diff changeset
659 __Sound_SetError("SHN: Expected VERBATIM function");
101
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
660
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
661 goto shn_open_puke;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
662 return(0);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
663 } /* if */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
664
233
15a3b1a1291c Kludged implementation of the rewind method.
Ryan C. Gordon <icculus@icculus.org>
parents: 221
diff changeset
665 shn->start_pos = SDL_RWtell(rw);
15a3b1a1291c Kludged implementation of the rewind method.
Ryan C. Gordon <icculus@icculus.org>
parents: 221
diff changeset
666
101
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
667 shn = (shn_t *) malloc(sizeof (shn_t));
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
668 if (shn == NULL)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
669 {
387
fb519e6028e3 Changed all the Sound_SetError() calls to __Sound_SetError (or BAIL*_MACRO)
Ryan C. Gordon <icculus@icculus.org>
parents: 377
diff changeset
670 __Sound_SetError(ERR_OUT_OF_MEMORY);
101
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
671 goto shn_open_puke;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
672 } /* if */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
673
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
674 memcpy(shn, &_shn, sizeof (shn_t));
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
675 internal->decoder_private = shn;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
676
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
677 SNDDBG(("SHN: Accepting data stream.\n"));
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
678 sample->flags = SOUND_SAMPLEFLAG_NONE;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
679 return(1); /* we'll handle this data. */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
680
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
681 shn_open_puke:
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
682 if (_shn.getbuf)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
683 free(_shn.getbuf);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
684 if (_shn.buffer != NULL)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
685 free(_shn.buffer);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
686 if (_shn.offset != NULL)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
687 free(_shn.offset);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
688 if (_shn.qlpc != NULL)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
689 free(_shn.qlpc);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
690
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
691 return(0);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
692 } /* SHN_open */
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
693
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
694
233
15a3b1a1291c Kludged implementation of the rewind method.
Ryan C. Gordon <icculus@icculus.org>
parents: 221
diff changeset
695 static void fix_bitshift(Sint32 *buffer, int nitem, int bitshift, int ftype)
101
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
696 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
697 int i;
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
698
101
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
699 if (ftype == SHN_TYPE_AU1)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
700 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
701 for (i = 0; i < nitem; i++)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
702 buffer[i] = ulaw_outward[bitshift][buffer[i] + 128];
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
703 } /* if */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
704 else if (ftype == SHN_TYPE_AU2)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
705 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
706 for(i = 0; i < nitem; i++)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
707 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
708 if (buffer[i] >= 0)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
709 buffer[i] = ulaw_outward[bitshift][buffer[i] + 128];
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
710 else if (buffer[i] == -1)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
711 buffer[i] = NEGATIVE_ULAW_ZERO;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
712 else
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
713 buffer[i] = ulaw_outward[bitshift][buffer[i] + 129];
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
714 } /* for */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
715 } /* else if */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
716 else
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
717 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
718 if (bitshift != 0)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
719 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
720 for(i = 0; i < nitem; i++)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
721 buffer[i] <<= bitshift;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
722 } /* if */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
723 } /* else */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
724 } /* fix_bitshift */
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
725
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
726
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
727 static void SHN_close(Sound_Sample *sample)
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
728 {
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
729 Sound_SampleInternal *internal = (Sound_SampleInternal *) sample->opaque;
101
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
730 shn_t *shn = (shn_t *) internal->decoder_private;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
731
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
732 if (shn->qlpc != NULL)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
733 free(shn->qlpc);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
734
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
735 if (shn->backBuffer != NULL)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
736 free(shn->backBuffer);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
737
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
738 if (shn->offset != NULL)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
739 free(shn->offset);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
740
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
741 if (shn->buffer != NULL)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
742 free(shn->buffer);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
743
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
744 if (shn->getbuf != NULL)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
745 free(shn->getbuf);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
746
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
747 free(shn);
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
748 } /* SHN_close */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
749
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
750
101
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
751 /* xLaw conversions... */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
752
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
753 /* adapted by ajr for int input */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
754 static Uint8 Slinear2ulaw(int sample)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
755 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
756 /*
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
757 ** This routine converts from linear to ulaw.
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
758 **
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
759 ** Craig Reese: IDA/Supercomputing Research Center
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
760 ** Joe Campbell: Department of Defense
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
761 ** 29 September 1989
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
762 **
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
763 ** References:
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
764 ** 1) CCITT Recommendation G.711 (very difficult to follow)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
765 ** 2) "A New Digital Technique for Implementation of Any
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
766 ** Continuous PCM Companding Law," Villeret, Michel,
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
767 ** et al. 1973 IEEE Int. Conf. on Communications, Vol 1,
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
768 ** 1973, pg. 11.12-11.17
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
769 ** 3) MIL-STD-188-113,"Interoperability and Performance Standards
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
770 ** for Analog-to_Digital Conversion Techniques,"
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
771 ** 17 February 1987
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
772 **
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
773 ** Input: Signed 16 bit linear sample
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
774 ** Output: 8 bit ulaw sample
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
775 */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
776
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
777 #define BIAS 0x84 /* define the add-in bias for 16 bit samples */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
778 #define CLIP 32635
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
779
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
780 int sign, exponent, mantissa;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
781 Uint8 ulawbyte;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
782 static const int exp_lut[256] = {0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3,
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
783 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
784 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
785 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
786 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
787 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
788 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
789 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
790 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
791 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
792 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
793 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
794 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
795 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
796 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
797 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7};
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
798
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
799 /* Get the sample into sign-magnitude. */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
800 if (sample >= 0)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
801 sign = 0;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
802 else
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
803 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
804 sign = 0x80;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
805 sample = -sample;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
806 } /* else */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
807
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
808 /* clip the magnitude */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
809 if (sample > CLIP)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
810 sample = CLIP;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
811
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
812 /* Convert from 16 bit linear to ulaw. */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
813 sample = sample + BIAS;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
814 exponent = exp_lut[( sample >> 7 ) & 0xFF];
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
815 mantissa = (sample >> (exponent + 3)) & 0x0F;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
816 ulawbyte = ~(sign | (exponent << 4) | mantissa);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
817
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
818 return(ulawbyte);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
819 } /* Slinear2ulaw */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
820
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
821
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
822 /* this is derived from the Sun code - it is a bit simpler and has int input */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
823 #define QUANT_MASK (0xf) /* Quantization field mask. */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
824 #define NSEGS (8) /* Number of A-law segments. */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
825 #define SEG_SHIFT (4) /* Left shift for segment number. */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
826
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
827
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
828 static Uint8 Slinear2alaw(Sint32 linear)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
829 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
830 int seg;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
831 Uint8 aval, mask;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
832 static const Sint32 seg_aend[NSEGS] =
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
833 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
834 0x1f,0x3f,0x7f,0xff,0x1ff,0x3ff,0x7ff,0xfff
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
835 };
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
836
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
837 linear >>= 3;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
838 if(linear >= 0)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
839 mask = 0xd5; /* sign (7th) bit = 1 */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
840 else
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
841 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
842 mask = 0x55; /* sign bit = 0 */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
843 linear = -linear - 1;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
844 } /* else */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
845
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
846 /* Convert the scaled magnitude to segment number. */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
847 for (seg = 0; (seg < NSEGS) && (linear > seg_aend[seg]); seg++);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
848
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
849 /* Combine the sign, segment, and quantization bits. */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
850 if (seg >= NSEGS) /* out of range, return maximum value. */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
851 return((Uint8) (0x7F ^ mask));
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
852
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
853 aval = (Uint8) seg << SEG_SHIFT;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
854 if (seg < 2)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
855 aval |= (linear >> 1) & QUANT_MASK;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
856 else
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
857 aval |= (linear >> seg) & QUANT_MASK;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
858
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
859 return (aval ^ mask);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
860 } /* Slinear2alaw */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
861
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
862
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
863 /* convert from signed ints to a given type and write */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
864 static Uint32 put_to_buffers(Sound_Sample *sample, Uint32 bw)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
865 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
866 Sound_SampleInternal *internal = (Sound_SampleInternal *) sample->opaque;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
867 shn_t *shn = (shn_t *) internal->decoder_private;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
868 int i, chan;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
869 Sint32 *data0 = shn->buffer[0];
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
870 Sint32 nitem = shn->blocksize;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
871 int datasize = ((sample->actual.format & 0xFF) / 8);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
872 Uint32 bsiz = shn->nchan * nitem * datasize;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
873
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
874 assert(shn->backBufLeft == 0);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
875
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
876 if (shn->backBufferSize < bsiz)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
877 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
878 void *rc = realloc(shn->backBuffer, bsiz);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
879 if (rc == NULL)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
880 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
881 sample->flags |= SOUND_SAMPLEFLAG_ERROR;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
882 BAIL_MACRO(ERR_OUT_OF_MEMORY, 0);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
883 } /* if */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
884 shn->backBuffer = (Uint8 *) rc;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
885 shn->backBufferSize = bsiz;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
886 } /* if */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
887
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
888 switch (shn->datatype)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
889 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
890 case SHN_TYPE_AU1: /* leave the conversion to fix_bitshift() */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
891 case SHN_TYPE_AU2:
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
892 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
893 Uint8 *writebufp = shn->backBuffer;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
894 if (shn->nchan == 1)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
895 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
896 for (i = 0; i < nitem; i++)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
897 *writebufp++ = data0[i];
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
898 } /* if */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
899 else
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
900 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
901 for (i = 0; i < nitem; i++)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
902 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
903 for (chan = 0; chan < shn->nchan; chan++)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
904 *writebufp++ = shn->buffer[chan][i];
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
905 } /* for */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
906 } /* else */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
907 } /* case */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
908 break;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
909
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
910 case SHN_TYPE_U8:
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
911 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
912 Uint8 *writebufp = shn->backBuffer;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
913 if (shn->nchan == 1)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
914 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
915 for (i = 0; i < nitem; i++)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
916 *writebufp++ = CAPMAXUCHAR(data0[i]);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
917 } /* if */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
918 else
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
919 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
920 for (i = 0; i < nitem; i++)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
921 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
922 for (chan = 0; chan < shn->nchan; chan++)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
923 *writebufp++ = CAPMAXUCHAR(shn->buffer[chan][i]);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
924 } /* for */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
925 } /* else */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
926 } /* case */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
927 break;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
928
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
929 case SHN_TYPE_S8:
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
930 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
931 Sint8 *writebufp = (Sint8 *) shn->backBuffer;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
932 if (shn->nchan == 1)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
933 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
934 for(i = 0; i < nitem; i++)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
935 *writebufp++ = CAPMAXSCHAR(data0[i]);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
936 } /* if */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
937 else
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
938 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
939 for(i = 0; i < nitem; i++)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
940 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
941 for(chan = 0; chan < shn->nchan; chan++)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
942 *writebufp++ = CAPMAXSCHAR(shn->buffer[chan][i]);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
943 } /* for */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
944 } /* else */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
945 } /* case */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
946 break;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
947
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
948 case SHN_TYPE_S16HL:
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
949 case SHN_TYPE_S16LH:
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
950 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
951 Sint16 *writebufp = (Sint16 *) shn->backBuffer;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
952 if (shn->nchan == 1)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
953 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
954 for (i = 0; i < nitem; i++)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
955 *writebufp++ = CAPMAXSHORT(data0[i]);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
956 } /* if */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
957 else
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
958 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
959 for (i = 0; i < nitem; i++)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
960 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
961 for (chan = 0; chan < shn->nchan; chan++)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
962 *writebufp++ = CAPMAXSHORT(shn->buffer[chan][i]);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
963 } /* for */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
964 } /* else */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
965 } /* case */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
966 break;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
967
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
968 case SHN_TYPE_U16HL:
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
969 case SHN_TYPE_U16LH:
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
970 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
971 Uint16 *writebufp = (Uint16 *) shn->backBuffer;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
972 if (shn->nchan == 1)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
973 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
974 for (i = 0; i < nitem; i++)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
975 *writebufp++ = CAPMAXUSHORT(data0[i]);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
976 } /* if */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
977 else
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
978 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
979 for (i = 0; i < nitem; i++)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
980 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
981 for (chan = 0; chan < shn->nchan; chan++)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
982 *writebufp++ = CAPMAXUSHORT(shn->buffer[chan][i]);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
983 } /* for */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
984 } /* else */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
985 } /* case */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
986 break;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
987
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
988 case SHN_TYPE_ULAW:
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
989 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
990 Uint8 *writebufp = shn->backBuffer;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
991 if (shn->nchan == 1)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
992 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
993 for(i = 0; i < nitem; i++)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
994 *writebufp++ = Slinear2ulaw(CAPMAXSHORT((data0[i] << 3)));
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
995 } /* if */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
996 else
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
997 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
998 for(i = 0; i < nitem; i++)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
999 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1000 for(chan = 0; chan < shn->nchan; chan++)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1001 *writebufp++ = Slinear2ulaw(CAPMAXSHORT((shn->buffer[chan][i] << 3)));
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1002 } /* for */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1003 } /* else */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1004 } /* case */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1005 break;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1006
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1007 case SHN_TYPE_AU3:
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1008 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1009 Uint8 *writebufp = shn->backBuffer;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1010 if (shn->nchan == 1)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1011 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1012 for (i = 0; i < nitem; i++)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1013 if(data0[i] < 0)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1014 *writebufp++ = (127 - data0[i]) ^ 0xd5;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1015 else
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1016 *writebufp++ = (data0[i] + 128) ^ 0x55;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1017 } /* if */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1018 else
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1019 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1020 for (i = 0; i < nitem; i++)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1021 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1022 for (chan = 0; chan < shn->nchan; chan++)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1023 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1024 if (shn->buffer[chan][i] < 0)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1025 *writebufp++ = (127 - shn->buffer[chan][i]) ^ 0xd5;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1026 else
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1027 *writebufp++ = (shn->buffer[chan][i] + 128) ^ 0x55;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1028 } /* for */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1029 } /* for */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1030 } /* else */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1031 } /* case */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1032 break;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1033
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1034 case SHN_TYPE_ALAW:
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1035 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1036 Uint8 *writebufp = shn->backBuffer;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1037 if (shn->nchan == 1)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1038 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1039 for (i = 0; i < nitem; i++)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1040 *writebufp++ = Slinear2alaw(CAPMAXSHORT((data0[i] << 3)));
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1041 } /* if */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1042 else
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1043 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1044 for (i = 0; i < nitem; i++)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1045 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1046 for(chan = 0; chan < shn->nchan; chan++)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1047 *writebufp++ = Slinear2alaw(CAPMAXSHORT((shn->buffer[chan][i] << 3)));
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1048 } /* for */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1049 }/* else */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1050 } /* case */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1051 break;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1052 } /* switch */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1053
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1054 i = MIN_MACRO(internal->buffer_size - bw, bsiz);
126
8a5a1c61d3c6 Fix for MS Visual C.
Ryan C. Gordon <icculus@icculus.org>
parents: 114
diff changeset
1055 memcpy((char *)internal->buffer + bw, shn->backBuffer, i);
101
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1056 shn->backBufLeft = bsiz - i;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1057 memcpy(shn->backBuffer, shn->backBuffer + i, shn->backBufLeft);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1058 return(i);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1059 } /* put_to_buffers */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1060
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1061
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1062 #define ROUNDEDSHIFTDOWN(x, n) (((n) == 0) ? (x) : ((x) >> ((n) - 1)) >> 1)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1063
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1064 static Uint32 SHN_read(Sound_Sample *sample)
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1065 {
101
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1066 Uint32 retval = 0;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1067 Sint32 chan = 0;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1068 Uint32 cpyBytes = 0;
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1069 Sound_SampleInternal *internal = (Sound_SampleInternal *) sample->opaque;
101
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1070 SDL_RWops *rw = internal->rw;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1071 shn_t *shn = (shn_t *) internal->decoder_private;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1072 Sint32 cmd;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1073
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1074 assert(shn->backBufLeft >= 0);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1075
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1076 /* see if there are leftovers to copy... */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1077 if (shn->backBufLeft > 0)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1078 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1079 retval = MIN_MACRO(shn->backBufLeft, internal->buffer_size);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1080 memcpy(internal->buffer, shn->backBuffer, retval);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1081 shn->backBufLeft -= retval;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1082 memcpy(shn->backBuffer, shn->backBuffer + retval, shn->backBufLeft);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1083 } /* if */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1084
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1085 assert((shn->backBufLeft == 0) || (retval == internal->buffer_size));
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1086
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1087 /* get commands from file and execute them */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1088 while (retval < internal->buffer_size)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1089 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1090 if (!uvar_get(SHN_FNSIZE, shn, rw, &cmd))
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1091 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1092 sample->flags |= SOUND_SAMPLEFLAG_ERROR;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1093 return(retval);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1094 } /* if */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1095
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1096 if (cmd == SHN_FN_QUIT)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1097 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1098 sample->flags |= SOUND_SAMPLEFLAG_EOF;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1099 return(retval);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1100 } /* if */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1101
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1102 switch(cmd)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1103 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1104 case SHN_FN_ZERO:
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1105 case SHN_FN_DIFF0:
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1106 case SHN_FN_DIFF1:
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1107 case SHN_FN_DIFF2:
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1108 case SHN_FN_DIFF3:
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1109 case SHN_FN_QLPC:
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1110 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1111 Sint32 i;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1112 Sint32 coffset, *cbuffer = shn->buffer[chan];
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1113 Sint32 resn = 0, nlpc, j;
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1114
101
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1115 if (cmd != SHN_FN_ZERO)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1116 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1117 if (!uvar_get(SHN_ENERGYSIZE, shn, rw, &resn))
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1118 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1119 sample->flags |= SOUND_SAMPLEFLAG_ERROR;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1120 return(retval);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1121 } /* if */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1122
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1123 /* version 0 differed in definition of var_get */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1124 if (shn->version == 0)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1125 resn--;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1126 } /* if */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1127
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1128 /* find mean offset : N.B. this code duplicated */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1129 if (shn->nmean == 0)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1130 coffset = shn->offset[chan][0];
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1131 else
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1132 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1133 Sint32 sum = (shn->version < 2) ? 0 : shn->nmean / 2;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1134 for (i = 0; i < shn->nmean; i++)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1135 sum += shn->offset[chan][i];
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1136
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1137 if (shn->version < 2)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1138 coffset = sum / shn->nmean;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1139 else
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1140 coffset = ROUNDEDSHIFTDOWN(sum / shn->nmean, shn->bitshift);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1141 } /* else */
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1142
101
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1143 switch (cmd)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1144 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1145 case SHN_FN_ZERO:
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1146 for (i = 0; i < shn->blocksize; i++)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1147 cbuffer[i] = 0;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1148 break;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1149
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1150 case SHN_FN_DIFF0:
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1151 for(i = 0; i < shn->blocksize; i++)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1152 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1153 if (!var_get(resn, shn, rw, &cbuffer[i]))
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1154 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1155 sample->flags |= SOUND_SAMPLEFLAG_ERROR;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1156 return(retval);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1157 } /* if */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1158 cbuffer[i] += coffset;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1159 } /* for */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1160 break;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1161
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1162 case SHN_FN_DIFF1:
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1163 for(i = 0; i < shn->blocksize; i++)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1164 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1165 if (!var_get(resn, shn, rw, &cbuffer[i]))
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1166 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1167 sample->flags |= SOUND_SAMPLEFLAG_ERROR;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1168 return(retval);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1169 } /* if */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1170 cbuffer[i] += cbuffer[i - 1];
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1171 } /* for */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1172 break;
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1173
101
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1174 case SHN_FN_DIFF2:
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1175 for (i = 0; i < shn->blocksize; i++)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1176 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1177 if (!var_get(resn, shn, rw, &cbuffer[i]))
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1178 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1179 sample->flags |= SOUND_SAMPLEFLAG_ERROR;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1180 return(retval);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1181 } /* if */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1182 cbuffer[i] += (2 * cbuffer[i-1] - cbuffer[i-2]);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1183 } /* for */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1184 break;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1185
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1186 case SHN_FN_DIFF3:
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1187 for (i = 0; i < shn->blocksize; i++)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1188 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1189 if (!var_get(resn, shn, rw, &cbuffer[i]))
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1190 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1191 sample->flags |= SOUND_SAMPLEFLAG_ERROR;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1192 return(retval);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1193 } /* if */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1194 cbuffer[i] += 3 * (cbuffer[i - 1] - cbuffer[i - 2]) + cbuffer[i - 3];
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1195 } /* for */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1196 break;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1197
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1198 case SHN_FN_QLPC:
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1199 if (!uvar_get(SHN_LPCQSIZE, shn, rw, &nlpc))
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1200 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1201 sample->flags |= SOUND_SAMPLEFLAG_ERROR;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1202 return(retval);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1203 } /* if */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1204
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1205 for(i = 0; i < nlpc; i++)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1206 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1207 if (!var_get(SHN_LPCQUANT, shn, rw, &shn->qlpc[i]))
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1208 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1209 sample->flags |= SOUND_SAMPLEFLAG_ERROR;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1210 return(retval);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1211 } /* if */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1212 } /* for */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1213
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1214 for(i = 0; i < nlpc; i++)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1215 cbuffer[i - nlpc] -= coffset;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1216
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1217 for(i = 0; i < shn->blocksize; i++)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1218 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1219 Sint32 sum = shn->lpcqoffset;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1220
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1221 for(j = 0; j < nlpc; j++)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1222 sum += shn->qlpc[j] * cbuffer[i - j - 1];
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1223
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1224 if (!var_get(resn, shn, rw, &cbuffer[i]))
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1225 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1226 sample->flags |= SOUND_SAMPLEFLAG_ERROR;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1227 return(retval);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1228 } /* if */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1229 cbuffer[i] += (sum >> SHN_LPCQUANT);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1230 } /* for */
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1231
101
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1232 if (coffset != 0)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1233 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1234 for(i = 0; i < shn->blocksize; i++)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1235 cbuffer[i] += coffset;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1236 } /* if */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1237
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1238 break;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1239 } /* switch */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1240
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1241 /* store mean value if appropriate : N.B. Duplicated code */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1242 if (shn->nmean > 0)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1243 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1244 Sint32 sum = (shn->version < 2) ? 0 : shn->blocksize / 2;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1245 for (i = 0; i < shn->blocksize; i++)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1246 sum += cbuffer[i];
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1247
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1248 for(i = 1; i < shn->nmean; i++)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1249 shn->offset[chan][i - 1] = shn->offset[chan][i];
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1250
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1251 if (shn->version < 2)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1252 shn->offset[chan][shn->nmean - 1] = sum / shn->blocksize;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1253 else
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1254 shn->offset[chan][shn->nmean - 1] = (sum / shn->blocksize) << shn->bitshift;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1255 } /* if */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1256
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1257 /* do the wrap */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1258 for(i = -shn->nwrap; i < 0; i++)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1259 cbuffer[i] = cbuffer[i + shn->blocksize];
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1260
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1261 fix_bitshift(cbuffer, shn->blocksize, shn->bitshift, shn->datatype);
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1262
101
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1263 if (chan == shn->nchan - 1)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1264 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1265 retval += put_to_buffers(sample, retval);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1266 if (sample->flags & SOUND_SAMPLEFLAG_ERROR)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1267 return(retval);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1268 } /* if */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1269
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1270 chan = (chan + 1) % shn->nchan;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1271 break;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1272 } /* case */
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1273
101
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1274 case SHN_FN_BLOCKSIZE:
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1275 if (!uint_get((int) (log((double) shn->blocksize) / M_LN2),
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1276 shn, rw, &shn->blocksize))
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1277 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1278 sample->flags |= SOUND_SAMPLEFLAG_ERROR;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1279 return(retval);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1280 } /* if */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1281 break;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1282
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1283 case SHN_FN_BITSHIFT:
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1284 if (!uvar_get(SHN_BITSHIFTSIZE, shn, rw, &shn->bitshift))
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1285 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1286 sample->flags |= SOUND_SAMPLEFLAG_ERROR;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1287 return(retval);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1288 } /* if */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1289 break;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1290
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1291 case SHN_FN_VERBATIM:
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1292 default:
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1293 sample->flags |= SOUND_SAMPLEFLAG_ERROR;
387
fb519e6028e3 Changed all the Sound_SetError() calls to __Sound_SetError (or BAIL*_MACRO)
Ryan C. Gordon <icculus@icculus.org>
parents: 377
diff changeset
1294 BAIL_MACRO("SHN: Unhandled function.", retval);
101
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1295 } /* switch */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1296 } /* while */
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1297
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1298 return(retval);
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1299 } /* SHN_read */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1300
221
c9772a9f5271 Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents: 212
diff changeset
1301
c9772a9f5271 Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents: 212
diff changeset
1302 static int SHN_rewind(Sound_Sample *sample)
c9772a9f5271 Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents: 212
diff changeset
1303 {
233
15a3b1a1291c Kludged implementation of the rewind method.
Ryan C. Gordon <icculus@icculus.org>
parents: 221
diff changeset
1304 Sound_SampleInternal *internal = (Sound_SampleInternal *) sample->opaque;
15a3b1a1291c Kludged implementation of the rewind method.
Ryan C. Gordon <icculus@icculus.org>
parents: 221
diff changeset
1305 shn_t *shn = (shn_t *) internal->decoder_private;
15a3b1a1291c Kludged implementation of the rewind method.
Ryan C. Gordon <icculus@icculus.org>
parents: 221
diff changeset
1306
15a3b1a1291c Kludged implementation of the rewind method.
Ryan C. Gordon <icculus@icculus.org>
parents: 221
diff changeset
1307 #if 0
15a3b1a1291c Kludged implementation of the rewind method.
Ryan C. Gordon <icculus@icculus.org>
parents: 221
diff changeset
1308 int rc = SDL_RWseek(internal->rw, shn->start_pos, SEEK_SET);
15a3b1a1291c Kludged implementation of the rewind method.
Ryan C. Gordon <icculus@icculus.org>
parents: 221
diff changeset
1309 BAIL_IF_MACRO(rc != shn->start_pos, ERR_IO_ERROR, 0);
15a3b1a1291c Kludged implementation of the rewind method.
Ryan C. Gordon <icculus@icculus.org>
parents: 221
diff changeset
1310 /* !!! FIXME: set state. */
15a3b1a1291c Kludged implementation of the rewind method.
Ryan C. Gordon <icculus@icculus.org>
parents: 221
diff changeset
1311 return(1);
15a3b1a1291c Kludged implementation of the rewind method.
Ryan C. Gordon <icculus@icculus.org>
parents: 221
diff changeset
1312 #else
15a3b1a1291c Kludged implementation of the rewind method.
Ryan C. Gordon <icculus@icculus.org>
parents: 221
diff changeset
1313 /*
15a3b1a1291c Kludged implementation of the rewind method.
Ryan C. Gordon <icculus@icculus.org>
parents: 221
diff changeset
1314 * !!! FIXME: This is really unacceptable; state should be reset and
15a3b1a1291c Kludged implementation of the rewind method.
Ryan C. Gordon <icculus@icculus.org>
parents: 221
diff changeset
1315 * !!! FIXME: the RWops should be pointed to the start of the data
15a3b1a1291c Kludged implementation of the rewind method.
Ryan C. Gordon <icculus@icculus.org>
parents: 221
diff changeset
1316 * !!! FIXME: to decode. The below kludge adds unneeded overhead and
15a3b1a1291c Kludged implementation of the rewind method.
Ryan C. Gordon <icculus@icculus.org>
parents: 221
diff changeset
1317 * !!! FIXME: risk of failure.
15a3b1a1291c Kludged implementation of the rewind method.
Ryan C. Gordon <icculus@icculus.org>
parents: 221
diff changeset
1318 */
15a3b1a1291c Kludged implementation of the rewind method.
Ryan C. Gordon <icculus@icculus.org>
parents: 221
diff changeset
1319 BAIL_IF_MACRO(SDL_RWseek(internal->rw, 0, SEEK_SET) != 0, ERR_IO_ERROR, 0);
15a3b1a1291c Kludged implementation of the rewind method.
Ryan C. Gordon <icculus@icculus.org>
parents: 221
diff changeset
1320 SHN_close(sample);
15a3b1a1291c Kludged implementation of the rewind method.
Ryan C. Gordon <icculus@icculus.org>
parents: 221
diff changeset
1321 return(SHN_open(sample, "SHN"));
15a3b1a1291c Kludged implementation of the rewind method.
Ryan C. Gordon <icculus@icculus.org>
parents: 221
diff changeset
1322 #endif
221
c9772a9f5271 Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents: 212
diff changeset
1323 } /* SHN_rewind */
c9772a9f5271 Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents: 212
diff changeset
1324
306
c97be6e1bd27 Added framework for Sound_Seek() support.
Ryan C. Gordon <icculus@icculus.org>
parents: 301
diff changeset
1325
c97be6e1bd27 Added framework for Sound_Seek() support.
Ryan C. Gordon <icculus@icculus.org>
parents: 301
diff changeset
1326 static int SHN_seek(Sound_Sample *sample, Uint32 ms)
c97be6e1bd27 Added framework for Sound_Seek() support.
Ryan C. Gordon <icculus@icculus.org>
parents: 301
diff changeset
1327 {
351
069ce624d6cf FIXME cleanup.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
1328 BAIL_MACRO("SHN: Seeking not implemented", 0);
306
c97be6e1bd27 Added framework for Sound_Seek() support.
Ryan C. Gordon <icculus@icculus.org>
parents: 301
diff changeset
1329 } /* SHN_seek */
c97be6e1bd27 Added framework for Sound_Seek() support.
Ryan C. Gordon <icculus@icculus.org>
parents: 301
diff changeset
1330
c97be6e1bd27 Added framework for Sound_Seek() support.
Ryan C. Gordon <icculus@icculus.org>
parents: 301
diff changeset
1331
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1332 #endif /* defined SOUND_SUPPORTS_SHN */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1333
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1334 /* end of shn.c ... */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1335