annotate decoders/shn.c @ 126:8a5a1c61d3c6

Fix for MS Visual C.
author Ryan C. Gordon <icculus@icculus.org>
date Tue, 09 Oct 2001 16:44:05 +0000
parents dd95a12539fd
children 1df5c106504e
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
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
24 * SHNs are popular in online music trading communities, they tend to be
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
25 * much bigger than MP3s. If an MP3 crunches the waveform to 10-20 percent
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
26 * of its original size, SHNs only go to about 50-60%. Why do the Phish fans
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
27 * of the world use this format then? Rabid music traders appreciate the
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
28 * sound quality; SHNs, unlike MP3s, do not throw away any part of the
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
29 * waveform. Yes, there are people that notice this, and further more, they
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
30 * demand it...and if they can't get a good transfer of those larger files
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
31 * over the 'net, they haven't underestimated the bandwidth of CDs travelling
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
32 * the world through the postal system.
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 *
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
39 * Please see the file LICENSE in the source's root directory.
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 #include <assert.h>
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
54
106
40de367eb59e Changing my include structure to do this right.
Ryan C. Gordon <icculus@icculus.org>
parents: 104
diff changeset
55 #include "SDL_sound.h"
40de367eb59e Changing my include structure to do this right.
Ryan C. Gordon <icculus@icculus.org>
parents: 104
diff changeset
56
40de367eb59e Changing my include structure to do this right.
Ryan C. Gordon <icculus@icculus.org>
parents: 104
diff changeset
57 #define __SDL_SOUND_INTERNAL__
40de367eb59e Changing my include structure to do this right.
Ryan C. Gordon <icculus@icculus.org>
parents: 104
diff changeset
58 #include "SDL_sound_internal.h"
40de367eb59e Changing my include structure to do this right.
Ryan C. Gordon <icculus@icculus.org>
parents: 104
diff changeset
59
126
8a5a1c61d3c6 Fix for MS Visual C.
Ryan C. Gordon <icculus@icculus.org>
parents: 114
diff changeset
60 #ifdef _MSC_VER
8a5a1c61d3c6 Fix for MS Visual C.
Ryan C. Gordon <icculus@icculus.org>
parents: 114
diff changeset
61 # define inline __inline
8a5a1c61d3c6 Fix for MS Visual C.
Ryan C. Gordon <icculus@icculus.org>
parents: 114
diff changeset
62 #endif
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
63
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
64 static int SHN_init(void);
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
65 static void SHN_quit(void);
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
66 static int SHN_open(Sound_Sample *sample, const char *ext);
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
67 static void SHN_close(Sound_Sample *sample);
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
68 static Uint32 SHN_read(Sound_Sample *sample);
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 const Sound_DecoderFunctions __Sound_DecoderFunctions_SHN =
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
71 {
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
72 {
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
73 "SHN",
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
74 "Shorten-compressed audio data",
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
75 "Ryan C. Gordon <icculus@clutteredmind.org>",
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
76 "http://www.icculus.org/SDL_sound/"
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
77 },
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
78
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
79 SHN_init, /* init() method */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
80 SHN_quit, /* quit() method */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
81 SHN_open, /* open() method */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
82 SHN_close, /* close() method */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
83 SHN_read /* read() method */
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;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
111 } 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
112
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 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
115 {
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 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
117 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
118 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
119 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
120 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
121 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
122 };
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 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
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,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
127 {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
128 {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
129 {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
130 {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
131 {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
132 {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
133 {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
134 {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
135 {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
136 {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
137 {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
138 {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
139 };
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 #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
143 #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
144 #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
145
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 #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
147 #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
148 #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
149
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 #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
151 #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
152
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 #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
154 #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
155 #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
156 #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
157
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 #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
159 #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
160 #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
161 #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
162 #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
163 #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
164 #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
165 #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
166 #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
167 #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
168 #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
169 #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
170
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 #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
172 #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
173
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 #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
175 #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
176 #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
177 #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
178 #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
179 #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
180 #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
181 #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
182 #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
183 #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
184
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 #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
186 #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
187 #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
188 #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
189 #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
190 #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
191 #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
192 #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
193 #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
194 #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
195 #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
196 #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
197 #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
198 #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
199 #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
200
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 #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
202 #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
203 #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
204 #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
205 #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
206 #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
207 #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
208 #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
209 #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
210 #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
211 #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
212 #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
213
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 #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
215
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 #define MAGIC_NUM 0x676B6A61 /* looks like "ajkg" as chars. */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
218
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 #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
220 #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
221 #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
222
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 #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
224 #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
225 #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
226
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 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
229 {
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 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
231 {
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 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
233 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
234 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
235 } /* 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
236
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 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
238 {
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 *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
240 (((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
241 (((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
242 (((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
243 } /* 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
244
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 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
246 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
247
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 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
249 } /* 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
250
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 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
253 {
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 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
255
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 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
257 {
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 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
259 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
260 } /* 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
261
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 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
263 {
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 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
265 {
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 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
267 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
268 } /* 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
269 } /* 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
270
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 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
272 {
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 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
274 {
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 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
276 ((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
277 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
278 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
279 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
280 } /* 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
281 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
282 {
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 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
284 (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
285 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
286 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
287 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
288 } /* 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
289 } /* 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
290
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 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
292 *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
293
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 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
295 } /* 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
296
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 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
299 {
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 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
301
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 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
303 *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
304 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
305 *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
306
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 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
308 } /* 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
309
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 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
312 {
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 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
314 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
315 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
316 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
317
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 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
319 *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
320
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 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
322 } /* 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
323
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 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
326 {
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 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
328 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
329 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
330 } /* 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
331
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
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
333 static int SHN_init(void)
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
334 {
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
335 return(1); /* initialization always successful. */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
336 } /* SHN_init */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
337
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 static void SHN_quit(void)
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
340 {
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
341 /* it's a no-op. */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
342 } /* SHN_quit */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
343
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 * 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
347 * 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
348 */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
349 static inline int extended_shn_magic_search(Sound_Sample *sample)
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
350 {
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
351 SDL_RWops *rw = ((Sound_SampleInternal *) sample->opaque)->rw;
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
352 Uint32 word = 0;
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
353 Uint8 ch;
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
354
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
355 while (1)
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
356 {
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
357 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
358 word = ((word << 8) & 0xFFFFFF00) | ch;
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
359 if (SDL_SwapBE32(word) == MAGIC_NUM)
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
360 {
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
361 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
362 return((int) ch);
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
363 } /* if */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
364 } /* while */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
365
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
366 return((int) ch);
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
367 } /* extended_shn_magic_search */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
368
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 /* 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
371 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
372 {
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
373 SDL_RWops *rw = ((Sound_SampleInternal *) sample->opaque)->rw;
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
374 Uint32 magic;
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
375 Uint8 ch;
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
376
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 * 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
379 * 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
380 * 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
381 * happen to pass through here. If the extension is explicitly "SHN", we
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
382 * check the whole stream, though.
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
383 */
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 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
386 return(extended_shn_magic_search(sample));
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
387
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
388 BAIL_IF_MACRO(SDL_RWread(rw, &magic, sizeof (magic), 1) != 1, NULL, -1);
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
389 BAIL_IF_MACRO(SDL_SwapLE32(magic) != MAGIC_NUM, "SHN: Not a SHN file", -1);
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
390 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
391 BAIL_IF_MACRO(ch > 3, "SHN: Unsupported file version", -1);
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
392
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
393 return((int) ch);
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
394 } /* determine_shn_version */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
395
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
396
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
397 static int init_shn_offset(Sint32 **offset, int nchan, int nblock, int 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
398 {
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 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
400 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
401
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 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
403 {
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 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
405 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
406 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
407 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
408 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
409 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
410 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
411 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
412 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
413 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
414 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
415 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
416 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
417 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
418 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
419 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
420 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
421 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
422 BAIL_MACRO("SHN: unknown file type", 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
423 } /* 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
424
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 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
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 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
428 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
429 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
430 } /* 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
431 } /* 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
432
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
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 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
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 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
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 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
439 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
440
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 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
442 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
443 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
444 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
445 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
446 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
447 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
448
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 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
450 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
451
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 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
453 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
454
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 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
456 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
457
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 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
459 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
460 } /* 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
461
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 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
463 } /* 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
464
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
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 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
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 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
469 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
470 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
471
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 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
473 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
474 {
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 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
476 } /* 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
477
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 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
479 } /* 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
480
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
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 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
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 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
485 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
486
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 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
488 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
489 {
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 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
491 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
492 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
493 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
494 } /* 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
495
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 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
497 } /* 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
498
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 #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
500 #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
501 #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
502 #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
503
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 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
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 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
507 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
508 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
509
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 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
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 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
513 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
514 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
515 } /* 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
516
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 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
518 *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
519
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 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
521 } /* 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
522
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
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 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
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 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
527 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
528 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
529
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 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
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 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
533 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
534 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
535 } /* 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
536
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 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
538 *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
539
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 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
541 } /* 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
542
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
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 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
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 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
547 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
548 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
549 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
550 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
551
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 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
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(!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
555 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
556 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
557
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); /* 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
559 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
560
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(!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
562 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
563
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(!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
565 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
566 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
567 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
568 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
569 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
570
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 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
572 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
573 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
574
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_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
576 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
577 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
578
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 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
580 } /* 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
581
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
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
583 static int SHN_open(Sound_Sample *sample, const char *ext)
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
584 {
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
585 Sound_SampleInternal *internal = (Sound_SampleInternal *) sample->opaque;
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
586 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
587 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
588 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
589 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
590 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
591
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 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
593 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
594 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
595 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
596 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
597 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
598 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
599 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
600
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 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
602 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
603 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
604
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 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
606 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
607 {
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 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
609 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
610 } /* 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
611
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 (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
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 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
615 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
616 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
617 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
618 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
619 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
620 } /* 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
621
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 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
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 /* 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
625 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
626 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
627
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 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
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 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
631 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
632 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
633 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
634 } /* for */
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
635
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
636 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
637 {
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 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
639 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
640 {
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 Sound_SetError(ERR_OUT_OF_MEMORY);
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 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
643 } /* 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
644 } /* 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
645
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 (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
647 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
648
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 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
650 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
651
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 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
653 (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
654 (!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
655 {
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 if (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
657 Sound_SetError("SHN: Expected VERBATIM function");
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
658
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
659 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
660 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
661 } /* 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
662
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 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
664 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
665 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
666 Sound_SetError(ERR_OUT_OF_MEMORY);
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 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
668 } /* 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
669
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
670 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
671 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
672
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 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
674 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
675 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
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 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
678 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
679 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
680 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
681 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
682 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
683 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
684 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
685 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
686
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 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
688 } /* SHN_open */
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
689
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
690
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
691 void fix_bitshift(Sint32 *buffer, int nitem, int bitshift, int 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
692 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
693 int i;
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
694
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
695 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
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 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
698 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
699 } /* 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
700 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
701 {
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 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
703 {
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 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
705 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
706 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
707 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
708 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
709 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
710 } /* 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
711 } /* 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
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 {
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 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
715 {
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 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
717 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
718 } /* 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
719 } /* 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
720 } /* fix_bitshift */
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
721
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
722
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
723 static void SHN_close(Sound_Sample *sample)
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
724 {
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
725 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
726 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
727
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
728 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
729 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
730
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 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
732 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
733
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 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
735 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
736
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 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
738 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
739
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 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
741 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
742
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 free(shn);
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
744 } /* SHN_close */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
745
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
746
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
747 /* 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
748
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
749 /* 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
750 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
751 {
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 ** 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
754 **
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 ** 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
756 ** 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
757 ** 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
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 ** 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
760 ** 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
761 ** 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
762 ** 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
763 ** 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
764 ** 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
765 ** 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
766 ** 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
767 ** 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
768 **
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 ** 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
770 ** 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
771 */
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 #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
774 #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
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 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
777 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
778 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
779 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
780 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
781 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
782 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
783 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
784 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
785 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
786 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
787 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
788 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
789 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
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
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 /* 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
796 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
797 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
798 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
799 {
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 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
801 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
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 /* 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
805 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
806 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
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 /* 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
809 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
810 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
811 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
812 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
813
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 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
815 } /* 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
816
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 /* 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
819 #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
820 #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
821 #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
822
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
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 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
825 {
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 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
827 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
828 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
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 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
831 };
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
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 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
834 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
835 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
836 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
837 {
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 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
839 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
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 /* 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
843 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
844
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 /* 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
846 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
847 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
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 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
850 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
851 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
852 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
853 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
854
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 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
856 } /* 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
857
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 /* 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
860 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
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 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
863 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
864 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
865 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
866 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
867 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
868 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
869
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 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
871
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 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
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 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
875 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
876 {
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 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
878 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
879 } /* 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
880 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
881 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
882 } /* 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
883
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 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
885 {
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 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
887 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
888 {
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 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
890 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
891 {
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 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
893 *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
894 } /* 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
895 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
896 {
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 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
898 {
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 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
900 *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
901 } /* 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
902 } /* 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
903 } /* 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
904 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
905
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 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
907 {
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 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
909 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
910 {
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 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
912 *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
913 } /* 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
914 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
915 {
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 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
917 {
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 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
919 *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
920 } /* 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
921 } /* 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
922 } /* 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
923 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
924
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 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
926 {
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 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
928 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
929 {
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 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
931 *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
932 } /* 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
933 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
934 {
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 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
936 {
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 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
938 *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
939 } /* 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
940 } /* 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
941 } /* 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
942 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
943
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 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
945 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
946 {
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 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
948 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
949 {
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 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
951 *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
952 } /* 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
953 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
954 {
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 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
956 {
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 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
958 *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
959 } /* 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
960 } /* 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
961 } /* 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
962 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
963
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 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
965 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
966 {
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 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
968 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
969 {
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 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
971 *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
972 } /* 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
973 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
974 {
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 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
976 {
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 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
978 *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
979 } /* 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
980 } /* 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
981 } /* 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
982 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
983
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 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
985 {
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 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
987 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
988 {
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 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
990 *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
991 } /* 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
992 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
993 {
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 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
995 {
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 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
997 *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
998 } /* 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
999 } /* 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
1000 } /* 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
1001 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
1002
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 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
1004 {
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 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
1006 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
1007 {
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 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
1009 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
1010 *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
1011 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
1012 *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
1013 } /* 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
1014 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
1015 {
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 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
1017 {
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 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
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 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
1021 *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
1022 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
1023 *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
1024 } /* 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
1025 } /* 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
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 } /* 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
1028 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
1029
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 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
1031 {
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 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
1033 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
1034 {
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 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
1036 *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
1037 } /* 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
1038 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
1039 {
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 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
1041 {
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 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
1043 *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
1044 } /* 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
1045 }/* 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
1046 } /* 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
1047 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
1048 } /* 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
1049
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 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
1051 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
1052 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
1053 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
1054 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
1055 } /* 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
1056
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
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 #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
1059
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1060 static Uint32 SHN_read(Sound_Sample *sample)
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1061 {
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
1062 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
1063 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
1064 Uint32 cpyBytes = 0;
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1065 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
1066 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
1067 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
1068 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
1069
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 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
1071
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 /* 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
1073 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
1074 {
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 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
1076 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
1077 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
1078 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
1079 } /* 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
1080
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 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
1082
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 /* 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
1084 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
1085 {
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 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
1087 {
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 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
1089 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
1090 } /* 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
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 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
1093 {
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 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
1095 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
1096 } /* 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
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 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
1099 {
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 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
1101 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
1102 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
1103 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
1104 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
1105 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
1106 {
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 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
1108 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
1109 Sint32 resn = 0, nlpc, j;
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1110
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
1111 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
1112 {
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 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
1114 {
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 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
1116 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
1117 } /* 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
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 /* 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
1120 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
1121 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
1122 } /* 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
1123
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 /* 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
1125 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
1126 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
1127 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
1128 {
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 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
1130 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
1131 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
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 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
1134 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
1135 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
1136 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
1137 } /* else */
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1138
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
1139 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
1140 {
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 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
1142 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
1143 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
1144 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
1145
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 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
1147 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
1148 {
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 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
1150 {
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 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
1152 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
1153 } /* 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
1154 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
1155 } /* 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
1156 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
1157
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 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
1159 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
1160 {
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 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
1162 {
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 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
1164 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
1165 } /* 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
1166 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
1167 } /* 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
1168 break;
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1169
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
1170 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
1171 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
1172 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1173 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
1174 {
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 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
1176 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
1177 } /* 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
1178 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
1179 } /* 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
1180 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
1181
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 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
1183 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
1184 {
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 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
1186 {
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 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
1188 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
1189 } /* 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
1190 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
1191 } /* 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
1192 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
1193
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 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
1195 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
1196 {
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 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
1198 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
1199 } /* 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
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 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
1202 {
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 (!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
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 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
1206 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
1207 } /* 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
1208 } /* 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
1209
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 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
1211 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
1212
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 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
1214 {
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 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
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(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
1218 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
1219
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 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
1221 {
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 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
1223 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
1224 } /* 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
1225 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
1226 } /* for */
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1227
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
1228 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
1229 {
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(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
1231 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
1232 } /* 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
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 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
1235 } /* 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
1236
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 /* 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
1238 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
1239 {
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 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
1241 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
1242 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
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 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
1245 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
1246
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 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
1248 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
1249 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
1250 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
1251 } /* 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
1252
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 /* 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
1254 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
1255 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
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 fix_bitshift(cbuffer, shn->blocksize, shn->bitshift, shn->datatype);
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1258
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
1259 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
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 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
1262 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
1263 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
1264 } /* 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
1265
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 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
1267 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
1268 } /* case */
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1269
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
1270 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
1271 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
1272 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
1273 {
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 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
1275 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
1276 } /* 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
1277 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
1278
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 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
1280 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
1281 {
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 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
1283 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
1284 } /* 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
1285 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
1286
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 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
1288 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
1289 Sound_SetError("SHN: Unhandled function.");
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 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
1291 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
1292 } /* 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
1293 } /* while */
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1294
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1295 return(retval);
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1296 } /* SHN_read */
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 #endif /* defined SOUND_SUPPORTS_SHN */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1299
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1300 /* end of shn.c ... */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1301