Mercurial > SDL_sound_CoreAudio
annotate decoders/shn.c @ 104:103cfcb3c014
Updated to fix build system problem.
author | Ryan C. Gordon <icculus@icculus.org> |
---|---|
date | Wed, 03 Oct 2001 18:15:52 +0000 |
parents | c08794028df4 |
children | 40de367eb59e |
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 | |
101
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
24 * SHNs are popular in online music trading communities, they tend to be |
86 | 25 * much bigger than MP3s. If an MP3 crunches the waveform to 10-20 percent |
26 * of its original size, SHNs only go to about 50-60%. Why do the Phish fans | |
27 * of the world use this format then? Rabid music traders appreciate the | |
28 * sound quality; SHNs, unlike MP3s, do not throw away any part of the | |
29 * waveform. Yes, there are people that notice this, and further more, they | |
30 * demand it...and if they can't get a good transfer of those larger files | |
31 * over the 'net, they haven't underestimated the bandwidth of CDs travelling | |
32 * the world through the postal system. | |
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 * |
39 * Please see the file LICENSE in the source's root directory. | |
40 * | |
41 * This file written by Ryan C. Gordon. (icculus@clutteredmind.org) | |
42 */ | |
43 | |
104
103cfcb3c014
Updated to fix build system problem.
Ryan C. Gordon <icculus@icculus.org>
parents:
101
diff
changeset
|
44 #include "SDL_sound.h" |
86 | 45 |
100
6d9fdec2f708
added config.h, added --enable-debug flag, various other changes to the build system
fingolfin
parents:
86
diff
changeset
|
46 #define __SDL_SOUND_INTERNAL__ |
6d9fdec2f708
added config.h, added --enable-debug flag, various other changes to the build system
fingolfin
parents:
86
diff
changeset
|
47 #include "SDL_sound_internal.h" |
6d9fdec2f708
added config.h, added --enable-debug flag, various other changes to the build system
fingolfin
parents:
86
diff
changeset
|
48 |
104
103cfcb3c014
Updated to fix build system problem.
Ryan C. Gordon <icculus@icculus.org>
parents:
101
diff
changeset
|
49 #if (defined SOUND_SUPPORTS_SHN) |
103cfcb3c014
Updated to fix build system problem.
Ryan C. Gordon <icculus@icculus.org>
parents:
101
diff
changeset
|
50 |
86 | 51 #include <stdio.h> |
52 #include <stdlib.h> | |
53 #include <string.h> | |
54 #include <assert.h> | |
55 | |
56 | |
57 static int SHN_init(void); | |
58 static void SHN_quit(void); | |
59 static int SHN_open(Sound_Sample *sample, const char *ext); | |
60 static void SHN_close(Sound_Sample *sample); | |
61 static Uint32 SHN_read(Sound_Sample *sample); | |
62 | |
63 const Sound_DecoderFunctions __Sound_DecoderFunctions_SHN = | |
64 { | |
65 { | |
66 "SHN", | |
67 "Shorten-compressed audio data", | |
68 "Ryan C. Gordon <icculus@clutteredmind.org>", | |
69 "http://www.icculus.org/SDL_sound/" | |
70 }, | |
71 | |
72 SHN_init, /* init() method */ | |
73 SHN_quit, /* quit() method */ | |
74 SHN_open, /* open() method */ | |
75 SHN_close, /* close() method */ | |
76 SHN_read /* read() method */ | |
77 }; | |
78 | |
79 | |
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
|
80 #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
|
81 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
82 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
|
83 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
84 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
|
85 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
|
86 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
|
87 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
|
88 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
|
89 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
|
90 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
|
91 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
|
92 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
|
93 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
|
94 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
|
95 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
|
96 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
|
97 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
|
98 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
|
99 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
|
100 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
|
101 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
|
102 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
|
103 Uint32 backBufLeft; |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
104 } 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
|
105 |
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 |
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 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
|
108 { |
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 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
|
110 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
|
111 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
|
112 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
|
113 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
|
114 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
|
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 |
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 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
|
119 {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
|
120 {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
|
121 {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
|
122 {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
|
123 {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
|
124 {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
|
125 {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
|
126 {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
|
127 {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
|
128 {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
|
129 {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
|
130 {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
|
131 {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
|
132 }; |
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 |
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 |
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 #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
|
136 #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
|
137 #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
|
138 |
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 #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
|
140 #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
|
141 #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
|
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 #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
|
144 #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
|
145 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
146 #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
|
147 #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
|
148 #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
|
149 #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
|
150 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
151 #define 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
|
152 #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
|
153 #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
|
154 #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
|
155 #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
|
156 #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
|
157 #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
|
158 #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
|
159 #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
|
160 #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
|
161 #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
|
162 #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
|
163 |
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 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
|
165 #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
|
166 |
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 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
|
168 #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
|
169 #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
|
170 #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
|
171 #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
|
172 #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
|
173 #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
|
174 #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
|
175 #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
|
176 #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
|
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
|
178 #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
|
179 #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
|
180 #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
|
181 #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
|
182 #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
|
183 #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
|
184 #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
|
185 #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
|
186 #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
|
187 #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
|
188 #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
|
189 #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
|
190 #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
|
191 #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
|
192 #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
|
193 |
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_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
|
195 #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
|
196 #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
|
197 #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
|
198 #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
|
199 #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
|
200 #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
|
201 #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
|
202 #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
|
203 #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
|
204 #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
|
205 #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
|
206 |
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_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
|
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
|
209 |
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 MAGIC_NUM 0x676B6A61 /* looks like "ajkg" as chars. */ |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
211 |
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 #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
|
213 #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
|
214 #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
|
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 #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
|
217 #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
|
218 #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
|
219 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
220 |
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 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
|
222 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
223 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
|
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 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
|
226 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
|
227 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
|
228 } /* 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
|
229 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
230 if (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
|
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 *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
|
233 (((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
|
234 (((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
|
235 (((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
|
236 } /* if */ |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
237 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
238 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
|
239 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
|
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 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
|
242 } /* 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
|
243 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
244 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
245 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
|
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 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
|
248 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
249 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
|
250 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
251 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
|
252 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
|
253 } /* 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
|
254 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
255 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
|
256 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
257 if (shn->nbitget == 0) |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
258 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
259 BAIL_IF_MACRO(!word_get(shn, rw, &shn->gbuffer), NULL, 0); |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
260 shn->nbitget = 32; |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
261 } /* if */ |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
262 } /* 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
|
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 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
|
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 >= 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
|
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 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
|
269 ((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
|
270 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
|
271 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
|
272 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
|
273 } /* 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
|
274 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
|
275 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
276 result = (result << 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
|
277 (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
|
278 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
|
279 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
|
280 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
|
281 } /* else */ |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
282 } /* 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
|
283 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
284 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
|
285 *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
|
286 |
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 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
|
288 } /* 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
|
289 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
290 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
291 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
|
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 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
|
294 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
295 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
|
296 *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
|
297 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
|
298 *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
|
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 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
|
301 } /* 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
|
302 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
303 |
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 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
|
305 { |
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 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
|
307 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
|
308 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
|
309 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
|
310 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
311 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
|
312 *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
|
313 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
314 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
|
315 } /* 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
|
316 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
317 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
318 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
|
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 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
|
321 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
|
322 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
|
323 } /* 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
|
324 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
325 |
86 | 326 static int SHN_init(void) |
327 { | |
328 return(1); /* initialization always successful. */ | |
329 } /* SHN_init */ | |
330 | |
331 | |
332 static void SHN_quit(void) | |
333 { | |
334 /* it's a no-op. */ | |
335 } /* SHN_quit */ | |
336 | |
337 | |
338 /* | |
339 * Look through the whole file for a SHN magic number. This is costly, so | |
340 * it should only be done if the user SWEARS they have a Shorten stream... | |
341 */ | |
342 static inline int extended_shn_magic_search(Sound_Sample *sample) | |
343 { | |
344 SDL_RWops *rw = ((Sound_SampleInternal *) sample->opaque)->rw; | |
345 Uint32 word = 0; | |
346 Uint8 ch; | |
347 | |
348 while (1) | |
349 { | |
350 BAIL_IF_MACRO(SDL_RWread(rw, &ch, sizeof (ch), 1) != 1, NULL, -1); | |
351 word = ((word << 8) & 0xFFFFFF00) | ch; | |
101
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
352 if (SDL_SwapBE32(word) == MAGIC_NUM) |
86 | 353 { |
354 BAIL_IF_MACRO(SDL_RWread(rw, &ch, sizeof (ch), 1) != 1, NULL, -1); | |
355 return((int) ch); | |
356 } /* if */ | |
357 } /* while */ | |
358 | |
359 return((int) ch); | |
360 } /* extended_shn_magic_search */ | |
361 | |
362 | |
363 /* 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
|
364 static inline int determine_shn_version(Sound_Sample *sample, const char *ext) |
86 | 365 { |
366 SDL_RWops *rw = ((Sound_SampleInternal *) sample->opaque)->rw; | |
367 Uint32 magic; | |
368 Uint8 ch; | |
369 | |
370 /* | |
371 * Apparently the magic number can start at any byte offset in the file, | |
372 * and we should just discard prior data, but I'm going to restrict it | |
373 * to offset zero for now, so we don't chug down every file that might | |
374 * happen to pass through here. If the extension is explicitly "SHN", we | |
375 * check the whole stream, though. | |
376 */ | |
377 | |
378 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
|
379 return(extended_shn_magic_search(sample)); |
86 | 380 |
381 BAIL_IF_MACRO(SDL_RWread(rw, &magic, sizeof (magic), 1) != 1, NULL, -1); | |
382 BAIL_IF_MACRO(SDL_SwapLE32(magic) != MAGIC_NUM, "SHN: Not a SHN file", -1); | |
383 BAIL_IF_MACRO(SDL_RWread(rw, &ch, sizeof (ch), 1) != 1, NULL, -1); | |
384 BAIL_IF_MACRO(ch > 3, "SHN: Unsupported file version", -1); | |
385 | |
386 return((int) ch); | |
387 } /* determine_shn_version */ | |
388 | |
389 | |
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
|
390 static int init_shn_offset(Sint32 **offset, int nchan, int nblock, int ftype) |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
391 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
392 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
|
393 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
|
394 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
395 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
|
396 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
397 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
|
398 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
|
399 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
|
400 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
|
401 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
|
402 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
|
403 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
|
404 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
|
405 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
|
406 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
|
407 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
|
408 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
|
409 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
|
410 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
|
411 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
|
412 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
|
413 break; |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
414 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
|
415 BAIL_MACRO("SHN: unknown file type", 0); |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
416 } /* 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
|
417 |
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 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
|
419 { |
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 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
|
421 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
|
422 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
|
423 } /* 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
|
424 } /* 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
|
425 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
426 |
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 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
|
428 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
429 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
|
430 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
431 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
|
432 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
|
433 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
434 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
|
435 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
|
436 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
|
437 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
|
438 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
|
439 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
|
440 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
|
441 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
442 case SHN_TYPE_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
|
443 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
|
444 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
445 case SHN_TYPE_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
|
446 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
|
447 |
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_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
|
449 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
|
450 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
451 case SHN_TYPE_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
|
452 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
|
453 } /* 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
|
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 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
|
456 } /* 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
|
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 |
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 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
|
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 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
|
462 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
|
463 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
|
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 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
|
466 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
|
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 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
|
469 } /* 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
|
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 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
|
472 } /* 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
|
473 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
474 |
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 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
|
476 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
477 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
|
478 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
|
479 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
480 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
|
481 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
|
482 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
483 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
|
484 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
|
485 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
|
486 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
|
487 } /* 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
|
488 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
489 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
|
490 } /* 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
|
491 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
492 #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
|
493 #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
|
494 #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
|
495 #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
|
496 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
497 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
|
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 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
|
500 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
|
501 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
|
502 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
503 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
|
504 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
505 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
|
506 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
|
507 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
|
508 } /* 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
|
509 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
510 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
|
511 *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
|
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 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
|
514 } /* 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
|
515 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
516 |
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 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
|
518 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
519 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
|
520 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
|
521 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
|
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 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
|
524 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
525 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
|
526 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
|
527 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
|
528 } /* 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
|
529 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
530 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
|
531 *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
|
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 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
|
534 } /* 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
|
535 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
536 |
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 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
|
538 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
539 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
|
540 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
|
541 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
|
542 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
|
543 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
|
544 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
545 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
|
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 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
|
548 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
|
549 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
|
550 |
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 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
|
552 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
|
553 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
554 BAIL_IF_MACRO(!verb_ReadLE32(shn, rw, &u32), NULL, 0); /* '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
|
555 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
|
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); /* 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
|
558 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
|
559 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
|
560 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
|
561 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
|
562 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
|
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); /* 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
|
565 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
|
566 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
|
567 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
568 BAIL_IF_MACRO(!verb_ReadLE32(shn, rw, &u32), NULL, 0); /* '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
|
569 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
|
570 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
|
571 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
572 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
|
573 } /* 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
|
574 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
575 |
86 | 576 static int SHN_open(Sound_Sample *sample, const char *ext) |
577 { | |
578 Sound_SampleInternal *internal = (Sound_SampleInternal *) sample->opaque; | |
579 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
|
580 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
|
581 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
|
582 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
|
583 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
|
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 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
|
586 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
|
587 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
|
588 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
|
589 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
|
590 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
|
591 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
|
592 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
|
593 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
594 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
|
595 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
|
596 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
|
597 |
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 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
|
599 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
|
600 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
601 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
|
602 goto shn_open_puke; |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
603 } /* if */ |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
604 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
605 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
|
606 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
607 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
|
608 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
|
609 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
|
610 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
|
611 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
|
612 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
|
613 } /* 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
|
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 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
|
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 /* 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
|
618 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
|
619 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
|
620 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
621 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
|
622 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
623 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
|
624 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
|
625 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
|
626 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
|
627 } /* for */ |
86 | 628 |
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
|
629 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
|
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 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
|
632 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
|
633 { |
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 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
|
635 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
|
636 } /* 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
|
637 } /* 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
|
638 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
639 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
|
640 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
|
641 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
642 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
|
643 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
|
644 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
645 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
|
646 (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
|
647 (!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
|
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 (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
|
650 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
|
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 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
|
653 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
|
654 } /* 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
|
655 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
656 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
|
657 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
|
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 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
|
660 goto shn_open_puke; |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
661 } /* if */ |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
662 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
663 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
|
664 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
|
665 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
666 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
|
667 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
|
668 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
|
669 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
670 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
|
671 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
|
672 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
|
673 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
|
674 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
|
675 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
|
676 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
|
677 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
|
678 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
|
679 |
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(0); |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
681 } /* SHN_open */ |
86 | 682 |
683 | |
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
|
684 void fix_bitshift(Sint32 *buffer, int nitem, int bitshift, int ftype) |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
685 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
686 int i; |
86 | 687 |
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
|
688 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
|
689 { |
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 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
|
691 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
|
692 } /* 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
|
693 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
|
694 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
695 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
|
696 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
697 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
|
698 buffer[i] = ulaw_outward[bitshift][buffer[i] + 128]; |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
699 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
|
700 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
|
701 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
|
702 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
|
703 } /* 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
|
704 } /* 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
|
705 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
|
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 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
|
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 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
|
710 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
|
711 } /* if */ |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
712 } /* else */ |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
713 } /* fix_bitshift */ |
86 | 714 |
715 | |
716 static void SHN_close(Sound_Sample *sample) | |
717 { | |
718 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
|
719 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
|
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 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
|
722 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
|
723 |
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 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
|
725 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
|
726 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
727 if (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
|
728 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
|
729 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
730 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
|
731 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
|
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->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
|
734 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
|
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 free(shn); |
86 | 737 } /* SHN_close */ |
738 | |
739 | |
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
|
740 /* 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
|
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 /* 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
|
743 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
|
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 /* |
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 ** 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
|
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 ** 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
|
749 ** 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
|
750 ** 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
|
751 ** |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
752 ** 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
|
753 ** 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
|
754 ** 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
|
755 ** 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
|
756 ** 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
|
757 ** 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
|
758 ** 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
|
759 ** 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
|
760 ** 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
|
761 ** |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
762 ** 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
|
763 ** 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
|
764 */ |
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 |
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 #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
|
767 #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
|
768 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
769 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
|
770 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
|
771 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
|
772 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
|
773 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
|
774 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
|
775 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
|
776 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
|
777 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
|
778 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
|
779 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
|
780 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
|
781 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
|
782 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
|
783 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
|
784 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
|
785 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
|
786 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7}; |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
787 |
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 /* 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
|
789 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
|
790 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
|
791 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
|
792 { |
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 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
|
794 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
|
795 } /* 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
|
796 |
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 /* 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
|
798 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
|
799 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
|
800 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
801 /* 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
|
802 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
|
803 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
|
804 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
|
805 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
|
806 |
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 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
|
808 } /* 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
|
809 |
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 |
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 /* 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
|
812 #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
|
813 #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
|
814 #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
|
815 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
816 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
817 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
|
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 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
|
820 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
|
821 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
|
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 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
|
824 }; |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
825 |
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 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
|
827 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
|
828 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
|
829 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
|
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 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
|
832 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
|
833 } /* 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
|
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 /* 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
|
836 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
|
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 /* 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
|
839 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
|
840 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
|
841 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
842 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
|
843 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
|
844 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
|
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 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
|
847 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
848 return (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
|
849 } /* 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
|
850 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
851 |
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 /* 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
|
853 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
|
854 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
855 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
|
856 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
|
857 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
|
858 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
|
859 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
|
860 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
|
861 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
|
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 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
|
864 |
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 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
|
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 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
|
868 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
|
869 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
870 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
|
871 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
|
872 } /* 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
|
873 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
|
874 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
|
875 } /* 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
|
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 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
|
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 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
|
880 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
|
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 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
|
883 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
|
884 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
885 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
|
886 *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
|
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 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
|
889 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
890 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
|
891 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
892 for (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
|
893 *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
|
894 } /* 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
|
895 } /* else */ |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
896 } /* 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
|
897 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
|
898 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
899 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
|
900 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
901 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
|
902 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
|
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 (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
|
905 *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
|
906 } /* 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
|
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 { |
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 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
|
910 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
911 for (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
|
912 *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
|
913 } /* 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
|
914 } /* else */ |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
915 } /* 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
|
916 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
|
917 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
918 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
|
919 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
920 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
|
921 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
|
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(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
|
924 *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
|
925 } /* 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
|
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 { |
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 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
|
929 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
930 for(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
|
931 *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
|
932 } /* 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
|
933 } /* else */ |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
934 } /* 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
|
935 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
|
936 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
937 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
|
938 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
|
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 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
|
941 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
|
942 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
943 for (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
|
944 *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
|
945 } /* 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
|
946 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
|
947 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
948 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
|
949 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
950 for (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
|
951 *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
|
952 } /* 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
|
953 } /* else */ |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
954 } /* 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
|
955 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
|
956 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
957 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
|
958 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
|
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 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
|
961 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
|
962 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
963 for (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
|
964 *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
|
965 } /* 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
|
966 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
|
967 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
968 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
|
969 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
970 for (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
|
971 *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
|
972 } /* 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
|
973 } /* else */ |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
974 } /* 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
|
975 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
|
976 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
977 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
|
978 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
979 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
|
980 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
|
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(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
|
983 *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
|
984 } /* 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
|
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 { |
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 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
|
988 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
989 for(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
|
990 *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
|
991 } /* 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
|
992 } /* else */ |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
993 } /* 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
|
994 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
|
995 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
996 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
|
997 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
998 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
|
999 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
|
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 (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
|
1002 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
|
1003 *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
|
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 *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
|
1006 } /* 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
|
1007 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
|
1008 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1009 for (i = 0; i < nitem; i++) |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1010 { |
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 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
|
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 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
|
1014 *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
|
1015 else |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1016 *writebufp++ = (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
|
1017 } /* 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
|
1018 } /* 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
|
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 } /* 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
|
1021 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
|
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 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
|
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 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
|
1026 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
|
1027 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1028 for (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
|
1029 *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
|
1030 } /* 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
|
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 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1033 for (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
|
1034 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1035 for(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
|
1036 *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
|
1037 } /* 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
|
1038 }/* else */ |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1039 } /* 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
|
1040 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
|
1041 } /* 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
|
1042 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1043 i = MIN_MACRO(internal->buffer_size - bw, 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
|
1044 memcpy(internal->buffer + bw, shn->backBuffer, i); |
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 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
|
1046 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
|
1047 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
|
1048 } /* 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
|
1049 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1050 |
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 #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
|
1052 |
86 | 1053 static Uint32 SHN_read(Sound_Sample *sample) |
1054 { | |
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
|
1055 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
|
1056 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
|
1057 Uint32 cpyBytes = 0; |
86 | 1058 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
|
1059 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
|
1060 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
|
1061 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
|
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 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
|
1064 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1065 /* 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
|
1066 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
|
1067 { |
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 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
|
1069 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
|
1070 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
|
1071 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
|
1072 } /* 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
|
1073 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1074 assert((shn->backBufLeft == 0) || (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
|
1075 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1076 /* 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
|
1077 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
|
1078 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1079 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
|
1080 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1081 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
|
1082 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
|
1083 } /* if */ |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1084 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1085 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
|
1086 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1087 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
|
1088 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
|
1089 } /* 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
|
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 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
|
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 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
|
1094 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
|
1095 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
|
1096 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
|
1097 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
|
1098 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
|
1099 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1100 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
|
1101 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
|
1102 Sint32 resn = 0, nlpc, j; |
86 | 1103 |
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
|
1104 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
|
1105 { |
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 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
|
1107 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1108 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
|
1109 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
|
1110 } /* 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
|
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 /* 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
|
1113 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
|
1114 resn--; |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1115 } /* 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
|
1116 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1117 /* 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
|
1118 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
|
1119 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
|
1120 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
|
1121 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1122 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
|
1123 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
|
1124 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
|
1125 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1126 if (shn->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
|
1127 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
|
1128 else |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1129 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
|
1130 } /* else */ |
86 | 1131 |
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
|
1132 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
|
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 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
|
1135 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
|
1136 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
|
1137 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
|
1138 |
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 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
|
1140 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
|
1141 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1142 if (!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
|
1143 { |
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 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
|
1145 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
|
1146 } /* 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
|
1147 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
|
1148 } /* 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
|
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_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
|
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] += 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
|
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; |
86 | 1162 |
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
|
1163 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
|
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] += (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
|
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; |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1174 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1175 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
|
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] += 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
|
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_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
|
1188 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
|
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 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
|
1191 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
|
1192 } /* 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
|
1193 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1194 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
|
1195 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1196 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
|
1197 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1198 sample->flags |= SOUND_SAMPLEFLAG_ERROR; |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1199 return(retval); |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1200 } /* if */ |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1201 } /* 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
|
1202 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1203 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
|
1204 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
|
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 < 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
|
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 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
|
1209 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1210 for(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
|
1211 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
|
1212 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1213 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
|
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 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
|
1216 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
|
1217 } /* 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
|
1218 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
|
1219 } /* for */ |
86 | 1220 |
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
|
1221 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
|
1222 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1223 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
|
1224 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
|
1225 } /* if */ |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1226 |
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 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
|
1228 } /* 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
|
1229 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1230 /* 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
|
1231 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
|
1232 { |
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 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
|
1234 for (i = 0; i < shn->blocksize; i++) |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1235 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
|
1236 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1237 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
|
1238 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
|
1239 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1240 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
|
1241 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
|
1242 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
|
1243 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
|
1244 } /* 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
|
1245 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1246 /* 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
|
1247 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
|
1248 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
|
1249 |
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 fix_bitshift(cbuffer, shn->blocksize, shn->bitshift, shn->datatype); |
86 | 1251 |
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
|
1252 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
|
1253 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1254 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
|
1255 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
|
1256 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
|
1257 } /* 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
|
1258 |
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 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
|
1260 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
|
1261 } /* case */ |
86 | 1262 |
101
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1263 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
|
1264 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
|
1265 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
|
1266 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1267 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 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
|
1271 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1272 case 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
|
1273 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
|
1274 { |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1275 sample->flags |= SOUND_SAMPLEFLAG_ERROR; |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1276 return(retval); |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1277 } /* if */ |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1278 break; |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1279 |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1280 case SHN_FN_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
|
1281 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
|
1282 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
|
1283 sample->flags |= SOUND_SAMPLEFLAG_ERROR; |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1284 return(retval); |
c08794028df4
Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
1285 } /* 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
|
1286 } /* while */ |
86 | 1287 |
1288 return(retval); | |
1289 } /* SHN_read */ | |
1290 | |
1291 #endif /* defined SOUND_SUPPORTS_SHN */ | |
1292 | |
1293 /* end of shn.c ... */ | |
1294 |