Mercurial > SDL_sound_CoreAudio
annotate decoders/shn.c @ 359:2b7969823778
Updated.
author | Ryan C. Gordon <icculus@icculus.org> |
---|---|
date | Tue, 11 Jun 2002 23:33:27 +0000 |
parents | 069ce624d6cf |
children | cbb15ecf423a |
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 * |
184
47cc2de2ae36
Changed reference to "LICENSE" file to "COPYING".
Ryan C. Gordon <icculus@icculus.org>
parents:
161
diff
changeset
|
39 * Please see the file COPYING in the source's root directory. |
86 | 40 * |
41 * This file written by Ryan C. Gordon. (icculus@clutteredmind.org) | |
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> | |
53 #include <assert.h> | |
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", |
74 "Ryan C. Gordon <icculus@clutteredmind.org>", | |
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 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
327 static inline int uint_get(int nbit, shn_t *shn, SDL_RWops *rw, Sint32 *word) |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
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) ? |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
330 uvar_get(nbit, shn, rw, word) : |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
331 ulong_get(shn, rw, word)); |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
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 */ | |
351 static inline int extended_shn_magic_search(Sound_Sample *sample) | |
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. */ | |
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
|
373 static inline int determine_shn_version(Sound_Sample *sample, const char *ext) |
86 | 374 { |
375 SDL_RWops *rw = ((Sound_SampleInternal *) sample->opaque)->rw; | |
376 Uint32 magic; | |
377 Uint8 ch; | |
378 | |
379 /* | |
380 * Apparently the magic number can start at any byte offset in the file, | |
381 * and we should just discard prior data, but I'm going to restrict it | |
382 * to offset zero for now, so we don't chug down every file that might | |
383 * happen to pass through here. If the extension is explicitly "SHN", we | |
384 * check the whole stream, though. | |
385 */ | |
386 | |
387 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
|
388 return(extended_shn_magic_search(sample)); |
86 | 389 |
390 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
|
391 BAIL_IF_MACRO(SDL_SwapLE32(magic) != SHN_MAGIC, "SHN: Not a SHN file", -1); |
86 | 392 BAIL_IF_MACRO(SDL_RWread(rw, &ch, sizeof (ch), 1) != 1, NULL, -1); |
393 BAIL_IF_MACRO(ch > 3, "SHN: Unsupported file version", -1); | |
394 | |
395 return((int) ch); | |
396 } /* determine_shn_version */ | |
397 | |
398 | |
242
12a9c2e0b00f
Fixed compiler warnings (thanks, Darrell!)
Ryan C. Gordon <icculus@icculus.org>
parents:
233
diff
changeset
|
399 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
|
400 { |
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 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
|
402 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
|
403 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
404 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
|
405 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
406 case SHN_TYPE_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
|
407 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
|
408 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
|
409 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
|
410 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
|
411 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
|
412 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
|
413 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
|
414 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
|
415 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
|
416 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
|
417 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
|
418 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
|
419 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
|
420 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
|
421 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
|
422 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
|
423 default: |
245
82a37ef73ae9
Whoops; fixing a compiling bug I introduced.
Ryan C. Gordon <icculus@icculus.org>
parents:
242
diff
changeset
|
424 Sound_SetError("SHN: unknown file type"); |
82a37ef73ae9
Whoops; fixing a compiling bug I introduced.
Ryan C. Gordon <icculus@icculus.org>
parents:
242
diff
changeset
|
425 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
|
426 } /* 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
|
427 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
428 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
|
429 { |
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 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
|
431 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
|
432 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
|
433 } /* 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
|
434 } /* 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
|
435 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
436 |
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 static inline Uint16 cvt_shnftype_to_sdlfmt(Sint16 shntype) |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
438 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
439 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
|
440 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
441 case SHN_TYPE_S8: |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
442 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
|
443 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
444 case SHN_TYPE_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
|
445 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
|
446 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
|
447 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
|
448 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
|
449 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
|
450 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
|
451 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
452 case SHN_TYPE_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
|
453 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
|
454 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
455 case SHN_TYPE_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
|
456 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
|
457 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
458 case SHN_TYPE_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
|
459 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
|
460 |
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 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
|
462 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
|
463 } /* 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
|
464 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
465 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
|
466 } /* 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
|
467 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
468 |
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 static inline int skip_bits(shn_t *shn, SDL_RWops *rw) |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
470 { |
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 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
|
472 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
|
473 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
|
474 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
475 BAIL_IF_MACRO(!uint_get(SHN_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
|
476 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
|
477 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
478 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
|
479 } /* 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
|
480 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
481 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
|
482 } /* 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
|
483 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
484 |
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 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
|
486 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
487 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
|
488 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
|
489 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
490 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
|
491 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
|
492 { |
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 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
|
494 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
|
495 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
|
496 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
|
497 } /* 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
|
498 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
499 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
|
500 } /* 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
|
501 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
502 #define 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
|
503 #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
|
504 #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
|
505 #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
|
506 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
507 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
|
508 { |
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 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
|
510 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
|
511 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
|
512 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
513 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
|
514 { |
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 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
|
516 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
|
517 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
|
518 } /* 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
|
519 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
520 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
|
521 *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
|
522 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
523 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
|
524 } /* 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
|
525 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
526 |
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 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
|
528 { |
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 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
|
530 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
|
531 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
|
532 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
533 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
|
534 { |
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 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
|
536 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
|
537 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
|
538 } /* 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
|
539 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
540 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
|
541 *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
|
542 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
543 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
|
544 } /* 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
|
545 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
546 |
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 static inline int parse_riff_header(shn_t *shn, Sound_Sample *sample) |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
548 { |
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 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
|
550 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
|
551 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
|
552 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
|
553 Sint32 cklen; |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
554 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
555 BAIL_IF_MACRO(!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
|
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(!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
|
558 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
|
559 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
|
560 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
561 BAIL_IF_MACRO(!verb_ReadLE32(shn, rw, &u32), NULL, 0); /* 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
|
562 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
|
563 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
564 BAIL_IF_MACRO(!verb_ReadLE32(shn, rw, &u32), NULL, 0); /* '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
|
565 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
|
566 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
567 BAIL_IF_MACRO(!verb_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
|
568 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
|
569 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
|
570 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
|
571 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
|
572 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
|
573 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
574 BAIL_IF_MACRO(!verb_ReadLE32(shn, rw, &u32), NULL, 0); /* bytespersec */ |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
575 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
|
576 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
|
577 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
578 BAIL_IF_MACRO(!verb_ReadLE32(shn, rw, &u32), NULL, 0); /* '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
|
579 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
|
580 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
|
581 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
582 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
|
583 } /* 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
|
584 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
585 |
86 | 586 static int SHN_open(Sound_Sample *sample, const char *ext) |
587 { | |
588 Sound_SampleInternal *internal = (Sound_SampleInternal *) sample->opaque; | |
589 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
|
590 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
|
591 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
|
592 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
|
593 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
|
594 |
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 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
|
596 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
|
597 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
|
598 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
|
599 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
|
600 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
|
601 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
|
602 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
|
603 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
604 if (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
|
605 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
|
606 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
|
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 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
|
609 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
|
610 { |
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 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
|
612 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
|
613 } /* 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
|
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 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
|
616 { |
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 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
|
618 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
|
619 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
|
620 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
|
621 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
|
622 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
|
623 } /* 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
|
624 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
625 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
|
626 |
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 /* 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
|
628 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
|
629 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
|
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 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
|
632 { |
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 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
|
634 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
|
635 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
|
636 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
|
637 } /* for */ |
86 | 638 |
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
|
639 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
|
640 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
641 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
|
642 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
|
643 { |
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 Sound_SetError(ERR_OUT_OF_MEMORY); |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
645 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
|
646 } /* if */ |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
647 } /* 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
|
648 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
649 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
|
650 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
|
651 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
652 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
|
653 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
|
654 |
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 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
|
656 (cmd != SHN_FN_VERBATIM) || |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
657 (!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
|
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 (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
|
660 Sound_SetError("SHN: Expected VERBATIM function"); |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
661 |
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 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
|
663 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
|
664 } /* 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
|
665 |
233
15a3b1a1291c
Kludged implementation of the rewind method.
Ryan C. Gordon <icculus@icculus.org>
parents:
221
diff
changeset
|
666 shn->start_pos = SDL_RWtell(rw); |
15a3b1a1291c
Kludged implementation of the rewind method.
Ryan C. Gordon <icculus@icculus.org>
parents:
221
diff
changeset
|
667 |
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
|
668 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
|
669 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
|
670 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
671 Sound_SetError(ERR_OUT_OF_MEMORY); |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
672 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
|
673 } /* 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
|
674 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
675 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
|
676 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
|
677 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
678 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
|
679 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
|
680 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
|
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 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
|
683 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
|
684 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
|
685 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
|
686 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
|
687 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
|
688 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
|
689 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
|
690 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
|
691 |
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 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
|
693 } /* SHN_open */ |
86 | 694 |
695 | |
233
15a3b1a1291c
Kludged implementation of the rewind method.
Ryan C. Gordon <icculus@icculus.org>
parents:
221
diff
changeset
|
696 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
|
697 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
698 int i; |
86 | 699 |
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
|
700 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
|
701 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
702 for (i = 0; i < nitem; i++) |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
703 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
|
704 } /* 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
|
705 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
|
706 { |
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 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
|
708 { |
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 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
|
710 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
|
711 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
|
712 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
|
713 else |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
714 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
|
715 } /* 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
|
716 } /* 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
|
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 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
719 if (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
|
720 { |
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 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
|
722 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
|
723 } /* 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
|
724 } /* 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
|
725 } /* fix_bitshift */ |
86 | 726 |
727 | |
728 static void SHN_close(Sound_Sample *sample) | |
729 { | |
730 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
|
731 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
|
732 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
733 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
|
734 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
|
735 |
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 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
|
737 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
|
738 |
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 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
|
740 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
|
741 |
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 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
|
743 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
|
744 |
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 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
|
746 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
|
747 |
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 free(shn); |
86 | 749 } /* SHN_close */ |
750 | |
751 | |
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
|
752 /* 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
|
753 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
754 /* 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
|
755 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
|
756 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
757 /* |
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 ** 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
|
759 ** |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
760 ** 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
|
761 ** 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
|
762 ** 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
|
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 ** 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
|
765 ** 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
|
766 ** 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
|
767 ** 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
|
768 ** 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
|
769 ** 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
|
770 ** 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
|
771 ** 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
|
772 ** 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
|
773 ** |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
774 ** 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
|
775 ** 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
|
776 */ |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
777 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
778 #define 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
|
779 #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
|
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 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
|
782 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
|
783 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
|
784 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
|
785 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
786 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
|
787 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
788 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
789 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
790 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
|
791 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
792 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
793 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
794 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
795 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
796 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
797 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
798 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 |
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 /* 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
|
801 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
|
802 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
|
803 else |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
804 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
805 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
|
806 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
|
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 /* 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
|
810 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
|
811 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
|
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 /* 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
|
814 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
|
815 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
|
816 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
|
817 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
|
818 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
819 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
|
820 } /* 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
|
821 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
822 |
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 /* 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
|
824 #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
|
825 #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
|
826 #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
|
827 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
828 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
829 static 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
|
830 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
831 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
|
832 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
|
833 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
|
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 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
|
836 }; |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
837 |
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 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
|
839 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
|
840 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
|
841 else |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
842 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
843 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
|
844 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
|
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 /* 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
|
848 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
|
849 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
850 /* 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
|
851 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
|
852 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
|
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 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
|
855 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
|
856 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
|
857 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
|
858 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
|
859 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
860 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
|
861 } /* 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
|
862 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
863 |
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 /* 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
|
865 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
|
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 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
|
868 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
|
869 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
|
870 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
|
871 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
|
872 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
|
873 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
|
874 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
875 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
|
876 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
877 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
|
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 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
|
880 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
|
881 { |
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 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
|
883 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
|
884 } /* 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
|
885 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
|
886 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
|
887 } /* 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
|
888 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
889 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
|
890 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
891 case SHN_TYPE_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
|
892 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
|
893 { |
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 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
|
895 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
|
896 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
897 for (i = 0; i < nitem; i++) |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
898 *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
|
899 } /* 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
|
900 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
|
901 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
902 for (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
|
903 { |
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 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
|
905 *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
|
906 } /* 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
|
907 } /* 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
|
908 } /* 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
|
909 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
|
910 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
911 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
|
912 { |
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 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
|
914 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
|
915 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
916 for (i = 0; i < nitem; i++) |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
917 *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
|
918 } /* 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
|
919 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
|
920 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
921 for (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
|
922 { |
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 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
|
924 *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
|
925 } /* 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
|
926 } /* 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
|
927 } /* 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
|
928 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
|
929 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
930 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
|
931 { |
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 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
|
933 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
|
934 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
935 for(i = 0; i < nitem; i++) |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
936 *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
|
937 } /* 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
|
938 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
|
939 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
940 for(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
|
941 { |
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 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
|
943 *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
|
944 } /* 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
|
945 } /* 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
|
946 } /* 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
|
947 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
|
948 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
949 case SHN_TYPE_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
|
950 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
|
951 { |
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 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
|
953 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
|
954 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
955 for (i = 0; i < nitem; i++) |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
956 *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
|
957 } /* 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
|
958 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
|
959 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
960 for (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
|
961 { |
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 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
|
963 *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
|
964 } /* 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
|
965 } /* 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
|
966 } /* 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
|
967 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
|
968 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
969 case SHN_TYPE_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
|
970 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
|
971 { |
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 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
|
973 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
|
974 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
975 for (i = 0; i < nitem; i++) |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
976 *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
|
977 } /* 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
|
978 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
|
979 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
980 for (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
|
981 { |
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 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
|
983 *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
|
984 } /* 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
|
985 } /* 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
|
986 } /* 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
|
987 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
|
988 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
989 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
|
990 { |
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 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
|
992 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
|
993 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
994 for(i = 0; i < nitem; i++) |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
995 *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
|
996 } /* 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
|
997 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
|
998 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
999 for(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
|
1000 { |
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 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
|
1002 *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
|
1003 } /* 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
|
1004 } /* 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
|
1005 } /* 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
|
1006 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
|
1007 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1008 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
|
1009 { |
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 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
|
1011 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
|
1012 { |
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 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
|
1014 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
|
1015 *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
|
1016 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
|
1017 *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
|
1018 } /* 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
|
1019 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
|
1020 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1021 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
|
1022 { |
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 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
|
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 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
|
1026 *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
|
1027 else |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1028 *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
|
1029 } /* for */ |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1030 } /* 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
|
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 } /* 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
|
1033 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
|
1034 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1035 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
|
1036 { |
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 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
|
1038 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
|
1039 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1040 for (i = 0; i < nitem; i++) |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1041 *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
|
1042 } /* 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
|
1043 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
|
1044 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1045 for (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
|
1046 { |
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 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
|
1048 *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
|
1049 } /* 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
|
1050 }/* 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
|
1051 } /* 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
|
1052 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
|
1053 } /* 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
|
1054 |
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 i = MIN_MACRO(internal->buffer_size - bw, bsiz); |
126 | 1056 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
|
1057 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
|
1058 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
|
1059 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
|
1060 } /* 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
|
1061 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1062 |
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 #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
|
1064 |
86 | 1065 static Uint32 SHN_read(Sound_Sample *sample) |
1066 { | |
101
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1067 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
|
1068 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
|
1069 Uint32 cpyBytes = 0; |
86 | 1070 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
|
1071 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
|
1072 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
|
1073 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
|
1074 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1075 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
|
1076 |
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 /* 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
|
1078 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
|
1079 { |
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 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
|
1081 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
|
1082 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
|
1083 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
|
1084 } /* 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
|
1085 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1086 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
|
1087 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1088 /* 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
|
1089 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
|
1090 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1091 if (!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
|
1092 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1093 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
|
1094 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
|
1095 } /* 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
|
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 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
|
1098 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1099 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
|
1100 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
|
1101 } /* 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
|
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 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
|
1104 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1105 case SHN_FN_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
|
1106 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
|
1107 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
|
1108 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
|
1109 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
|
1110 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
|
1111 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1112 Sint32 i; |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1113 Sint32 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
|
1114 Sint32 resn = 0, nlpc, j; |
86 | 1115 |
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
|
1116 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
|
1117 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1118 if (!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
|
1119 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1120 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
|
1121 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
|
1122 } /* if */ |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1123 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1124 /* 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
|
1125 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
|
1126 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
|
1127 } /* 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
|
1128 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1129 /* 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
|
1130 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
|
1131 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
|
1132 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
|
1133 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1134 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
|
1135 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
|
1136 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
|
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 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
|
1139 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
|
1140 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
|
1141 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
|
1142 } /* else */ |
86 | 1143 |
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
|
1144 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
|
1145 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1146 case SHN_FN_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
|
1147 for (i = 0; i < shn->blocksize; i++) |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1148 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
|
1149 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
|
1150 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1151 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
|
1152 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
|
1153 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1154 if (!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
|
1155 { |
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 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
|
1157 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
|
1158 } /* 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
|
1159 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
|
1160 } /* 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
|
1161 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
|
1162 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1163 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
|
1164 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
|
1165 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1166 if (!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
|
1167 { |
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 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
|
1169 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
|
1170 } /* 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
|
1171 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
|
1172 } /* 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
|
1173 break; |
86 | 1174 |
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
|
1175 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
|
1176 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
|
1177 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1178 if (!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
|
1179 { |
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 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
|
1181 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
|
1182 } /* 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
|
1183 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
|
1184 } /* 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
|
1185 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
|
1186 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1187 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
|
1188 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
|
1189 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1190 if (!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
|
1191 { |
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 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
|
1193 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
|
1194 } /* 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
|
1195 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
|
1196 } /* 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
|
1197 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
|
1198 |
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 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
|
1200 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
|
1201 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1202 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
|
1203 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
|
1204 } /* 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
|
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 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
|
1207 { |
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 (!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
|
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 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
|
1211 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
|
1212 } /* 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
|
1213 } /* 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
|
1214 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1215 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
|
1216 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
|
1217 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1218 for(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
|
1219 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1220 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
|
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(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
|
1223 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
|
1224 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1225 if (!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
|
1226 { |
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 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
|
1228 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
|
1229 } /* 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
|
1230 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
|
1231 } /* for */ |
86 | 1232 |
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
|
1233 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
|
1234 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1235 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
|
1236 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
|
1237 } /* 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
|
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 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
|
1240 } /* 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
|
1241 |
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 /* 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
|
1243 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
|
1244 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1245 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
|
1246 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
|
1247 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
|
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 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
|
1250 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
|
1251 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1252 if (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
|
1253 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
|
1254 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
|
1255 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
|
1256 } /* 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
|
1257 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1258 /* 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
|
1259 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
|
1260 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
|
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 fix_bitshift(cbuffer, shn->blocksize, shn->bitshift, shn->datatype); |
86 | 1263 |
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
|
1264 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
|
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 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
|
1267 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
|
1268 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
|
1269 } /* 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
|
1270 |
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 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
|
1272 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
|
1273 } /* case */ |
86 | 1274 |
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
|
1275 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
|
1276 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
|
1277 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
|
1278 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1279 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
|
1280 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
|
1281 } /* 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
|
1282 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
|
1283 |
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 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
|
1285 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
|
1286 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1287 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
|
1288 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
|
1289 } /* 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
|
1290 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
|
1291 |
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 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
|
1293 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
|
1294 Sound_SetError("SHN: Unhandled function."); |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1295 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
|
1296 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
|
1297 } /* 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
|
1298 } /* while */ |
86 | 1299 |
1300 return(retval); | |
1301 } /* SHN_read */ | |
1302 | |
221
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
212
diff
changeset
|
1303 |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
212
diff
changeset
|
1304 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
|
1305 { |
233
15a3b1a1291c
Kludged implementation of the rewind method.
Ryan C. Gordon <icculus@icculus.org>
parents:
221
diff
changeset
|
1306 Sound_SampleInternal *internal = (Sound_SampleInternal *) sample->opaque; |
15a3b1a1291c
Kludged implementation of the rewind method.
Ryan C. Gordon <icculus@icculus.org>
parents:
221
diff
changeset
|
1307 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
|
1308 |
15a3b1a1291c
Kludged implementation of the rewind method.
Ryan C. Gordon <icculus@icculus.org>
parents:
221
diff
changeset
|
1309 #if 0 |
15a3b1a1291c
Kludged implementation of the rewind method.
Ryan C. Gordon <icculus@icculus.org>
parents:
221
diff
changeset
|
1310 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
|
1311 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
|
1312 /* !!! FIXME: set state. */ |
15a3b1a1291c
Kludged implementation of the rewind method.
Ryan C. Gordon <icculus@icculus.org>
parents:
221
diff
changeset
|
1313 return(1); |
15a3b1a1291c
Kludged implementation of the rewind method.
Ryan C. Gordon <icculus@icculus.org>
parents:
221
diff
changeset
|
1314 #else |
15a3b1a1291c
Kludged implementation of the rewind method.
Ryan C. Gordon <icculus@icculus.org>
parents:
221
diff
changeset
|
1315 /* |
15a3b1a1291c
Kludged implementation of the rewind method.
Ryan C. Gordon <icculus@icculus.org>
parents:
221
diff
changeset
|
1316 * !!! 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
|
1317 * !!! 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
|
1318 * !!! 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
|
1319 * !!! FIXME: risk of failure. |
15a3b1a1291c
Kludged implementation of the rewind method.
Ryan C. Gordon <icculus@icculus.org>
parents:
221
diff
changeset
|
1320 */ |
15a3b1a1291c
Kludged implementation of the rewind method.
Ryan C. Gordon <icculus@icculus.org>
parents:
221
diff
changeset
|
1321 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
|
1322 SHN_close(sample); |
15a3b1a1291c
Kludged implementation of the rewind method.
Ryan C. Gordon <icculus@icculus.org>
parents:
221
diff
changeset
|
1323 return(SHN_open(sample, "SHN")); |
15a3b1a1291c
Kludged implementation of the rewind method.
Ryan C. Gordon <icculus@icculus.org>
parents:
221
diff
changeset
|
1324 #endif |
221
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
212
diff
changeset
|
1325 } /* SHN_rewind */ |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
212
diff
changeset
|
1326 |
306
c97be6e1bd27
Added framework for Sound_Seek() support.
Ryan C. Gordon <icculus@icculus.org>
parents:
301
diff
changeset
|
1327 |
c97be6e1bd27
Added framework for Sound_Seek() support.
Ryan C. Gordon <icculus@icculus.org>
parents:
301
diff
changeset
|
1328 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
|
1329 { |
351 | 1330 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
|
1331 } /* SHN_seek */ |
c97be6e1bd27
Added framework for Sound_Seek() support.
Ryan C. Gordon <icculus@icculus.org>
parents:
301
diff
changeset
|
1332 |
c97be6e1bd27
Added framework for Sound_Seek() support.
Ryan C. Gordon <icculus@icculus.org>
parents:
301
diff
changeset
|
1333 |
86 | 1334 #endif /* defined SOUND_SUPPORTS_SHN */ |
1335 | |
1336 /* end of shn.c ... */ | |
1337 |