annotate decoders/shn.c @ 161:0f958979b1dd

Updated my intro comments.
author Ryan C. Gordon <icculus@icculus.org>
date Fri, 09 Nov 2001 23:57:23 +0000
parents 1df5c106504e
children 47cc2de2ae36
rev   line source
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1 /*
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
2 * SDL_sound -- An abstract sound format decoding API.
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
3 * Copyright (C) 2001 Ryan C. Gordon.
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
4 *
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
5 * This library is free software; you can redistribute it and/or
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
6 * modify it under the terms of the GNU Lesser General Public
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
7 * License as published by the Free Software Foundation; either
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
8 * version 2.1 of the License, or (at your option) any later version.
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
9 *
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
10 * This library is distributed in the hope that it will be useful,
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
13 * Lesser General Public License for more details.
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
14 *
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
15 * You should have received a copy of the GNU Lesser General Public
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
16 * License along with this library; if not, write to the Free Software
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
18 */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
19
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
20 /*
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
21 * Shorten decoder for SDL_sound.
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
22 *
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
23 * This driver handles Shorten-compressed waveforms. Despite the fact that
161
0f958979b1dd Updated my intro comments.
Ryan C. Gordon <icculus@icculus.org>
parents: 149
diff changeset
24 * SHNs tend to be much bigger than MP3s, they are still the de facto
0f958979b1dd Updated my intro comments.
Ryan C. Gordon <icculus@icculus.org>
parents: 149
diff changeset
25 * standard in online music trading communities. If an MP3 crunches the
0f958979b1dd Updated my intro comments.
Ryan C. Gordon <icculus@icculus.org>
parents: 149
diff changeset
26 * waveform to 10-20 percent of its original size, SHNs only go to about
0f958979b1dd Updated my intro comments.
Ryan C. Gordon <icculus@icculus.org>
parents: 149
diff changeset
27 * 50-60%. Why do the Phish fans of the world use this format then? Rabid
0f958979b1dd Updated my intro comments.
Ryan C. Gordon <icculus@icculus.org>
parents: 149
diff changeset
28 * music traders appreciate the sound quality; SHNs, unlike MP3s, do not
0f958979b1dd Updated my intro comments.
Ryan C. Gordon <icculus@icculus.org>
parents: 149
diff changeset
29 * throw away any part of the waveform. Yes, there are people that notice
0f958979b1dd Updated my intro comments.
Ryan C. Gordon <icculus@icculus.org>
parents: 149
diff changeset
30 * this, and further more, they demand it...and if they can't get a good
0f958979b1dd Updated my intro comments.
Ryan C. Gordon <icculus@icculus.org>
parents: 149
diff changeset
31 * transfer of those larger files over the 'net, they haven't underestimated
0f958979b1dd Updated my intro comments.
Ryan C. Gordon <icculus@icculus.org>
parents: 149
diff changeset
32 * the bandwidth of CDs travelling the world through the postal system.
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
33 *
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
34 * Shorten homepage: http://www.softsound.com/Shorten.html
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
35 *
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
36 * The Shorten format was gleaned from the shorten codebase, by Tony
101
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
37 * Robinson and SoftSound Limited.
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
38 *
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
149
1df5c106504e Decoders can now list multiple file extensions.
Ryan C. Gordon <icculus@icculus.org>
parents: 126
diff changeset
70 static const char *extensions_shn[] = { "SHN", NULL };
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
71 const Sound_DecoderFunctions __Sound_DecoderFunctions_SHN =
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 {
149
1df5c106504e Decoders can now list multiple file extensions.
Ryan C. Gordon <icculus@icculus.org>
parents: 126
diff changeset
74 extensions_shn,
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
75 "Shorten-compressed audio data",
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
76 "Ryan C. Gordon <icculus@clutteredmind.org>",
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
77 "http://www.icculus.org/SDL_sound/"
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
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
80 SHN_init, /* init() method */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
81 SHN_quit, /* quit() method */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
82 SHN_open, /* open() method */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
83 SHN_close, /* close() method */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
84 SHN_read /* read() method */
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
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
87
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
88 #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
89
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 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
91 {
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 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
93 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
94 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
95 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
96 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
97 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
98 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
99 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
100 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
101 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
102 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
103 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
104 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
105 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
106 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
107 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
108 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
109 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
110 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
111 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
112 } shn_t;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
113
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
114
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
115 static const Uint32 mask_table[] =
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
116 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
117 0x00000000, 0x00000001, 0x00000003, 0x00000007, 0x0000000F, 0x0000001F,
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
118 0x0000003F, 0x0000007F, 0x000000FF, 0x000001FF, 0x000003FF, 0x000007FF,
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
119 0x00000FFF, 0x00001FFF, 0x00003FFF, 0x00007FFF, 0x0000FFFF, 0x0001FFFF,
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
120 0x0003FFFF, 0x0007FFFF, 0x000FFFFF, 0x001FFFFF, 0x003FFFFF, 0x007FFFFF,
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
121 0x00FFFFFF, 0x01FFFFFF, 0x03FFFFFF, 0x07FFFFFF, 0x0FFFFFFF, 0x1FFFFFFF,
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
122 0x3FFFFFFF, 0x7FFFFFFF, 0xFFFFFFFF
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
123 };
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
124
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
125
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
126 static const Uint8 ulaw_outward[13][256] = {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
127 {127,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,255,254,253,252,251,250,249,248,247,246,245,244,243,242,241,240,239,238,237,236,235,234,233,232,231,230,229,228,227,226,225,224,223,222,221,220,219,218,217,216,215,214,213,212,211,210,209,208,207,206,205,204,203,202,201,200,199,198,197,196,195,194,193,192,191,190,189,188,187,186,185,184,183,182,181,180,179,178,177,176,175,174,173,172,171,170,169,168,167,166,165,164,163,162,161,160,159,158,157,156,155,154,153,152,151,150,149,148,147,146,145,144,143,142,141,140,139,138,137,136,135,134,133,132,131,130,129,128},
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
128 {112,114,116,118,120,122,124,126,127,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,113,115,117,119,121,123,125,255,253,251,249,247,245,243,241,239,238,237,236,235,234,233,232,231,230,229,228,227,226,225,224,223,222,221,220,219,218,217,216,215,214,213,212,211,210,209,208,207,206,205,204,203,202,201,200,199,198,197,196,195,194,193,192,191,190,189,188,187,186,185,184,183,182,181,180,179,178,177,176,175,174,173,172,171,170,169,168,167,166,165,164,163,162,161,160,159,158,157,156,155,154,153,152,151,150,149,148,147,146,145,144,143,142,141,140,139,138,137,136,135,134,133,132,131,130,129,128,254,252,250,248,246,244,242,240},
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
129 {96,98,100,102,104,106,108,110,112,113,114,116,117,118,120,121,122,124,125,126,127,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,97,99,101,103,105,107,109,111,115,119,123,255,251,247,243,239,237,235,233,231,229,227,225,223,222,221,220,219,218,217,216,215,214,213,212,211,210,209,208,207,206,205,204,203,202,201,200,199,198,197,196,195,194,193,192,191,190,189,188,187,186,185,184,183,182,181,180,179,178,177,176,175,174,173,172,171,170,169,168,167,166,165,164,163,162,161,160,159,158,157,156,155,154,153,152,151,150,149,148,147,146,145,144,143,142,141,140,139,138,137,136,135,134,133,132,131,130,129,128,254,253,252,250,249,248,246,245,244,242,241,240,238,236,234,232,230,228,226,224},
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
130 {80,82,84,86,88,90,92,94,96,97,98,100,101,102,104,105,106,108,109,110,112,113,114,115,116,117,118,120,121,122,123,124,125,126,127,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,81,83,85,87,89,91,93,95,99,103,107,111,119,255,247,239,235,231,227,223,221,219,217,215,213,211,209,207,206,205,204,203,202,201,200,199,198,197,196,195,194,193,192,191,190,189,188,187,186,185,184,183,182,181,180,179,178,177,176,175,174,173,172,171,170,169,168,167,166,165,164,163,162,161,160,159,158,157,156,155,154,153,152,151,150,149,148,147,146,145,144,143,142,141,140,139,138,137,136,135,134,133,132,131,130,129,128,254,253,252,251,250,249,248,246,245,244,243,242,241,240,238,237,236,234,233,232,230,229,228,226,225,224,222,220,218,216,214,212,210,208},
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
131 {64,66,68,70,72,74,76,78,80,81,82,84,85,86,88,89,90,92,93,94,96,97,98,99,100,101,102,104,105,106,107,108,109,110,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,65,67,69,71,73,75,77,79,83,87,91,95,103,111,255,239,231,223,219,215,211,207,205,203,201,199,197,195,193,191,190,189,188,187,186,185,184,183,182,181,180,179,178,177,176,175,174,173,172,171,170,169,168,167,166,165,164,163,162,161,160,159,158,157,156,155,154,153,152,151,150,149,148,147,146,145,144,143,142,141,140,139,138,137,136,135,134,133,132,131,130,129,128,254,253,252,251,250,249,248,247,246,245,244,243,242,241,240,238,237,236,235,234,233,232,230,229,228,227,226,225,224,222,221,220,218,217,216,214,213,212,210,209,208,206,204,202,200,198,196,194,192},
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
132 {49,51,53,55,57,59,61,63,64,66,67,68,70,71,72,74,75,76,78,79,80,81,82,84,85,86,87,88,89,90,92,93,94,95,96,97,98,99,100,101,102,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,50,52,54,56,58,60,62,65,69,73,77,83,91,103,255,231,219,211,205,201,197,193,190,188,186,184,182,180,178,176,175,174,173,172,171,170,169,168,167,166,165,164,163,162,161,160,159,158,157,156,155,154,153,152,151,150,149,148,147,146,145,144,143,142,141,140,139,138,137,136,135,134,133,132,131,130,129,128,254,253,252,251,250,249,248,247,246,245,244,243,242,241,240,239,238,237,236,235,234,233,232,230,229,228,227,226,225,224,223,222,221,220,218,217,216,215,214,213,212,210,209,208,207,206,204,203,202,200,199,198,196,195,194,192,191,189,187,185,183,181,179,177},
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
133 {32,34,36,38,40,42,44,46,48,49,51,52,53,55,56,57,59,60,61,63,64,65,66,67,68,70,71,72,73,74,75,76,78,79,80,81,82,83,84,85,86,87,88,89,90,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,33,35,37,39,41,43,45,47,50,54,58,62,69,77,91,255,219,205,197,190,186,182,178,175,173,171,169,167,165,163,161,159,158,157,156,155,154,153,152,151,150,149,148,147,146,145,144,143,142,141,140,139,138,137,136,135,134,133,132,131,130,129,128,254,253,252,251,250,249,248,247,246,245,244,243,242,241,240,239,238,237,236,235,234,233,232,231,230,229,228,227,226,225,224,223,222,221,220,218,217,216,215,214,213,212,211,210,209,208,207,206,204,203,202,201,200,199,198,196,195,194,193,192,191,189,188,187,185,184,183,181,180,179,177,176,174,172,170,168,166,164,162,160},
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
134 {16,18,20,22,24,26,28,30,32,33,34,36,37,38,40,41,42,44,45,46,48,49,50,51,52,53,55,56,57,58,59,60,61,63,64,65,66,67,68,69,70,71,72,73,74,75,76,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,17,19,21,23,25,27,29,31,35,39,43,47,54,62,77,255,205,190,182,175,171,167,163,159,157,155,153,151,149,147,145,143,142,141,140,139,138,137,136,135,134,133,132,131,130,129,128,254,253,252,251,250,249,248,247,246,245,244,243,242,241,240,239,238,237,236,235,234,233,232,231,230,229,228,227,226,225,224,223,222,221,220,219,218,217,216,215,214,213,212,211,210,209,208,207,206,204,203,202,201,200,199,198,197,196,195,194,193,192,191,189,188,187,186,185,184,183,181,180,179,178,177,176,174,173,172,170,169,168,166,165,164,162,161,160,158,156,154,152,150,148,146,144},
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
135 {2,4,6,8,10,12,14,16,17,18,20,21,22,24,25,26,28,29,30,32,33,34,35,36,37,38,40,41,42,43,44,45,46,48,49,50,51,52,53,54,55,56,57,58,59,60,61,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,0,1,3,5,7,9,11,13,15,19,23,27,31,39,47,62,255,190,175,167,159,155,151,147,143,141,139,137,135,133,131,129,254,253,252,251,250,249,248,247,246,245,244,243,242,241,240,239,238,237,236,235,234,233,232,231,230,229,228,227,226,225,224,223,222,221,220,219,218,217,216,215,214,213,212,211,210,209,208,207,206,205,204,203,202,201,200,199,198,197,196,195,194,193,192,191,189,188,187,186,185,184,183,182,181,180,179,178,177,176,174,173,172,171,170,169,168,166,165,164,163,162,161,160,158,157,156,154,153,152,150,149,148,146,145,144,142,140,138,136,134,132,130,128},
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
136 {1,2,4,5,6,8,9,10,12,13,14,16,17,18,19,20,21,22,24,25,26,27,28,29,30,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,0,3,7,11,15,23,31,47,255,175,159,151,143,139,135,131,254,253,252,251,250,249,248,247,246,245,244,243,242,241,240,239,238,237,236,235,234,233,232,231,230,229,228,227,226,225,224,223,222,221,220,219,218,217,216,215,214,213,212,211,210,209,208,207,206,205,204,203,202,201,200,199,198,197,196,195,194,193,192,191,190,189,188,187,186,185,184,183,182,181,180,179,178,177,176,174,173,172,171,170,169,168,167,166,165,164,163,162,161,160,158,157,156,155,154,153,152,150,149,148,147,146,145,144,142,141,140,138,137,136,134,133,132,130,129,128},
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
137 {1,2,3,4,5,6,8,9,10,11,12,13,14,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,0,7,15,31,255,159,143,135,254,253,252,251,250,249,248,247,246,245,244,243,242,241,240,239,238,237,236,235,234,233,232,231,230,229,228,227,226,225,224,223,222,221,220,219,218,217,216,215,214,213,212,211,210,209,208,207,206,205,204,203,202,201,200,199,198,197,196,195,194,193,192,191,190,189,188,187,186,185,184,183,182,181,180,179,178,177,176,175,174,173,172,171,170,169,168,167,166,165,164,163,162,161,160,158,157,156,155,154,153,152,151,150,149,148,147,146,145,144,142,141,140,139,138,137,136,134,133,132,131,130,129,128},
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
138 {1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,0,15,255,143,254,253,252,251,250,249,248,247,246,245,244,243,242,241,240,239,238,237,236,235,234,233,232,231,230,229,228,227,226,225,224,223,222,221,220,219,218,217,216,215,214,213,212,211,210,209,208,207,206,205,204,203,202,201,200,199,198,197,196,195,194,193,192,191,190,189,188,187,186,185,184,183,182,181,180,179,178,177,176,175,174,173,172,171,170,169,168,167,166,165,164,163,162,161,160,159,158,157,156,155,154,153,152,151,150,149,148,147,146,145,144,142,141,140,139,138,137,136,135,134,133,132,131,130,129,128},
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
139 {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,0,255,254,253,252,251,250,249,248,247,246,245,244,243,242,241,240,239,238,237,236,235,234,233,232,231,230,229,228,227,226,225,224,223,222,221,220,219,218,217,216,215,214,213,212,211,210,209,208,207,206,205,204,203,202,201,200,199,198,197,196,195,194,193,192,191,190,189,188,187,186,185,184,183,182,181,180,179,178,177,176,175,174,173,172,171,170,169,168,167,166,165,164,163,162,161,160,159,158,157,156,155,154,153,152,151,150,149,148,147,146,145,144,143,142,141,140,139,138,137,136,135,134,133,132,131,130,129,128}
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
140 };
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
141
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
142
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
143 #ifndef MIN_MACRO
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
144 #define MIN_MACRO(a,b) (((a)<(b))?(a):(b))
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
145 #endif
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
146
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
147 #ifndef MAX_MACRO
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
148 #define MAX_MACRO(a,b) (((a)>(b))?(a):(b))
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
149 #endif
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
150
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
151 #define POSITIVE_ULAW_ZERO 0xff
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
152 #define NEGATIVE_ULAW_ZERO 0x7f
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
153
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
154 #define CAPMAXSCHAR(x) ((x > 127) ? 127 : x)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
155 #define CAPMAXUCHAR(x) ((x > 255) ? 255 : x)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
156 #define CAPMAXSHORT(x) ((x > 32767) ? 32767 : x)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
157 #define CAPMAXUSHORT(x) ((x > 65535) ? 65535 : x)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
158
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
159 #define UNDEFINED_UINT -1
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
160 #define DEFAULT_BLOCK_SIZE 256
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
161 #define DEFAULT_V0NMEAN 0
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
162 #define DEFAULT_V2NMEAN 4
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
163 #define DEFAULT_MAXNLPC 0
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
164 #define DEFAULT_NCHAN 1
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
165 #define DEFAULT_NSKIP 0
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
166 #define DEFAULT_NDISCARD 0
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
167 #define NBITPERLONG 32
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
168 #define DEFAULT_MINSNR 256
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
169 #define DEFAULT_QUANTERROR 0
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
170 #define MINBITRATE 2.5
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
171
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
172 #define MEAN_VERSION0 0
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
173 #define MEAN_VERSION2 4
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
174
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
175 #define SHN_FN_DIFF0 0
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
176 #define SHN_FN_DIFF1 1
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
177 #define SHN_FN_DIFF2 2
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
178 #define SHN_FN_DIFF3 3
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
179 #define SHN_FN_QUIT 4
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
180 #define SHN_FN_BLOCKSIZE 5
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
181 #define SHN_FN_BITSHIFT 6
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
182 #define SHN_FN_QLPC 7
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
183 #define SHN_FN_ZERO 8
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
184 #define SHN_FN_VERBATIM 9
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
185
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
186 #define SHN_TYPE_AU1 0
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
187 #define SHN_TYPE_S8 1
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
188 #define SHN_TYPE_U8 2
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
189 #define SHN_TYPE_S16HL 3
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
190 #define SHN_TYPE_U16HL 4
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
191 #define SHN_TYPE_S16LH 5
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
192 #define SHN_TYPE_U16LH 6
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
193 #define SHN_TYPE_ULAW 7
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
194 #define SHN_TYPE_AU2 8
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
195 #define SHN_TYPE_AU3 9
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
196 #define SHN_TYPE_ALAW 10
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
197 #define SHN_TYPE_RIFF_WAVE 11
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
198 #define SHN_TYPE_EOF 12
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
199 #define SHN_TYPE_GENERIC_ULAW 128
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
200 #define SHN_TYPE_GENERIC_ALAW 129
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
201
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
202 #define SHN_FNSIZE 2
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
203 #define SHN_CHANNELSIZE 0
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
204 #define SHN_TYPESIZE 4
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
205 #define SHN_ULONGSIZE 2
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
206 #define SHN_NSKIPSIZE 1
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
207 #define SHN_LPCQSIZE 2
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
208 #define SHN_LPCQUANT 5
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
209 #define SHN_XBYTESIZE 7
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
210 #define SHN_VERBATIM_CKSIZE_SIZE 5
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
211 #define SHN_VERBATIM_BYTE_SIZE 8
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
212 #define SHN_ENERGYSIZE 3
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
213 #define SHN_BITSHIFTSIZE 2
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
214
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
215 #define SHN_LPCQOFFSET_VER2 (1 << SHN_LPCQUANT)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
216
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
217
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 #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
219
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
220 #ifndef M_LN2
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
221 #define M_LN2 0.69314718055994530942
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
222 #endif
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
223
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
224 #ifndef M_PI
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
225 #define M_PI 3.14159265358979323846
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
226 #endif
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
227
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
228
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
229 static int word_get(shn_t *shn, SDL_RWops *rw, Uint32 *word)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
230 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
231 if (shn->nbyteget < 4)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
232 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
233 shn->nbyteget += SDL_RWread(rw, shn->getbuf, 1, SHN_BUFSIZ);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
234 BAIL_IF_MACRO(shn->nbyteget < 4, NULL, 0);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
235 shn->getbufp = shn->getbuf;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
236 } /* if */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
237
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
238 if (word != NULL)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
239 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
240 *word = (((Sint32) shn->getbufp[0]) << 24) |
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
241 (((Sint32) shn->getbufp[1]) << 16) |
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
242 (((Sint32) shn->getbufp[2]) << 8) |
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
243 (((Sint32) shn->getbufp[3]) );
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
244 } /* if */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
245
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
246 shn->getbufp += 4;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
247 shn->nbyteget -= 4;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
248
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
249 return(1);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
250 } /* word_get */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
251
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
252
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
253 static int uvar_get(int nbin, shn_t *shn, SDL_RWops *rw, Sint32 *word)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
254 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
255 Sint32 result;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
256
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
257 if (shn->nbitget == 0)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
258 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
259 BAIL_IF_MACRO(!word_get(shn, rw, &shn->gbuffer), NULL, 0);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
260 shn->nbitget = 32;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
261 } /* if */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
262
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
263 for (result = 0; !(shn->gbuffer & (1L << --shn->nbitget)); result++)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
264 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
265 if (shn->nbitget == 0)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
266 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
267 BAIL_IF_MACRO(!word_get(shn, rw, &shn->gbuffer), NULL, 0);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
268 shn->nbitget = 32;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
269 } /* if */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
270 } /* for */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
271
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
272 while (nbin != 0)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
273 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
274 if (shn->nbitget >= nbin)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
275 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
276 result = ( (result << nbin) |
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
277 ((shn->gbuffer >> (shn->nbitget - nbin)) &
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
278 mask_table[nbin]) );
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
279 shn->nbitget -= nbin;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
280 break;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
281 } /* if */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
282 else
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
283 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
284 result = (result << shn->nbitget) |
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
285 (shn->gbuffer & mask_table[shn->nbitget]);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
286 BAIL_IF_MACRO(!word_get(shn, rw, &shn->gbuffer), NULL, 0);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
287 nbin -= shn->nbitget;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
288 shn->nbitget = 32;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
289 } /* else */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
290 } /* while */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
291
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
292 if (word != NULL)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
293 *word = result;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
294
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
295 return(1);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
296 } /* uvar_get */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
297
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
298
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
299 static int var_get(int nbin, shn_t *shn, SDL_RWops *rw, Sint32 *word)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
300 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
301 BAIL_IF_MACRO(!uvar_get(nbin + 1, shn, rw, word), NULL, 0);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
302
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
303 if ((*word) & 1)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
304 *word = (Sint32) ~((*word) >> 1);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
305 else
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
306 *word = (Sint32) ((*word) >> 1);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
307
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
308 return(1);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
309 } /* var_get */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
310
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
311
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
312 static int ulong_get(shn_t *shn, SDL_RWops *rw, Sint32 *word)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
313 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
314 Sint32 nbit;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
315 Sint32 retval;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
316 BAIL_IF_MACRO(!uvar_get(SHN_ULONGSIZE, shn, rw, &nbit), NULL, 0);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
317 BAIL_IF_MACRO(!uvar_get(nbit, shn, rw, &retval), NULL, 0);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
318
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
319 if (word != NULL)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
320 *word = retval;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
321
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
322 return(1);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
323 } /* ulong_get */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
324
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
325
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
326 static inline int uint_get(int nbit, shn_t *shn, SDL_RWops *rw, Sint32 *word)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
327 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
328 return((shn->version == 0) ?
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
329 uvar_get(nbit, shn, rw, word) :
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
330 ulong_get(shn, rw, word));
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
331 } /* uint_get */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
332
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
333
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
334 static int SHN_init(void)
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
335 {
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
336 return(1); /* initialization always successful. */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
337 } /* SHN_init */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
338
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
339
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
340 static void SHN_quit(void)
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
341 {
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
342 /* it's a no-op. */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
343 } /* SHN_quit */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
344
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
345
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
346 /*
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
347 * Look through the whole file for a SHN magic number. This is costly, so
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
348 * it should only be done if the user SWEARS they have a Shorten stream...
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
349 */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
350 static inline int extended_shn_magic_search(Sound_Sample *sample)
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
351 {
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
352 SDL_RWops *rw = ((Sound_SampleInternal *) sample->opaque)->rw;
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
353 Uint32 word = 0;
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
354 Uint8 ch;
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
355
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
356 while (1)
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
357 {
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
358 BAIL_IF_MACRO(SDL_RWread(rw, &ch, sizeof (ch), 1) != 1, NULL, -1);
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
359 word = ((word << 8) & 0xFFFFFF00) | ch;
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
360 if (SDL_SwapBE32(word) == MAGIC_NUM)
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
361 {
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
362 BAIL_IF_MACRO(SDL_RWread(rw, &ch, sizeof (ch), 1) != 1, NULL, -1);
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
363 return((int) ch);
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
364 } /* if */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
365 } /* while */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
366
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
367 return((int) ch);
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
368 } /* extended_shn_magic_search */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
369
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
370
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
371 /* look for the magic number in the RWops and see what kind of file this is. */
101
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
372 static inline int determine_shn_version(Sound_Sample *sample, const char *ext)
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
373 {
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
374 SDL_RWops *rw = ((Sound_SampleInternal *) sample->opaque)->rw;
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
375 Uint32 magic;
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
376 Uint8 ch;
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
377
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
378 /*
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
379 * Apparently the magic number can start at any byte offset in the file,
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
380 * and we should just discard prior data, but I'm going to restrict it
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
381 * to offset zero for now, so we don't chug down every file that might
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
382 * happen to pass through here. If the extension is explicitly "SHN", we
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
383 * check the whole stream, though.
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
384 */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
385
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
386 if (__Sound_strcasecmp(ext, "shn") == 0)
101
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
387 return(extended_shn_magic_search(sample));
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
388
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
389 BAIL_IF_MACRO(SDL_RWread(rw, &magic, sizeof (magic), 1) != 1, NULL, -1);
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
390 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
391 BAIL_IF_MACRO(SDL_RWread(rw, &ch, sizeof (ch), 1) != 1, NULL, -1);
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
392 BAIL_IF_MACRO(ch > 3, "SHN: Unsupported file version", -1);
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
393
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
394 return((int) ch);
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
395 } /* determine_shn_version */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
396
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
397
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
398 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
399 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
400 Sint32 mean = 0;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
401 int chan;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
402
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
403 switch (ftype)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
404 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
405 case SHN_TYPE_AU1:
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
406 case SHN_TYPE_S8:
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
407 case SHN_TYPE_S16HL:
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
408 case SHN_TYPE_S16LH:
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
409 case SHN_TYPE_ULAW:
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
410 case SHN_TYPE_AU2:
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
411 case SHN_TYPE_AU3:
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
412 case SHN_TYPE_ALAW:
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
413 mean = 0;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
414 break;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
415 case SHN_TYPE_U8:
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
416 mean = 0x80;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
417 break;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
418 case SHN_TYPE_U16HL:
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
419 case SHN_TYPE_U16LH:
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
420 mean = 0x8000;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
421 break;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
422 default:
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 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
424 } /* 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
425
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 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
427 {
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 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
429 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
430 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
431 } /* 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
432 } /* 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
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
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 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
436 {
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 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
438 {
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 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
440 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
441
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_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
443 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
444 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
445 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
446 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
447 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
448 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
449
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 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
451 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
452
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 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
454 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
455
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 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
457 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
458
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 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
460 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
461 } /* 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
462
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 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
464 } /* 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
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
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 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
468 {
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 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
470 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
471 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
472
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 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
474 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
475 {
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 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
477 } /* 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
478
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 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
480 } /* 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
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
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 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
484 {
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 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
486 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
487
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 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
489 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
490 {
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 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
492 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
493 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
494 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
495 } /* 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
496
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 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
498 } /* 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
499
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 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
501 #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
502 #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
503 #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
504
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 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
506 {
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 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
508 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
509 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
510
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 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
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
513 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
514 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
515 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
516 } /* 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
517
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 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
519 *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
520
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 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
522 } /* 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
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
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 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
526 {
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 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
528 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
529 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
530
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 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
532 {
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 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
534 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
535 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
536 } /* 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
537
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 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
539 *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
540
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 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
542 } /* 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
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
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 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
546 {
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 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
548 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
549 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
550 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
551 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
552
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 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
554
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(!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
556 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
557 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
558
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(!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
560 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
561
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(!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
563 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
564
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_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
566 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
567 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
568 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
569 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
570 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
571
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_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
573 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
574 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
575
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(!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
577 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
578 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
579
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 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
581 } /* 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
582
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
583
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
584 static int SHN_open(Sound_Sample *sample, const char *ext)
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
585 {
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
586 Sound_SampleInternal *internal = (Sound_SampleInternal *) sample->opaque;
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
587 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
588 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
589 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
590 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
591 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
592
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 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
594 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
595 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
596 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
597 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
598 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
599 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
600 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
601
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 (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
603 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
604 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
605
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 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
607 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
608 {
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 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
610 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
611 } /* 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
612
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 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
614 {
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 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
616 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
617 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
618 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
619 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
620 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
621 } /* 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
622
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 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
624
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 /* 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
626 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
627 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
628
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 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
630 {
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 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
632 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
633 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
634 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
635 } /* for */
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
636
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
637 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
638 {
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 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
640 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
641 {
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 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
643 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
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 } /* if */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
646
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 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
648 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
649
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 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
651 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
652
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 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
654 (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
655 (!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
656 {
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 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
658 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
659
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 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
661 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
662 } /* 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
663
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 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
665 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
666 {
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 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
668 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
669 } /* 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
670
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 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
672 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
673
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
674 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
675 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
676 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
677
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 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
679 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
680 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
681 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
682 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
683 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
684 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
685 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
686 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
687
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 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
689 } /* SHN_open */
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
690
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
691
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
692 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
693 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
694 int i;
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
695
101
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
696 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
697 {
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 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
699 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
700 } /* 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
701 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
702 {
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 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
704 {
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 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
706 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
707 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
708 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
709 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
710 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
711 } /* 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
712 } /* 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
713 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
714 {
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 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
716 {
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 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
718 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
719 } /* 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
720 } /* 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
721 } /* fix_bitshift */
86
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
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
724 static void SHN_close(Sound_Sample *sample)
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
725 {
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
726 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
727 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
728
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 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
730 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
731
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
732 if (shn->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
733 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
734
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
735 if (shn->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
736 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
737
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
738 if (shn->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
739 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
740
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
741 if (shn->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
742 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
743
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
744 free(shn);
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
745 } /* SHN_close */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
746
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
747
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
748 /* 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
749
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 /* 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
751 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
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 /*
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 ** 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
755 **
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
756 ** 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
757 ** 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
758 ** 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
759 **
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 ** 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
761 ** 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
762 ** 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
763 ** 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
764 ** 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
765 ** 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
766 ** 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
767 ** 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
768 ** 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
769 **
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 ** 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
771 ** 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
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
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 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
775 #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
776
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
777 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
778 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
779 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
780 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
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 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
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 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
787 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 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7};
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
795
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 /* 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
797 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
798 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
799 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
800 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
801 sign = 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
802 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
803 } /* 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
804
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 /* 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
806 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
807 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
808
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 /* 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
810 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
811 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
812 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
813 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
814
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 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
816 } /* 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
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
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 /* 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
820 #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
821 #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
822 #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
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
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 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
826 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
827 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
828 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
829 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
830 {
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 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
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
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 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
835 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
836 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
837 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
838 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
839 mask = 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
840 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
841 } /* 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
842
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 /* 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
844 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
845
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
846 /* 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
847 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
848 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
849
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 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
851 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
852 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
853 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
854 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
855
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 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
857 } /* 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
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
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 /* 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
861 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
862 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
863 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
864 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
865 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
866 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
867 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
868 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
869 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
870
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 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
872
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 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
874 {
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 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
876 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
877 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
878 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
879 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
880 } /* 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
881 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
882 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
883 } /* if */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
884
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 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
886 {
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_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
888 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
889 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
890 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
891 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
892 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
893 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
894 *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
895 } /* 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
896 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
897 {
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 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
899 {
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 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
901 *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
902 } /* 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
903 } /* 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
904 } /* 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
905 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
906
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
907 case 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
908 {
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 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
910 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
911 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
912 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
913 *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
914 } /* 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
915 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
916 {
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 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
918 {
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 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
920 *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
921 } /* 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
922 } /* 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
923 } /* 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
924 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
925
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
926 case 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
927 {
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 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
929 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
930 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
931 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
932 *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
933 } /* 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
934 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
935 {
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 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
937 {
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 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
939 *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
940 } /* 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
941 } /* 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
942 } /* 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
943 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
944
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_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
946 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
947 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
948 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
949 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
950 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
951 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
952 *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
953 } /* 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
954 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
955 {
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 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
957 {
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 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
959 *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
960 } /* 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
961 } /* 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
962 } /* 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
963 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
964
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_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
966 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
967 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
968 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
969 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
970 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
971 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
972 *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
973 } /* 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
974 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
975 {
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 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
977 {
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 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
979 *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
980 } /* 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
981 } /* 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
982 } /* 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
983 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
984
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
985 case 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
986 {
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 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
988 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
989 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
990 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
991 *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
992 } /* 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
993 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
994 {
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 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
996 {
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 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
998 *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
999 } /* 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
1000 } /* 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
1001 } /* 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
1002 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
1003
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1004 case 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
1005 {
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 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
1007 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
1008 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1009 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
1010 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
1011 *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
1012 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
1013 *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
1014 } /* 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
1015 else
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1016 {
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 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
1018 {
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 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
1020 {
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 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
1022 *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
1023 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
1024 *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
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 } /* 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
1027 } /* 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
1028 } /* 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
1029 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
1030
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1031 case 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
1032 {
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 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
1034 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
1035 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1036 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
1037 *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
1038 } /* 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
1039 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
1040 {
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 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
1042 {
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 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
1044 *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
1045 } /* 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
1046 }/* 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
1047 } /* 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
1048 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
1049 } /* 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
1050
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1051 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
1052 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
1053 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
1054 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
1055 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
1056 } /* 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
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
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 #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
1060
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1061 static Uint32 SHN_read(Sound_Sample *sample)
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1062 {
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
1063 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
1064 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
1065 Uint32 cpyBytes = 0;
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1066 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
1067 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
1068 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
1069 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
1070
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 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
1072
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 /* 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
1074 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
1075 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1076 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
1077 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
1078 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
1079 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
1080 } /* 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
1081
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 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
1083
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 /* 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
1085 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
1086 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1087 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
1088 {
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 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
1090 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
1091 } /* 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
1092
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 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
1094 {
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 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
1096 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
1097 } /* 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
1098
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 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
1100 {
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_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
1102 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
1103 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
1104 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
1105 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
1106 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
1107 {
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 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
1109 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
1110 Sint32 resn = 0, nlpc, j;
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1111
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
1112 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
1113 {
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 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
1115 {
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 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
1117 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
1118 } /* 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
1119
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 /* 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
1121 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
1122 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
1123 } /* 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
1124
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 /* 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
1126 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
1127 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
1128 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
1129 {
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 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
1131 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
1132 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
1133
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 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
1135 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
1136 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
1137 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
1138 } /* else */
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1139
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
1140 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
1141 {
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 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
1143 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
1144 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
1145 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
1146
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 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
1148 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
1149 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1150 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
1151 {
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 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
1153 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
1154 } /* 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
1155 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
1156 } /* 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
1157 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
1158
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 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
1160 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
1161 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1162 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
1163 {
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 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
1165 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
1166 } /* 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
1167 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
1168 } /* 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
1169 break;
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1170
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
1171 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
1172 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
1173 {
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 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
1175 {
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 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
1177 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
1178 } /* 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
1179 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
1180 } /* 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
1181 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
1182
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 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
1184 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
1185 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1186 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
1187 {
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 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
1189 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
1190 } /* 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
1191 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
1192 } /* 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
1193 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
1194
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 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
1196 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
1197 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1198 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
1199 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
1200 } /* 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
1201
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 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
1203 {
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 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
1205 {
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 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
1207 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
1208 } /* 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
1209 } /* 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
1210
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 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
1212 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
1213
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1214 for(i = 0; i < 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
1215 {
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 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
1217
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 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
1219 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
1220
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1221 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
1222 {
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 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
1224 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
1225 } /* 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
1226 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
1227 } /* for */
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1228
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
1229 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
1230 {
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 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
1232 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
1233 } /* 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
1234
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 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
1236 } /* 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
1237
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1238 /* 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
1239 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
1240 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1241 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
1242 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
1243 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
1244
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1245 for(i = 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
1246 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
1247
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1248 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
1249 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
1250 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
1251 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
1252 } /* 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
1253
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 /* 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
1255 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
1256 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
1257
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1258 fix_bitshift(cbuffer, shn->blocksize, shn->bitshift, shn->datatype);
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1259
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
1260 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
1261 {
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 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
1263 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
1264 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
1265 } /* 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
1266
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 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
1268 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
1269 } /* case */
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1270
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
1271 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
1272 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
1273 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
1274 {
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 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
1276 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
1277 } /* 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
1278 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
1279
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 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
1281 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
1282 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1283 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
1284 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
1285 } /* 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
1286 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
1287
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 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
1289 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
1290 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
1291 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
1292 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
1293 } /* 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
1294 } /* while */
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1295
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1296 return(retval);
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1297 } /* SHN_read */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1298
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1299 #endif /* defined SOUND_SUPPORTS_SHN */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1300
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1301 /* end of shn.c ... */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1302