Mercurial > SDL_sound_CoreAudio
annotate decoders/shn.c @ 566:74405e7be04b
Moved SNDDBG output a little later.
author | Ryan C. Gordon <icculus@icculus.org> |
---|---|
date | Fri, 30 Jan 2009 19:54:58 -0500 |
parents | 2e8907ff98e9 |
children |
rev | line source |
---|---|
86 | 1 /* |
2 * SDL_sound -- An abstract sound format decoding API. | |
3 * Copyright (C) 2001 Ryan C. Gordon. | |
4 * | |
5 * This library is free software; you can redistribute it and/or | |
6 * modify it under the terms of the GNU Lesser General Public | |
7 * License as published by the Free Software Foundation; either | |
8 * version 2.1 of the License, or (at your option) any later version. | |
9 * | |
10 * This library is distributed in the hope that it will be useful, | |
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
13 * Lesser General Public License for more details. | |
14 * | |
15 * You should have received a copy of the GNU Lesser General Public | |
16 * License along with this library; if not, write to the Free Software | |
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
18 */ | |
19 | |
20 /* | |
21 * Shorten decoder for SDL_sound. | |
22 * | |
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 | 33 * |
34 * Shorten homepage: http://www.softsound.com/Shorten.html | |
35 * | |
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 | 38 * |
552
2e8907ff98e9
Replaced references to COPYING with references to LICENSE.txt ...
Ryan C. Gordon <icculus@icculus.org>
parents:
546
diff
changeset
|
39 * Please see the file LICENSE.txt in the source's root directory. |
86 | 40 * |
526
2df1f5c62d38
Updated my email address.
Ryan C. Gordon <icculus@icculus.org>
parents:
477
diff
changeset
|
41 * This file written by Ryan C. Gordon. (icculus@icculus.org) |
86 | 42 */ |
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 | 50 #include <stdio.h> |
51 #include <stdlib.h> | |
52 #include <string.h> | |
546
b05e21ca2619
Merged r553:555 from branches/stable-1.0: math.h in shn.c
Ryan C. Gordon <icculus@icculus.org>
parents:
526
diff
changeset
|
53 #include <math.h> |
86 | 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 |
86 | 60 static int SHN_init(void); |
61 static void SHN_quit(void); | |
62 static int SHN_open(Sound_Sample *sample, const char *ext); | |
63 static void SHN_close(Sound_Sample *sample); | |
64 static Uint32 SHN_read(Sound_Sample *sample); | |
221
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
212
diff
changeset
|
65 static int SHN_rewind(Sound_Sample *sample); |
306
c97be6e1bd27
Added framework for Sound_Seek() support.
Ryan C. Gordon <icculus@icculus.org>
parents:
301
diff
changeset
|
66 static int SHN_seek(Sound_Sample *sample, Uint32 ms); |
86 | 67 |
149
1df5c106504e
Decoders can now list multiple file extensions.
Ryan C. Gordon <icculus@icculus.org>
parents:
126
diff
changeset
|
68 static const char *extensions_shn[] = { "SHN", NULL }; |
86 | 69 const Sound_DecoderFunctions __Sound_DecoderFunctions_SHN = |
70 { | |
71 { | |
149
1df5c106504e
Decoders can now list multiple file extensions.
Ryan C. Gordon <icculus@icculus.org>
parents:
126
diff
changeset
|
72 extensions_shn, |
86 | 73 "Shorten-compressed audio data", |
526
2df1f5c62d38
Updated my email address.
Ryan C. Gordon <icculus@icculus.org>
parents:
477
diff
changeset
|
74 "Ryan C. Gordon <icculus@icculus.org>", |
86 | 75 "http://www.icculus.org/SDL_sound/" |
76 }, | |
77 | |
221
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
212
diff
changeset
|
78 SHN_init, /* init() method */ |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
212
diff
changeset
|
79 SHN_quit, /* quit() method */ |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
212
diff
changeset
|
80 SHN_open, /* open() method */ |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
212
diff
changeset
|
81 SHN_close, /* close() method */ |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
212
diff
changeset
|
82 SHN_read, /* read() method */ |
306
c97be6e1bd27
Added framework for Sound_Seek() support.
Ryan C. Gordon <icculus@icculus.org>
parents:
301
diff
changeset
|
83 SHN_rewind, /* rewind() method */ |
c97be6e1bd27
Added framework for Sound_Seek() support.
Ryan C. Gordon <icculus@icculus.org>
parents:
301
diff
changeset
|
84 SHN_seek /* seek() method */ |
86 | 85 }; |
86 | |
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; |
233
15a3b1a1291c
Kludged implementation of the rewind method.
Ryan C. Gordon <icculus@icculus.org>
parents:
221
diff
changeset
|
112 Uint32 start_pos; |
101
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
113 } 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
|
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 |
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 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
|
117 { |
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 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
|
119 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
|
120 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
|
121 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
|
122 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
|
123 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
|
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 |
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 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
|
128 {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
|
129 {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
|
130 {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
|
131 {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
|
132 {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
|
133 {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
|
134 {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
|
135 {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
|
136 {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
|
137 {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
|
138 {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
|
139 {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
|
140 {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
|
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 |
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 #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
|
145 #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
|
146 #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
|
147 |
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 #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
|
149 #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
|
150 #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
|
151 |
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 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
|
153 #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
|
154 |
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 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
|
156 #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
|
157 #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
|
158 #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
|
159 |
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 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
|
161 #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
|
162 #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
|
163 #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
|
164 #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
|
165 #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
|
166 #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
|
167 #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
|
168 #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
|
169 #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
|
170 #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
|
171 #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
|
172 |
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_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
|
174 #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
|
175 |
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_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
|
177 #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
|
178 #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
|
179 #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
|
180 #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
|
181 #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
|
182 #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
|
183 #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
|
184 #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
|
185 #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
|
186 |
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_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
|
188 #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
|
189 #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
|
190 #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
|
191 #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
|
192 #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
|
193 #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
|
194 #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
|
195 #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
|
196 #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
|
197 #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
|
198 #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
|
199 #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
|
200 #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
|
201 #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
|
202 |
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_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
|
204 #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
|
205 #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
|
206 #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
|
207 #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
|
208 #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
|
209 #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
|
210 #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
|
211 #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
|
212 #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
|
213 #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
|
214 #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
|
215 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
216 #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
|
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 |
212
8c2cb920a383
Changed the magic number macro to be more uniform with other decoders.
Ryan C. Gordon <icculus@icculus.org>
parents:
184
diff
changeset
|
219 #define SHN_MAGIC 0x676B6A61 /* looks like "ajkg" as chars. */ |
101
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
220 |
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 #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
|
222 #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
|
223 #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
|
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
|
225 #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
|
226 #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
|
227 #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
|
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 |
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 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
|
231 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
232 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
|
233 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
234 shn->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
|
235 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
|
236 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
|
237 } /* 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
|
238 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
239 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
|
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
|
241 *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
|
242 (((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
|
243 (((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
|
244 (((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
|
245 } /* 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
|
246 |
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->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
|
248 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
|
249 |
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 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
|
251 } /* 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
|
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 |
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 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
|
255 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
256 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
|
257 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
258 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
|
259 { |
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 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
|
261 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
|
262 } /* 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
|
263 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
264 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
|
265 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
266 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
|
267 { |
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 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
|
269 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
|
270 } /* 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
|
271 } /* 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
|
272 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
273 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
|
274 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
275 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
|
276 { |
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 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
|
278 ((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
|
279 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
|
280 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
|
281 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
|
282 } /* 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
|
283 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
|
284 { |
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 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
|
286 (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
|
287 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
|
288 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
|
289 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
|
290 } /* 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
|
291 } /* 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
|
292 |
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 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
|
294 *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
|
295 |
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 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
|
297 } /* 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
|
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 |
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 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
|
301 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
302 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
|
303 |
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 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
|
305 *word = (Sint32) ~((*word) >> 1); |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
306 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
|
307 *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
|
308 |
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 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
|
310 } /* 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
|
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 |
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 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
|
314 { |
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 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
|
316 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
|
317 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
|
318 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
|
319 |
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 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
|
321 *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
|
322 |
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 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
|
324 } /* 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
|
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 |
401
c42ac9ee2ce4
Fixed "inline" keyword to compile.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
327 static __inline__ int uint_get(int nbit, shn_t *shn, SDL_RWops *rw, Sint32 *w) |
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
|
328 { |
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 return((shn->version == 0) ? |
401
c42ac9ee2ce4
Fixed "inline" keyword to compile.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
330 uvar_get(nbit, shn, rw, w) : |
c42ac9ee2ce4
Fixed "inline" keyword to compile.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
331 ulong_get(shn, rw, w)); |
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
|
332 } /* 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
|
333 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
334 |
86 | 335 static int SHN_init(void) |
336 { | |
337 return(1); /* initialization always successful. */ | |
338 } /* SHN_init */ | |
339 | |
340 | |
341 static void SHN_quit(void) | |
342 { | |
343 /* it's a no-op. */ | |
344 } /* SHN_quit */ | |
345 | |
346 | |
347 /* | |
348 * Look through the whole file for a SHN magic number. This is costly, so | |
349 * it should only be done if the user SWEARS they have a Shorten stream... | |
350 */ | |
401
c42ac9ee2ce4
Fixed "inline" keyword to compile.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
351 static __inline__ int extended_shn_magic_search(Sound_Sample *sample) |
86 | 352 { |
353 SDL_RWops *rw = ((Sound_SampleInternal *) sample->opaque)->rw; | |
354 Uint32 word = 0; | |
355 Uint8 ch; | |
356 | |
357 while (1) | |
358 { | |
359 BAIL_IF_MACRO(SDL_RWread(rw, &ch, sizeof (ch), 1) != 1, NULL, -1); | |
360 word = ((word << 8) & 0xFFFFFF00) | ch; | |
212
8c2cb920a383
Changed the magic number macro to be more uniform with other decoders.
Ryan C. Gordon <icculus@icculus.org>
parents:
184
diff
changeset
|
361 if (SDL_SwapBE32(word) == SHN_MAGIC) |
86 | 362 { |
363 BAIL_IF_MACRO(SDL_RWread(rw, &ch, sizeof (ch), 1) != 1, NULL, -1); | |
364 return((int) ch); | |
365 } /* if */ | |
366 } /* while */ | |
367 | |
368 return((int) ch); | |
369 } /* extended_shn_magic_search */ | |
370 | |
371 | |
372 /* look for the magic number in the RWops and see what kind of file this is. */ | |
401
c42ac9ee2ce4
Fixed "inline" keyword to compile.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
373 static __inline__ int determine_shn_version(Sound_Sample *sample, |
c42ac9ee2ce4
Fixed "inline" keyword to compile.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
374 const char *ext) |
86 | 375 { |
376 SDL_RWops *rw = ((Sound_SampleInternal *) sample->opaque)->rw; | |
377 Uint32 magic; | |
378 Uint8 ch; | |
379 | |
380 /* | |
381 * Apparently the magic number can start at any byte offset in the file, | |
382 * and we should just discard prior data, but I'm going to restrict it | |
383 * to offset zero for now, so we don't chug down every file that might | |
384 * happen to pass through here. If the extension is explicitly "SHN", we | |
385 * check the whole stream, though. | |
386 */ | |
387 | |
388 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
|
389 return(extended_shn_magic_search(sample)); |
86 | 390 |
391 BAIL_IF_MACRO(SDL_RWread(rw, &magic, sizeof (magic), 1) != 1, NULL, -1); | |
212
8c2cb920a383
Changed the magic number macro to be more uniform with other decoders.
Ryan C. Gordon <icculus@icculus.org>
parents:
184
diff
changeset
|
392 BAIL_IF_MACRO(SDL_SwapLE32(magic) != SHN_MAGIC, "SHN: Not a SHN file", -1); |
86 | 393 BAIL_IF_MACRO(SDL_RWread(rw, &ch, sizeof (ch), 1) != 1, NULL, -1); |
394 BAIL_IF_MACRO(ch > 3, "SHN: Unsupported file version", -1); | |
395 | |
396 return((int) ch); | |
397 } /* determine_shn_version */ | |
398 | |
399 | |
242
12a9c2e0b00f
Fixed compiler warnings (thanks, Darrell!)
Ryan C. Gordon <icculus@icculus.org>
parents:
233
diff
changeset
|
400 static void init_shn_offset(Sint32 **offset, int nchan, int nblock, int ftype) |
101
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
401 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
402 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
|
403 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
|
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 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
|
406 { |
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_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
|
408 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
|
409 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
|
410 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
|
411 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
|
412 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
|
413 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
|
414 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
|
415 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
|
416 break; |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
417 case SHN_TYPE_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
|
418 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
|
419 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
|
420 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
|
421 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
|
422 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
|
423 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
|
424 default: |
387
fb519e6028e3
Changed all the Sound_SetError() calls to __Sound_SetError (or BAIL*_MACRO)
Ryan C. Gordon <icculus@icculus.org>
parents:
377
diff
changeset
|
425 __Sound_SetError("SHN: unknown file type"); |
245
82a37ef73ae9
Whoops; fixing a compiling bug I introduced.
Ryan C. Gordon <icculus@icculus.org>
parents:
242
diff
changeset
|
426 return; |
101
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
427 } /* 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
|
428 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
429 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
|
430 { |
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 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
|
432 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
|
433 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
|
434 } /* 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
|
435 } /* 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
|
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 |
401
c42ac9ee2ce4
Fixed "inline" keyword to compile.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
438 static __inline__ Uint16 cvt_shnftype_to_sdlfmt(Sint16 shntype) |
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
|
439 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
440 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
|
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_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
|
443 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
|
444 |
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_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
|
446 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
|
447 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
|
448 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
|
449 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
|
450 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
|
451 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
|
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_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
|
454 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
|
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_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
|
457 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
|
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_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
|
460 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
|
461 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
462 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
|
463 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
|
464 } /* 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
|
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 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
|
467 } /* 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
|
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 |
401
c42ac9ee2ce4
Fixed "inline" keyword to compile.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
470 static __inline__ int skip_bits(shn_t *shn, SDL_RWops *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
|
471 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
472 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
|
473 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
|
474 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
|
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_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
|
477 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
|
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 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
|
480 } /* 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
|
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 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
|
483 } /* 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
|
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 |
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 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
|
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 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
|
489 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
|
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 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
|
492 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
|
493 { |
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 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
|
495 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
|
496 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
|
497 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
|
498 } /* 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
|
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 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
|
501 } /* 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
|
502 |
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 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
|
504 #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
|
505 #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
|
506 #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
|
507 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
508 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
|
509 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
510 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
|
511 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
|
512 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
|
513 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
514 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
|
515 { |
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 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
|
517 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
|
518 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
|
519 } /* 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
|
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 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
|
522 *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
|
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 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
|
525 } /* 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
|
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 |
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 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
|
529 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
530 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
|
531 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
|
532 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
|
533 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
534 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
|
535 { |
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 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
|
537 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
|
538 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
|
539 } /* 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
|
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 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
|
542 *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
|
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 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
|
545 } /* 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
|
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 |
401
c42ac9ee2ce4
Fixed "inline" keyword to compile.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
548 static __inline__ int parse_riff_header(shn_t *shn, Sound_Sample *sample) |
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
|
549 { |
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 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
|
551 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
|
552 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
|
553 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
|
554 Sint32 cklen; |
474
c66080364dff
Most decoders now report total sample play time, now. Technically, this
Ryan C. Gordon <icculus@icculus.org>
parents:
425
diff
changeset
|
555 Uint32 bytes_per_second; |
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
|
556 |
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(!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
|
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); /* 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
|
560 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
|
561 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
|
562 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
563 BAIL_IF_MACRO(!verb_ReadLE32(shn, rw, &u32), NULL, 0); /* 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
|
564 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
|
565 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
566 BAIL_IF_MACRO(!verb_ReadLE32(shn, rw, &u32), NULL, 0); /* '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
|
567 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
|
568 |
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); /* 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
|
570 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
|
571 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
|
572 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
|
573 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
|
574 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
|
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); /* bytespersec */ |
474
c66080364dff
Most decoders now report total sample play time, now. Technically, this
Ryan C. Gordon <icculus@icculus.org>
parents:
425
diff
changeset
|
577 bytes_per_second = u32; |
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
|
578 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
|
579 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
|
580 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
581 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
|
582 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
|
583 BAIL_IF_MACRO(!verb_ReadLE32(shn, rw, &u32), NULL, 0); /* chunksize */ |
477
3e705c9180e5
Fixed binary compatibility, added Sound_GetDuration().
Ryan C. Gordon <icculus@icculus.org>
parents:
474
diff
changeset
|
584 internal->total_time = u32 / bytes_per_second * 1000; |
3e705c9180e5
Fixed binary compatibility, added Sound_GetDuration().
Ryan C. Gordon <icculus@icculus.org>
parents:
474
diff
changeset
|
585 internal->total_time += (u32 % bytes_per_second) * 1000 / bytes_per_second; |
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
|
586 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
|
587 } /* 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
|
588 |
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 |
86 | 590 static int SHN_open(Sound_Sample *sample, const char *ext) |
591 { | |
592 Sound_SampleInternal *internal = (Sound_SampleInternal *) sample->opaque; | |
593 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
|
594 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
|
595 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
|
596 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
|
597 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
|
598 |
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 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
|
600 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
|
601 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
|
602 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
|
603 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
|
604 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
|
605 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
|
606 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
|
607 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
608 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
|
609 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
|
610 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
|
611 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
612 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
|
613 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
|
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 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
|
616 goto shn_open_puke; |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
617 } /* if */ |
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 |
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 (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
|
620 { |
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 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
|
622 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
|
623 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
|
624 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
|
625 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
|
626 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
|
627 } /* 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
|
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 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
|
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 /* 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
|
632 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
|
633 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
|
634 |
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 (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
|
636 { |
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 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
|
638 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
|
639 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
|
640 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
|
641 } /* for */ |
86 | 642 |
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
|
643 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
|
644 { |
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 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
|
646 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
|
647 { |
387
fb519e6028e3
Changed all the Sound_SetError() calls to __Sound_SetError (or BAIL*_MACRO)
Ryan C. Gordon <icculus@icculus.org>
parents:
377
diff
changeset
|
648 __Sound_SetError(ERR_OUT_OF_MEMORY); |
101
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
649 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
|
650 } /* 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
|
651 } /* 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
|
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 (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
|
654 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
|
655 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
656 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
|
657 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
|
658 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
659 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
|
660 (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
|
661 (!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
|
662 { |
387
fb519e6028e3
Changed all the Sound_SetError() calls to __Sound_SetError (or BAIL*_MACRO)
Ryan C. Gordon <icculus@icculus.org>
parents:
377
diff
changeset
|
663 if (cmd != SHN_FN_VERBATIM) /* the other conditions set error state */ |
fb519e6028e3
Changed all the Sound_SetError() calls to __Sound_SetError (or BAIL*_MACRO)
Ryan C. Gordon <icculus@icculus.org>
parents:
377
diff
changeset
|
664 __Sound_SetError("SHN: Expected VERBATIM function"); |
101
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
665 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
666 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
|
667 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
|
668 } /* if */ |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
669 |
233
15a3b1a1291c
Kludged implementation of the rewind method.
Ryan C. Gordon <icculus@icculus.org>
parents:
221
diff
changeset
|
670 shn->start_pos = SDL_RWtell(rw); |
15a3b1a1291c
Kludged implementation of the rewind method.
Ryan C. Gordon <icculus@icculus.org>
parents:
221
diff
changeset
|
671 |
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
|
672 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
|
673 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
|
674 { |
387
fb519e6028e3
Changed all the Sound_SetError() calls to __Sound_SetError (or BAIL*_MACRO)
Ryan C. Gordon <icculus@icculus.org>
parents:
377
diff
changeset
|
675 __Sound_SetError(ERR_OUT_OF_MEMORY); |
101
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
676 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
|
677 } /* 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
|
678 |
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 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
|
680 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
|
681 |
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 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
|
683 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
|
684 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
|
685 |
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 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
|
687 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
|
688 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
|
689 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
|
690 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
|
691 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
|
692 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
|
693 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
|
694 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
|
695 |
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 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
|
697 } /* SHN_open */ |
86 | 698 |
699 | |
233
15a3b1a1291c
Kludged implementation of the rewind method.
Ryan C. Gordon <icculus@icculus.org>
parents:
221
diff
changeset
|
700 static void fix_bitshift(Sint32 *buffer, int nitem, int bitshift, int ftype) |
101
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
701 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
702 int i; |
86 | 703 |
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
|
704 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
|
705 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
706 for (i = 0; i < nitem; i++) |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
707 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
|
708 } /* 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
|
709 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
|
710 { |
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(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
|
712 { |
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 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
|
714 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
|
715 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
|
716 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
|
717 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
|
718 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
|
719 } /* 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
|
720 } /* 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
|
721 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
|
722 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
723 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
|
724 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
725 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
|
726 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
|
727 } /* 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
|
728 } /* 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
|
729 } /* fix_bitshift */ |
86 | 730 |
731 | |
732 static void SHN_close(Sound_Sample *sample) | |
733 { | |
734 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
|
735 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
|
736 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
737 if (shn->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
|
738 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
|
739 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
740 if (shn->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
|
741 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
|
742 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
743 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
|
744 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
|
745 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
746 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
|
747 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
|
748 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
749 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
|
750 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
|
751 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
752 free(shn); |
86 | 753 } /* SHN_close */ |
754 | |
755 | |
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
|
756 /* 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
|
757 |
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 /* 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
|
759 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
|
760 { |
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 /* |
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 ** 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
|
763 ** |
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 ** 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
|
765 ** 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
|
766 ** 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
|
767 ** |
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 ** 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
|
769 ** 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
|
770 ** 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
|
771 ** 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
|
772 ** 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
|
773 ** 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
|
774 ** 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
|
775 ** 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
|
776 ** 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
|
777 ** |
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 ** 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
|
779 ** 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
|
780 */ |
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 |
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 #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
|
783 #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
|
784 |
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 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
|
786 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
|
787 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
|
788 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
|
789 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
|
790 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
|
791 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
|
792 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
|
793 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
|
794 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
|
795 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
796 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
797 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
798 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
|
799 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
|
800 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
|
801 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
|
802 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
|
803 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
804 /* 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
|
805 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
|
806 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
|
807 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
|
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 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
|
810 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
|
811 } /* 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
|
812 |
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 /* 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
|
814 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
|
815 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
|
816 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
817 /* 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
|
818 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
|
819 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
|
820 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
|
821 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
|
822 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
823 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
|
824 } /* 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
|
825 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
826 |
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 /* 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
|
828 #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
|
829 #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
|
830 #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
|
831 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
832 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
833 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
|
834 { |
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 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
|
836 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
|
837 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
|
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 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
|
840 }; |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
841 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
842 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
|
843 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
|
844 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
|
845 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
|
846 { |
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 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
|
848 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
|
849 } /* 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
|
850 |
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 /* 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
|
852 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
|
853 |
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 /* 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
|
855 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
|
856 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
|
857 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
858 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
|
859 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
|
860 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
|
861 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
|
862 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
|
863 |
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 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
|
865 } /* 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
|
866 |
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 |
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 /* 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
|
869 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
|
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 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
|
872 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
|
873 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
|
874 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
|
875 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
|
876 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
|
877 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
|
878 |
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 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
|
880 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
881 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
|
882 { |
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 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
|
884 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
|
885 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
886 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
|
887 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
|
888 } /* 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
|
889 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
|
890 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
|
891 } /* 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
|
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 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
|
894 { |
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 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
|
896 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
|
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 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
|
899 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
|
900 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
901 for (i = 0; i < nitem; i++) |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
902 *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
|
903 } /* 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
|
904 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
|
905 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
906 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
|
907 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
908 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
|
909 *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
|
910 } /* 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
|
911 } /* 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
|
912 } /* 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
|
913 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
|
914 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
915 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
|
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 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
|
918 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
|
919 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
920 for (i = 0; i < nitem; i++) |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
921 *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
|
922 } /* 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
|
923 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
|
924 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
925 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
|
926 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
927 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
|
928 *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
|
929 } /* 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
|
930 } /* 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
|
931 } /* 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
|
932 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
|
933 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
934 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
|
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 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
|
937 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
|
938 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
939 for(i = 0; i < nitem; i++) |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
940 *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
|
941 } /* 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
|
942 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
|
943 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
944 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
|
945 { |
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 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
|
947 *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
|
948 } /* 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
|
949 } /* 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
|
950 } /* 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
|
951 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
|
952 |
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 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
|
954 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
|
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 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
|
957 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
|
958 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
959 for (i = 0; i < nitem; i++) |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
960 *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
|
961 } /* 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
|
962 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
|
963 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
964 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
|
965 { |
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 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
|
967 *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
|
968 } /* 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
|
969 } /* 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
|
970 } /* 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
|
971 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
|
972 |
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 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
|
974 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
|
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 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
|
977 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
|
978 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
979 for (i = 0; i < nitem; i++) |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
980 *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
|
981 } /* 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
|
982 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
|
983 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
984 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
|
985 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
986 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
|
987 *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
|
988 } /* 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
|
989 } /* 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
|
990 } /* 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
|
991 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
|
992 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
993 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
|
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 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
|
996 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
|
997 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
998 for(i = 0; i < nitem; i++) |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
999 *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
|
1000 } /* 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
|
1001 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
|
1002 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1003 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
|
1004 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1005 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
|
1006 *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
|
1007 } /* 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
|
1008 } /* 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
|
1009 } /* 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
|
1010 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
|
1011 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1012 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
|
1013 { |
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 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
|
1015 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
|
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 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
|
1019 *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
|
1020 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
|
1021 *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
|
1022 } /* 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
|
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 { |
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 (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
|
1026 { |
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 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
|
1028 { |
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 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
|
1030 *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
|
1031 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
|
1032 *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
|
1033 } /* 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
|
1034 } /* 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
|
1035 } /* 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
|
1036 } /* 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
|
1037 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
|
1038 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1039 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
|
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 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
|
1042 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
|
1043 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1044 for (i = 0; i < nitem; i++) |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1045 *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
|
1046 } /* 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
|
1047 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
|
1048 { |
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 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
|
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 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
|
1052 *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
|
1053 } /* 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
|
1054 }/* 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
|
1055 } /* 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
|
1056 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
|
1057 } /* 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
|
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 i = MIN_MACRO(internal->buffer_size - bw, bsiz); |
126 | 1060 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
|
1061 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
|
1062 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
|
1063 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
|
1064 } /* 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
|
1065 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1066 |
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 #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
|
1068 |
86 | 1069 static Uint32 SHN_read(Sound_Sample *sample) |
1070 { | |
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
|
1071 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
|
1072 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
|
1073 Uint32 cpyBytes = 0; |
86 | 1074 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
|
1075 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
|
1076 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
|
1077 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
|
1078 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1079 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
|
1080 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1081 /* 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
|
1082 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
|
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 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
|
1085 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
|
1086 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
|
1087 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
|
1088 } /* 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
|
1089 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1090 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
|
1091 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1092 /* 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
|
1093 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
|
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 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
|
1096 { |
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 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
|
1098 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
|
1099 } /* 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
|
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 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
|
1102 { |
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 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
|
1104 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
|
1105 } /* 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
|
1106 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1107 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
|
1108 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1109 case SHN_FN_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
|
1110 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
|
1111 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
|
1112 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
|
1113 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
|
1114 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
|
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 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
|
1117 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
|
1118 Sint32 resn = 0, nlpc, j; |
86 | 1119 |
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
|
1120 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
|
1121 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1122 if (!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
|
1123 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1124 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
|
1125 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
|
1126 } /* if */ |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1127 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1128 /* 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
|
1129 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
|
1130 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
|
1131 } /* 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
|
1132 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1133 /* 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
|
1134 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
|
1135 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
|
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 { |
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 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
|
1139 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
|
1140 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
|
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 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
|
1143 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
|
1144 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
|
1145 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
|
1146 } /* else */ |
86 | 1147 |
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
|
1148 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
|
1149 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1150 case SHN_FN_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
|
1151 for (i = 0; i < shn->blocksize; i++) |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1152 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
|
1153 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
|
1154 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1155 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
|
1156 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
|
1157 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1158 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
|
1159 { |
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 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
|
1161 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
|
1162 } /* 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
|
1163 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
|
1164 } /* 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
|
1165 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
|
1166 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1167 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
|
1168 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
|
1169 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1170 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
|
1171 { |
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 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
|
1173 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
|
1174 } /* 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
|
1175 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
|
1176 } /* 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
|
1177 break; |
86 | 1178 |
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
|
1179 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
|
1180 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
|
1181 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1182 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
|
1183 { |
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 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
|
1185 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
|
1186 } /* 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
|
1187 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
|
1188 } /* 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
|
1189 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
|
1190 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1191 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
|
1192 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
|
1193 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1194 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
|
1195 { |
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 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
|
1197 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
|
1198 } /* 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
|
1199 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
|
1200 } /* 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
|
1201 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
|
1202 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1203 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
|
1204 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
|
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 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1210 for(i = 0; i < nlpc; i++) |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1211 { |
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 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
|
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 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
|
1215 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
|
1216 } /* 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
|
1217 } /* 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
|
1218 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1219 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
|
1220 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
|
1221 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1222 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
|
1223 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1224 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
|
1225 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1226 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
|
1227 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
|
1228 |
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 (!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
|
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 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
|
1232 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
|
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 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
|
1235 } /* for */ |
86 | 1236 |
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
|
1237 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
|
1238 { |
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 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
|
1240 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
|
1241 } /* 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
|
1242 |
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 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
|
1244 } /* 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
|
1245 |
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 /* 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
|
1247 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
|
1248 { |
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 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
|
1250 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
|
1251 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
|
1252 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1253 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
|
1254 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
|
1255 |
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 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
|
1257 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
|
1258 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
|
1259 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
|
1260 } /* 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
|
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 /* 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
|
1263 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
|
1264 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
|
1265 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1266 fix_bitshift(cbuffer, shn->blocksize, shn->bitshift, shn->datatype); |
86 | 1267 |
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
|
1268 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
|
1269 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1270 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
|
1271 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
|
1272 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
|
1273 } /* 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
|
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 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
|
1276 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
|
1277 } /* case */ |
86 | 1278 |
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
|
1279 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
|
1280 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
|
1281 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
|
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_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
|
1289 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
|
1290 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1291 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 } /* 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
|
1294 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
|
1295 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1296 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
|
1297 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
|
1298 sample->flags |= SOUND_SAMPLEFLAG_ERROR; |
387
fb519e6028e3
Changed all the Sound_SetError() calls to __Sound_SetError (or BAIL*_MACRO)
Ryan C. Gordon <icculus@icculus.org>
parents:
377
diff
changeset
|
1299 BAIL_MACRO("SHN: Unhandled function.", retval); |
101
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1300 } /* 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
|
1301 } /* while */ |
86 | 1302 |
1303 return(retval); | |
1304 } /* SHN_read */ | |
1305 | |
221
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
212
diff
changeset
|
1306 |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
212
diff
changeset
|
1307 static int SHN_rewind(Sound_Sample *sample) |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
212
diff
changeset
|
1308 { |
233
15a3b1a1291c
Kludged implementation of the rewind method.
Ryan C. Gordon <icculus@icculus.org>
parents:
221
diff
changeset
|
1309 Sound_SampleInternal *internal = (Sound_SampleInternal *) sample->opaque; |
15a3b1a1291c
Kludged implementation of the rewind method.
Ryan C. Gordon <icculus@icculus.org>
parents:
221
diff
changeset
|
1310 shn_t *shn = (shn_t *) internal->decoder_private; |
15a3b1a1291c
Kludged implementation of the rewind method.
Ryan C. Gordon <icculus@icculus.org>
parents:
221
diff
changeset
|
1311 |
15a3b1a1291c
Kludged implementation of the rewind method.
Ryan C. Gordon <icculus@icculus.org>
parents:
221
diff
changeset
|
1312 #if 0 |
15a3b1a1291c
Kludged implementation of the rewind method.
Ryan C. Gordon <icculus@icculus.org>
parents:
221
diff
changeset
|
1313 int rc = SDL_RWseek(internal->rw, shn->start_pos, SEEK_SET); |
15a3b1a1291c
Kludged implementation of the rewind method.
Ryan C. Gordon <icculus@icculus.org>
parents:
221
diff
changeset
|
1314 BAIL_IF_MACRO(rc != shn->start_pos, ERR_IO_ERROR, 0); |
15a3b1a1291c
Kludged implementation of the rewind method.
Ryan C. Gordon <icculus@icculus.org>
parents:
221
diff
changeset
|
1315 /* !!! FIXME: set state. */ |
15a3b1a1291c
Kludged implementation of the rewind method.
Ryan C. Gordon <icculus@icculus.org>
parents:
221
diff
changeset
|
1316 return(1); |
15a3b1a1291c
Kludged implementation of the rewind method.
Ryan C. Gordon <icculus@icculus.org>
parents:
221
diff
changeset
|
1317 #else |
15a3b1a1291c
Kludged implementation of the rewind method.
Ryan C. Gordon <icculus@icculus.org>
parents:
221
diff
changeset
|
1318 /* |
15a3b1a1291c
Kludged implementation of the rewind method.
Ryan C. Gordon <icculus@icculus.org>
parents:
221
diff
changeset
|
1319 * !!! FIXME: This is really unacceptable; state should be reset and |
15a3b1a1291c
Kludged implementation of the rewind method.
Ryan C. Gordon <icculus@icculus.org>
parents:
221
diff
changeset
|
1320 * !!! FIXME: the RWops should be pointed to the start of the data |
15a3b1a1291c
Kludged implementation of the rewind method.
Ryan C. Gordon <icculus@icculus.org>
parents:
221
diff
changeset
|
1321 * !!! FIXME: to decode. The below kludge adds unneeded overhead and |
15a3b1a1291c
Kludged implementation of the rewind method.
Ryan C. Gordon <icculus@icculus.org>
parents:
221
diff
changeset
|
1322 * !!! FIXME: risk of failure. |
15a3b1a1291c
Kludged implementation of the rewind method.
Ryan C. Gordon <icculus@icculus.org>
parents:
221
diff
changeset
|
1323 */ |
15a3b1a1291c
Kludged implementation of the rewind method.
Ryan C. Gordon <icculus@icculus.org>
parents:
221
diff
changeset
|
1324 BAIL_IF_MACRO(SDL_RWseek(internal->rw, 0, SEEK_SET) != 0, ERR_IO_ERROR, 0); |
15a3b1a1291c
Kludged implementation of the rewind method.
Ryan C. Gordon <icculus@icculus.org>
parents:
221
diff
changeset
|
1325 SHN_close(sample); |
15a3b1a1291c
Kludged implementation of the rewind method.
Ryan C. Gordon <icculus@icculus.org>
parents:
221
diff
changeset
|
1326 return(SHN_open(sample, "SHN")); |
15a3b1a1291c
Kludged implementation of the rewind method.
Ryan C. Gordon <icculus@icculus.org>
parents:
221
diff
changeset
|
1327 #endif |
221
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
212
diff
changeset
|
1328 } /* SHN_rewind */ |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
212
diff
changeset
|
1329 |
306
c97be6e1bd27
Added framework for Sound_Seek() support.
Ryan C. Gordon <icculus@icculus.org>
parents:
301
diff
changeset
|
1330 |
c97be6e1bd27
Added framework for Sound_Seek() support.
Ryan C. Gordon <icculus@icculus.org>
parents:
301
diff
changeset
|
1331 static int SHN_seek(Sound_Sample *sample, Uint32 ms) |
c97be6e1bd27
Added framework for Sound_Seek() support.
Ryan C. Gordon <icculus@icculus.org>
parents:
301
diff
changeset
|
1332 { |
425
b4abd7c48b6e
Added a comment for later.
Ryan C. Gordon <icculus@icculus.org>
parents:
401
diff
changeset
|
1333 /* |
b4abd7c48b6e
Added a comment for later.
Ryan C. Gordon <icculus@icculus.org>
parents:
401
diff
changeset
|
1334 * (This CAN be done for SHNs that have a seek table at the end of the |
b4abd7c48b6e
Added a comment for later.
Ryan C. Gordon <icculus@icculus.org>
parents:
401
diff
changeset
|
1335 * stream, btw.) |
b4abd7c48b6e
Added a comment for later.
Ryan C. Gordon <icculus@icculus.org>
parents:
401
diff
changeset
|
1336 */ |
351 | 1337 BAIL_MACRO("SHN: Seeking not implemented", 0); |
306
c97be6e1bd27
Added framework for Sound_Seek() support.
Ryan C. Gordon <icculus@icculus.org>
parents:
301
diff
changeset
|
1338 } /* SHN_seek */ |
c97be6e1bd27
Added framework for Sound_Seek() support.
Ryan C. Gordon <icculus@icculus.org>
parents:
301
diff
changeset
|
1339 |
c97be6e1bd27
Added framework for Sound_Seek() support.
Ryan C. Gordon <icculus@icculus.org>
parents:
301
diff
changeset
|
1340 |
86 | 1341 #endif /* defined SOUND_SUPPORTS_SHN */ |
1342 | |
1343 /* end of shn.c ... */ | |
1344 |