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
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1 /*
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
2 * SDL_sound -- An abstract sound format decoding API.
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
3 * Copyright (C) 2001 Ryan C. Gordon.
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
4 *
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
5 * This library is free software; you can redistribute it and/or
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
6 * modify it under the terms of the GNU Lesser General Public
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
7 * License as published by the Free Software Foundation; either
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
8 * version 2.1 of the License, or (at your option) any later version.
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
9 *
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
10 * This library is distributed in the hope that it will be useful,
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
13 * Lesser General Public License for more details.
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
14 *
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
15 * You should have received a copy of the GNU Lesser General Public
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
16 * License along with this library; if not, write to the Free Software
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
18 */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
19
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
20 /*
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
21 * Shorten decoder for SDL_sound.
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
22 *
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
23 * This driver handles Shorten-compressed waveforms. Despite the fact that
101
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
24 * SHNs are popular in online music trading communities, they tend to be
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
25 * much bigger than MP3s. If an MP3 crunches the waveform to 10-20 percent
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
26 * of its original size, SHNs only go to about 50-60%. Why do the Phish fans
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
27 * of the world use this format then? Rabid music traders appreciate the
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
28 * sound quality; SHNs, unlike MP3s, do not throw away any part of the
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
29 * waveform. Yes, there are people that notice this, and further more, they
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
30 * demand it...and if they can't get a good transfer of those larger files
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
31 * over the 'net, they haven't underestimated the bandwidth of CDs travelling
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
32 * the world through the postal system.
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
33 *
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
34 * Shorten homepage: http://www.softsound.com/Shorten.html
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
35 *
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
36 * The Shorten format was gleaned from the shorten codebase, by Tony
101
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
37 * Robinson and SoftSound Limited.
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
38 *
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
39 * Please see the file LICENSE in the source's root directory.
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
40 *
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
41 * This file written by Ryan C. Gordon. (icculus@clutteredmind.org)
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
42 */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
43
104
103cfcb3c014 Updated to fix build system problem.
Ryan C. Gordon <icculus@icculus.org>
parents: 101
diff changeset
44 #include "SDL_sound.h"
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
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
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
51 #include <stdio.h>
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
52 #include <stdlib.h>
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
53 #include <string.h>
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
54 #include <assert.h>
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
55
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
56
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
57 static int SHN_init(void);
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
58 static void SHN_quit(void);
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
59 static int SHN_open(Sound_Sample *sample, const char *ext);
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
60 static void SHN_close(Sound_Sample *sample);
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
61 static Uint32 SHN_read(Sound_Sample *sample);
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
62
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
63 const Sound_DecoderFunctions __Sound_DecoderFunctions_SHN =
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
64 {
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
65 {
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
66 "SHN",
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
67 "Shorten-compressed audio data",
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
68 "Ryan C. Gordon <icculus@clutteredmind.org>",
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
69 "http://www.icculus.org/SDL_sound/"
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
70 },
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
71
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
72 SHN_init, /* init() method */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
73 SHN_quit, /* quit() method */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
74 SHN_open, /* open() method */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
75 SHN_close, /* close() method */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
76 SHN_read /* read() method */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
77 };
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
78
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
79
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
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
326 static int SHN_init(void)
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
327 {
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
328 return(1); /* initialization always successful. */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
329 } /* SHN_init */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
330
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
331
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
332 static void SHN_quit(void)
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
333 {
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
334 /* it's a no-op. */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
335 } /* SHN_quit */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
336
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
337
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
338 /*
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
339 * Look through the whole file for a SHN magic number. This is costly, so
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
340 * it should only be done if the user SWEARS they have a Shorten stream...
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
341 */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
342 static inline int extended_shn_magic_search(Sound_Sample *sample)
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
343 {
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
344 SDL_RWops *rw = ((Sound_SampleInternal *) sample->opaque)->rw;
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
345 Uint32 word = 0;
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
346 Uint8 ch;
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
347
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
348 while (1)
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
349 {
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
350 BAIL_IF_MACRO(SDL_RWread(rw, &ch, sizeof (ch), 1) != 1, NULL, -1);
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
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
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
353 {
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
354 BAIL_IF_MACRO(SDL_RWread(rw, &ch, sizeof (ch), 1) != 1, NULL, -1);
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
355 return((int) ch);
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
356 } /* if */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
357 } /* while */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
358
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
359 return((int) ch);
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
360 } /* extended_shn_magic_search */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
361
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
362
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
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
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
365 {
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
366 SDL_RWops *rw = ((Sound_SampleInternal *) sample->opaque)->rw;
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
367 Uint32 magic;
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
368 Uint8 ch;
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
369
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
370 /*
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
371 * Apparently the magic number can start at any byte offset in the file,
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
372 * and we should just discard prior data, but I'm going to restrict it
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
373 * to offset zero for now, so we don't chug down every file that might
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
374 * happen to pass through here. If the extension is explicitly "SHN", we
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
375 * check the whole stream, though.
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
376 */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
377
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
378 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
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
380
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
381 BAIL_IF_MACRO(SDL_RWread(rw, &magic, sizeof (magic), 1) != 1, NULL, -1);
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
382 BAIL_IF_MACRO(SDL_SwapLE32(magic) != MAGIC_NUM, "SHN: Not a SHN file", -1);
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
383 BAIL_IF_MACRO(SDL_RWread(rw, &ch, sizeof (ch), 1) != 1, NULL, -1);
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
384 BAIL_IF_MACRO(ch > 3, "SHN: Unsupported file version", -1);
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
385
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
386 return((int) ch);
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
387 } /* determine_shn_version */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
388
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
389
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
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
576 static int SHN_open(Sound_Sample *sample, const char *ext)
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
577 {
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
578 Sound_SampleInternal *internal = (Sound_SampleInternal *) sample->opaque;
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
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
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
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
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
682
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
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
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
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
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
714
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
715
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
716 static void SHN_close(Sound_Sample *sample)
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
717 {
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
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
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
737 } /* SHN_close */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
738
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
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
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1053 static Uint32 SHN_read(Sound_Sample *sample)
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
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
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
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
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
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
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
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
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
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
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
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
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
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
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
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
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1287
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1288 return(retval);
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1289 } /* SHN_read */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1290
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1291 #endif /* defined SOUND_SUPPORTS_SHN */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1292
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1293 /* end of shn.c ... */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1294