annotate decoders/shn.c @ 101:c08794028df4

Fully implemented. Needs testing, but it works on the Grateful Dead show I leeched through etree.org. :)
author Ryan C. Gordon <icculus@icculus.org>
date Wed, 03 Oct 2001 17:59:14 +0000
parents 6d9fdec2f708
children 103cfcb3c014
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
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
44 #if (defined SOUND_SUPPORTS_SHN)
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
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
49 #include <stdio.h>
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
50 #include <stdlib.h>
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
51 #include <string.h>
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
52 #include <assert.h>
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
53 #include "SDL_sound.h"
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
54
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 static int SHN_init(void);
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
57 static void SHN_quit(void);
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
58 static int SHN_open(Sound_Sample *sample, const char *ext);
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
59 static void SHN_close(Sound_Sample *sample);
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
60 static Uint32 SHN_read(Sound_Sample *sample);
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
61
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
62 const Sound_DecoderFunctions __Sound_DecoderFunctions_SHN =
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
63 {
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
64 {
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
65 "SHN",
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
66 "Shorten-compressed audio data",
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
67 "Ryan C. Gordon <icculus@clutteredmind.org>",
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
68 "http://www.icculus.org/SDL_sound/"
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
69 },
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 SHN_init, /* init() method */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
72 SHN_quit, /* quit() method */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
73 SHN_open, /* open() method */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
74 SHN_close, /* close() method */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
75 SHN_read /* read() method */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
76 };
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
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
79 #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
80
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 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
82 {
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 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
84 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
85 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
86 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
87 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
88 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
89 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
90 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
91 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
92 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
93 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
94 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
95 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
96 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
97 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
98 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
99 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
100 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
101 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
102 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
103 } 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
104
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 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
107 {
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 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
109 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
110 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
111 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
112 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
113 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
114 };
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
115
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
116
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 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
118 {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
119 {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
120 {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
121 {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
122 {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
123 {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
124 {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
125 {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
126 {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
127 {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
128 {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
129 {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
130 {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
131 };
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 #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
135 #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
136 #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
137
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 #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
139 #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
140 #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
141
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
142 #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
143 #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
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
145 #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
146 #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
147 #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
148 #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
149
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 #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
151 #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
152 #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
153 #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
154 #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
155 #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
156 #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
157 #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
158 #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
159 #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
160 #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
161 #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
162
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
163 #define 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
164 #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
165
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
166 #define 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
167 #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
168 #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
169 #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
170 #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
171 #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
172 #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
173 #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
174 #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
175 #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
176
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
177 #define SHN_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
178 #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
179 #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
180 #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
181 #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
182 #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
183 #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
184 #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
185 #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
186 #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
187 #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
188 #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
189 #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
190 #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
191 #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
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
193 #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
194 #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
195 #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
196 #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
197 #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
198 #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
199 #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
200 #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
201 #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
202 #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
203 #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
204 #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
205
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
206 #define SHN_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
207
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 #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
210
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 #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
212 #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
213 #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
214
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
215 #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
216 #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
217 #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
218
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 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
221 {
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 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
223 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
224 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
225 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
226 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
227 } /* 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
228
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
229 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
230 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
231 *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
232 (((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
233 (((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
234 (((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
235 } /* 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
236
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 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
238 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
239
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
240 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
241 } /* 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
242
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 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
245 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
246 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
247
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 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
249 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
250 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
251 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
252 } /* 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
253
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
254 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
255 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
256 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
257 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
258 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
259 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
260 } /* 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
261 } /* 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
262
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
263 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
264 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
265 if (shn->nbitget >= 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
266 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
267 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
268 ((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
269 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
270 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
271 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
272 } /* 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
273 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
274 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
275 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
276 (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
277 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
278 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
279 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
280 } /* 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
281 } /* 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
282
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 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
284 *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
285
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 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
287 } /* 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
288
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 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
291 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
292 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
293
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 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
295 *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
296 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
297 *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
298
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
299 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
300 } /* 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
301
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
302
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 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
304 {
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 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
306 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
307 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
308 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
309
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 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
311 *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
312
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
313 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
314 } /* 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
315
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 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
318 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
319 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
320 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
321 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
322 } /* 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
323
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
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
325 static int SHN_init(void)
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
326 {
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
327 return(1); /* initialization always successful. */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
328 } /* SHN_init */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
329
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 static void SHN_quit(void)
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
332 {
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
333 /* it's a no-op. */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
334 } /* SHN_quit */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
335
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
336
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 * 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
339 * 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
340 */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
341 static inline int extended_shn_magic_search(Sound_Sample *sample)
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
342 {
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
343 SDL_RWops *rw = ((Sound_SampleInternal *) sample->opaque)->rw;
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
344 Uint32 word = 0;
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
345 Uint8 ch;
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
346
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
347 while (1)
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
348 {
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
349 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
350 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
351 if (SDL_SwapBE32(word) == MAGIC_NUM)
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
352 {
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
353 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
354 return((int) ch);
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
355 } /* if */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
356 } /* while */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
357
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
358 return((int) ch);
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
359 } /* extended_shn_magic_search */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
360
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 /* 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
363 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
364 {
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
365 SDL_RWops *rw = ((Sound_SampleInternal *) sample->opaque)->rw;
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
366 Uint32 magic;
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
367 Uint8 ch;
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
368
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 * 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
371 * 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
372 * 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
373 * happen to pass through here. If the extension is explicitly "SHN", we
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
374 * check the whole stream, though.
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
375 */
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 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
378 return(extended_shn_magic_search(sample));
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
379
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
380 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
381 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
382 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
383 BAIL_IF_MACRO(ch > 3, "SHN: Unsupported file version", -1);
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
384
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
385 return((int) ch);
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
386 } /* determine_shn_version */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
387
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
388
101
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
389 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
390 {
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 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
392 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
393
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 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
395 {
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 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
397 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
398 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
399 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
400 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
401 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
402 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
403 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
404 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
405 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
406 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
407 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
408 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
409 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
410 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
411 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
412 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
413 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
414 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
415 } /* 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
416
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 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
418 {
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 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
420 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
421 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
422 } /* 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
423 } /* 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
424
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 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
427 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
428 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
429 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
430 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
431 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
432
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 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
434 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
435 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
436 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
437 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
438 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
439 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
440
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
441 case SHN_TYPE_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
442 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
443
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
444 case SHN_TYPE_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
445 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
446
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
447 case SHN_TYPE_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
448 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
449
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
450 case SHN_TYPE_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
451 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
452 } /* 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
453
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
454 return(0);
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 } /* 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
456
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 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
459 {
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 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
461 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
462 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
463
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 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
465 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
466 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
467 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
468 } /* 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
469
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 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
471 } /* 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
472
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
473
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 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
475 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
476 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
477 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
478
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
479 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
480 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
481 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
482 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
483 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
484 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
485 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
486 } /* 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
487
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
488 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
489 } /* 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
490
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
491 #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
492 #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
493 #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
494 #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
495
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 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
497 {
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 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
499 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
500 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
501
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
502 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
503 {
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 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
505 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
506 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
507 } /* 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
508
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
509 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
510 *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
511
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 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
513 } /* 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
514
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
515
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 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
517 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
518 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
519 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
520 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
521
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 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
523 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
524 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
525 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
526 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
527 } /* 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
528
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
529 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
530 *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
531
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 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
533 } /* 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
534
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
535
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 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
537 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
538 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
539 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
540 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
541 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
542 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
543
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
544 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
545
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
546 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
547 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
548 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
549
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
550 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
551 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
552
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
553 BAIL_IF_MACRO(!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
554 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
555
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
556 BAIL_IF_MACRO(!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
557 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
558 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
559 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
560 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
561 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
562
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
563 BAIL_IF_MACRO(!verb_ReadLE32(shn, rw, &u32), NULL, 0); /* 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
564 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
565 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
566
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
567 BAIL_IF_MACRO(!verb_ReadLE32(shn, rw, &u32), NULL, 0); /* '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
568 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
569 BAIL_IF_MACRO(!verb_ReadLE32(shn, rw, &u32), NULL, 0); /* chunksize */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
570
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 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
572 } /* 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
573
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
574
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
575 static int SHN_open(Sound_Sample *sample, const char *ext)
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
576 {
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
577 Sound_SampleInternal *internal = (Sound_SampleInternal *) sample->opaque;
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
578 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
579 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
580 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
581 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
582 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
583
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 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
585 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
586 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
587 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
588 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
589 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
590 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
591 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
592
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
593 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
594 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
595 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
596
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 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
598 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
599 {
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 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
601 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
602 } /* 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
603
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
604 if (shn->version > 0)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
605 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
606 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
607 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
608 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
609 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
610 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
611 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
612 } /* 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
613
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 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
615
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 /* 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
617 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
618 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
619
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 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
621 {
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 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
623 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
624 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
625 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
626 } /* for */
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
627
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
628 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
629 {
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 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
631 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
632 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
633 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
634 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
635 } /* 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
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
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 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
639 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
640
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
641 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
642 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
643
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
644 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
645 (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
646 (!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
647 {
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 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
649 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
650
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 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
652 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
653 } /* 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
654
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
655 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
656 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
657 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
658 Sound_SetError(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
659 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
660 } /* 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
661
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
662 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
663 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
664
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 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
666 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
667 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
668
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 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
670 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
671 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
672 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
673 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
674 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
675 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
676 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
677 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
678
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
679 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
680 } /* SHN_open */
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
681
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
682
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
683 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
684 {
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 int i;
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
686
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
687 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
688 {
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 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
690 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
691 } /* 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
692 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
693 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
694 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
695 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
696 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
697 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
698 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
699 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
700 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
701 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
702 } /* 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
703 } /* 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
704 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
705 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
706 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
707 {
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 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
709 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
710 } /* 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
711 } /* 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
712 } /* fix_bitshift */
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
713
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 static void SHN_close(Sound_Sample *sample)
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
716 {
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
717 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
718 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
719
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 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
721 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
722
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
723 if (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
724 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
725
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 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
727 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
728
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
729 if (shn->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
730 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
731
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
732 if (shn->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
733 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
734
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
735 free(shn);
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
736 } /* SHN_close */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
737
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
738
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
739 /* 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
740
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
741 /* 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
742 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
743 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
744 /*
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 ** 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
746 **
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 ** 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
748 ** 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
749 ** 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
750 **
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 ** 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
752 ** 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
753 ** 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
754 ** 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
755 ** 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
756 ** 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
757 ** 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
758 ** 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
759 ** 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
760 **
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
761 ** 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
762 ** 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
763 */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
764
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 #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
766 #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
767
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
768 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
769 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
770 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
771 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
772 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
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 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
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 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
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
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 /* 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
788 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
789 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
790 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
791 {
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 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
793 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
794 } /* 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
795
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
796 /* 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
797 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
798 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
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 /* 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
801 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
802 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
803 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
804 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
805
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 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
807 } /* 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
808
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
809
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 /* 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
811 #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
812 #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
813 #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
814
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
815
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 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
817 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
818 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
819 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
820 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
821 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
822 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
823 };
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
824
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
825 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
826 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
827 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
828 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
829 {
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 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
831 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
832 } /* 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
833
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
834 /* 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
835 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
836
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
837 /* 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
838 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
839 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
840
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
841 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
842 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
843 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
844 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
845 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
846
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
847 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
848 } /* 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
849
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
850
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
851 /* convert 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
852 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
853 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
854 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
855 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
856 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
857 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
858 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
859 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
860 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
861
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 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
863
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
864 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
865 {
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 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
867 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
868 {
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 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
870 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
871 } /* 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
872 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
873 shn->backBufferSize = bsiz;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
874 } /* 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
875
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 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
877 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
878 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
879 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
880 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
881 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
882 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
883 {
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 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
885 *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
886 } /* 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
887 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
888 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
889 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
890 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
891 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
892 *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
893 } /* 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
894 } /* 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
895 } /* 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
896 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
897
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
898 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
899 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
900 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
901 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
902 {
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 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
904 *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
905 } /* 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
906 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
907 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
908 for (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
909 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
910 for (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
911 *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
912 } /* 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
913 } /* 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
914 } /* 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
915 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
916
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
917 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
918 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
919 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
920 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
921 {
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 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
923 *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
924 } /* 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
925 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
926 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
927 for(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
928 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
929 for(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
930 *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
931 } /* 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
932 } /* 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
933 } /* 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
934 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
935
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
936 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
937 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
938 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
939 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
940 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
941 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
942 for (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
943 *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
944 } /* 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
945 else
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
946 {
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 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
948 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
949 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
950 *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
951 } /* 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
952 } /* 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
953 } /* 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
954 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
955
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
956 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
957 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
958 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
959 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
960 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
961 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
962 for (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
963 *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
964 } /* 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
965 else
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
966 {
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 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
968 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
969 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
970 *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
971 } /* 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
972 } /* 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
973 } /* 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
974 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
975
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
976 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
977 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
978 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
979 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
980 {
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 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
982 *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
983 } /* 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
984 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
985 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
986 for(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
987 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
988 for(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
989 *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
990 } /* 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
991 } /* 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
992 } /* 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
993 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
994
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
995 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
996 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
997 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
998 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
999 {
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 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
1001 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
1002 *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
1003 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
1004 *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
1005 } /* 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
1006 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
1007 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1008 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
1009 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1010 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
1011 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1012 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
1013 *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
1014 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
1015 *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
1016 } /* 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
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 } /* 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
1019 } /* 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
1020 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
1021
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 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
1023 {
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 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
1025 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
1026 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1027 for (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
1028 *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
1029 } /* 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
1030 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
1031 {
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 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
1033 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1034 for(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
1035 *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
1036 } /* 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
1037 }/* 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
1038 } /* 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
1039 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
1040 } /* 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
1041
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 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
1043 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
1044 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
1045 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
1046 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
1047 } /* 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
1048
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1049
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 #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
1051
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1052 static Uint32 SHN_read(Sound_Sample *sample)
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1053 {
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
1054 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
1055 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
1056 Uint32 cpyBytes = 0;
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1057 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
1058 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
1059 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
1060 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
1061
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1062 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
1063
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 /* 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
1065 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
1066 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1067 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
1068 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
1069 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
1070 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
1071 } /* 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
1072
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1073 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
1074
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1075 /* 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
1076 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
1077 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1078 if (!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
1079 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1080 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
1081 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
1082 } /* 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
1083
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1084 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
1085 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1086 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
1087 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
1088 } /* if */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1089
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1090 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
1091 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1092 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
1093 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
1094 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
1095 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
1096 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
1097 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
1098 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1099 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
1100 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
1101 Sint32 resn = 0, nlpc, j;
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1102
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
1103 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
1104 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1105 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
1106 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1107 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
1108 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
1109 } /* 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
1110
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 /* 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
1112 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
1113 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
1114 } /* 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
1115
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1116 /* 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
1117 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
1118 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
1119 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
1120 {
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 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
1122 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
1123 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
1124
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1125 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
1126 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
1127 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
1128 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
1129 } /* else */
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1130
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
1131 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
1132 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1133 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
1134 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
1135 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
1136 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
1137
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1138 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
1139 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
1140 {
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 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
1142 {
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 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
1144 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
1145 } /* 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
1146 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
1147 } /* 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
1148 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
1149
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1150 case SHN_FN_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
1151 for(i = 0; i < shn->blocksize; i++)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1152 {
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 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
1154 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1155 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
1156 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
1157 } /* 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
1158 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
1159 } /* 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
1160 break;
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1161
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
1162 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
1163 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
1164 {
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 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
1166 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1167 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
1168 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
1169 } /* 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
1170 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
1171 } /* 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
1172 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
1173
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1174 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
1175 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
1176 {
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 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
1178 {
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 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
1180 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
1181 } /* 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
1182 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
1183 } /* 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
1184 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
1185
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1186 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
1187 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
1188 {
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 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
1190 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
1191 } /* 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
1192
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 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
1194 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1195 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
1196 {
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 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
1198 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
1199 } /* 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
1200 } /* for */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1201
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1202 for(i = 0; i < nlpc; i++)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1203 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
1204
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 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
1206 {
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 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
1208
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1209 for(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
1210 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
1211
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1212 if (!var_get(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
1213 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1214 sample->flags |= SOUND_SAMPLEFLAG_ERROR;
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1215 return(retval);
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1216 } /* if */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1217 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
1218 } /* for */
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1219
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
1220 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
1221 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1222 for(i = 0; i < shn->blocksize; i++)
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1223 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
1224 } /* 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
1225
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1226 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
1227 } /* 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
1228
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1229 /* 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
1230 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
1231 {
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 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
1233 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
1234 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
1235
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 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
1237 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
1238
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1239 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
1240 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
1241 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
1242 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
1243 } /* 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
1244
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1245 /* 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
1246 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
1247 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
1248
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1249 fix_bitshift(cbuffer, shn->blocksize, shn->bitshift, shn->datatype);
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1250
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
1251 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
1252 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1253 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
1254 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
1255 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
1256 } /* if */
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1257
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1258 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
1259 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
1260 } /* case */
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1261
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
1262 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
1263 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
1264 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
1265 {
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1266 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
1267 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
1268 } /* 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
1269 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
1270
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1271 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
1272 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
1273 {
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 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
1275 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
1276 } /* 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
1277 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
1278
c08794028df4 Fully implemented. Needs testing, but it works on the Grateful Dead show I
Ryan C. Gordon <icculus@icculus.org>
parents: 100
diff changeset
1279 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
1280 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
1281 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
1282 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
1283 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
1284 } /* 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
1285 } /* while */
86
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1286
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1287 return(retval);
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1288 } /* SHN_read */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1289
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1290 #endif /* defined SOUND_SUPPORTS_SHN */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1291
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1292 /* end of shn.c ... */
155ab2a427ca Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1293