Mercurial > SDL_sound_CoreAudio
annotate decoders/wav.c @ 233:15a3b1a1291c
Kludged implementation of the rewind method.
author | Ryan C. Gordon <icculus@icculus.org> |
---|---|
date | Sat, 19 Jan 2002 20:02:55 +0000 |
parents | c9772a9f5271 |
children | 12a9c2e0b00f |
rev | line source |
---|---|
17 | 1 /* |
2 * SDL_sound -- An abstract sound format decoding API. | |
3 * Copyright (C) 2001 Ryan C. Gordon. | |
4 * | |
5 * This library is free software; you can redistribute it and/or | |
6 * modify it under the terms of the GNU Lesser General Public | |
7 * License as published by the Free Software Foundation; either | |
8 * version 2.1 of the License, or (at your option) any later version. | |
9 * | |
10 * This library is distributed in the hope that it will be useful, | |
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
13 * Lesser General Public License for more details. | |
14 * | |
15 * You should have received a copy of the GNU Lesser General Public | |
16 * License along with this library; if not, write to the Free Software | |
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
18 */ | |
19 | |
20 /* | |
21 * WAV decoder for SDL_sound. | |
22 * | |
23 * This driver handles Microsoft .WAVs, in as many of the thousands of | |
24 * variations as we can. | |
25 * | |
183
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
26 * Please see the file COPYING in the source's root directory. |
17 | 27 * |
28 * This file written by Ryan C. Gordon. (icculus@clutteredmind.org) | |
29 */ | |
30 | |
106
40de367eb59e
Changing my include structure to do this right.
Ryan C. Gordon <icculus@icculus.org>
parents:
104
diff
changeset
|
31 #if HAVE_CONFIG_H |
40de367eb59e
Changing my include structure to do this right.
Ryan C. Gordon <icculus@icculus.org>
parents:
104
diff
changeset
|
32 # include <config.h> |
40de367eb59e
Changing my include structure to do this right.
Ryan C. Gordon <icculus@icculus.org>
parents:
104
diff
changeset
|
33 #endif |
100
6d9fdec2f708
added config.h, added --enable-debug flag, various other changes to the build system
fingolfin
parents:
64
diff
changeset
|
34 |
104
103cfcb3c014
Updated to fix build system problem.
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
35 #ifdef SOUND_SUPPORTS_WAV |
103cfcb3c014
Updated to fix build system problem.
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
36 |
17 | 37 #include <stdio.h> |
38 #include <stdlib.h> | |
39 #include <string.h> | |
40 #include <assert.h> | |
41 | |
106
40de367eb59e
Changing my include structure to do this right.
Ryan C. Gordon <icculus@icculus.org>
parents:
104
diff
changeset
|
42 #include "SDL_sound.h" |
40de367eb59e
Changing my include structure to do this right.
Ryan C. Gordon <icculus@icculus.org>
parents:
104
diff
changeset
|
43 |
40de367eb59e
Changing my include structure to do this right.
Ryan C. Gordon <icculus@icculus.org>
parents:
104
diff
changeset
|
44 #define __SDL_SOUND_INTERNAL__ |
40de367eb59e
Changing my include structure to do this right.
Ryan C. Gordon <icculus@icculus.org>
parents:
104
diff
changeset
|
45 #include "SDL_sound_internal.h" |
40de367eb59e
Changing my include structure to do this right.
Ryan C. Gordon <icculus@icculus.org>
parents:
104
diff
changeset
|
46 |
47
ea58bc3b15d7
Added init() and quit() methods.
Ryan C. Gordon <icculus@icculus.org>
parents:
40
diff
changeset
|
47 static int WAV_init(void); |
ea58bc3b15d7
Added init() and quit() methods.
Ryan C. Gordon <icculus@icculus.org>
parents:
40
diff
changeset
|
48 static void WAV_quit(void); |
17 | 49 static int WAV_open(Sound_Sample *sample, const char *ext); |
50 static void WAV_close(Sound_Sample *sample); | |
51 static Uint32 WAV_read(Sound_Sample *sample); | |
221
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
193
diff
changeset
|
52 static int WAV_rewind(Sound_Sample *sample); |
17 | 53 |
149
1df5c106504e
Decoders can now list multiple file extensions.
Ryan C. Gordon <icculus@icculus.org>
parents:
124
diff
changeset
|
54 static const char *extensions_wav[] = { "WAV", NULL }; |
17 | 55 const Sound_DecoderFunctions __Sound_DecoderFunctions_WAV = |
56 { | |
57 { | |
149
1df5c106504e
Decoders can now list multiple file extensions.
Ryan C. Gordon <icculus@icculus.org>
parents:
124
diff
changeset
|
58 extensions_wav, |
17 | 59 "Microsoft WAVE audio format", |
60 "Ryan C. Gordon <icculus@clutteredmind.org>", | |
61 "http://www.icculus.org/SDL_sound/" | |
62 }, | |
63 | |
221
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
193
diff
changeset
|
64 WAV_init, /* init() method */ |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
193
diff
changeset
|
65 WAV_quit, /* quit() method */ |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
193
diff
changeset
|
66 WAV_open, /* open() method */ |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
193
diff
changeset
|
67 WAV_close, /* close() method */ |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
193
diff
changeset
|
68 WAV_read, /* read() method */ |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
193
diff
changeset
|
69 WAV_rewind /* rewind() method */ |
17 | 70 }; |
71 | |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
72 |
183
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
73 /* Better than SDL_ReadLE16, since you can detect i/o errors... */ |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
74 static inline int read_le16(SDL_RWops *rw, Uint16 *ui16) |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
75 { |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
76 int rc = SDL_RWread(rw, ui16, sizeof (Uint16), 1); |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
77 BAIL_IF_MACRO(rc != 1, ERR_IO_ERROR, 0); |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
78 *ui16 = SDL_SwapLE16(*ui16); |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
79 return(1); |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
80 } /* read_le16 */ |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
81 |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
82 |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
83 /* Better than SDL_ReadLE32, since you can detect i/o errors... */ |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
84 static inline int read_le32(SDL_RWops *rw, Uint32 *ui32) |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
85 { |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
86 int rc = SDL_RWread(rw, ui32, sizeof (Uint32), 1); |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
87 BAIL_IF_MACRO(rc != 1, ERR_IO_ERROR, 0); |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
88 *ui32 = SDL_SwapLE32(*ui32); |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
89 return(1); |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
90 } /* read_le32 */ |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
91 |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
92 |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
93 /* This is just cleaner on the caller's end... */ |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
94 static inline int read_uint8(SDL_RWops *rw, Uint8 *ui8) |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
95 { |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
96 int rc = SDL_RWread(rw, ui8, sizeof (Uint8), 1); |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
97 BAIL_IF_MACRO(rc != 1, ERR_IO_ERROR, 0); |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
98 return(1); |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
99 } /* read_uint8 */ |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
100 |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
101 |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
102 /* Chunk management code... */ |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
103 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
104 #define riffID 0x46464952 /* "RIFF", in ascii. */ |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
105 #define waveID 0x45564157 /* "WAVE", in ascii. */ |
185
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
106 #define factID 0x74636166 /* "fact", in ascii. */ |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
107 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
108 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
109 /***************************************************************************** |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
110 * The FORMAT chunk... * |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
111 *****************************************************************************/ |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
112 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
113 #define fmtID 0x20746D66 /* "fmt ", in ascii. */ |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
114 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
115 #define FMT_NORMAL 0x0001 /* Uncompressed waveform data. */ |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
116 #define FMT_ADPCM 0x0002 /* ADPCM compressed waveform data. */ |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
117 |
183
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
118 typedef struct |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
119 { |
185
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
120 Sint16 iCoef1; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
121 Sint16 iCoef2; |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
122 } ADPCMCOEFSET; |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
123 |
183
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
124 typedef struct |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
125 { |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
126 Uint8 bPredictor; |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
127 Uint16 iDelta; |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
128 Sint16 iSamp1; |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
129 Sint16 iSamp2; |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
130 } ADPCMBLOCKHEADER; |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
131 |
178
bdbe09014724
Minor tweaks and such.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
132 typedef struct S_WAV_FMT_T |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
133 { |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
134 Uint32 chunkID; |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
135 Sint32 chunkSize; |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
136 Sint16 wFormatTag; |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
137 Uint16 wChannels; |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
138 Uint32 dwSamplesPerSec; |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
139 Uint32 dwAvgBytesPerSec; |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
140 Uint16 wBlockAlign; |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
141 Uint16 wBitsPerSample; |
178
bdbe09014724
Minor tweaks and such.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
142 |
185
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
143 Uint32 sample_frame_size; |
221
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
193
diff
changeset
|
144 Uint32 data_starting_offset; |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
193
diff
changeset
|
145 Uint32 total_bytes; |
185
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
146 |
178
bdbe09014724
Minor tweaks and such.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
147 void (*free)(struct S_WAV_FMT_T *fmt); |
183
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
148 Uint32 (*read_sample)(Sound_Sample *sample); |
221
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
193
diff
changeset
|
149 int (*rewind_sample)(Sound_Sample *sample); |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
150 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
151 union |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
152 { |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
153 struct |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
154 { |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
155 Uint16 cbSize; |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
156 Uint16 wSamplesPerBlock; |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
157 Uint16 wNumCoef; |
183
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
158 ADPCMCOEFSET *aCoef; |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
159 ADPCMBLOCKHEADER *blockheaders; |
185
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
160 Uint32 samples_left_in_block; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
161 int nibble_state; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
162 Sint8 nibble; |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
163 } adpcm; |
178
bdbe09014724
Minor tweaks and such.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
164 |
bdbe09014724
Minor tweaks and such.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
165 /* put other format-specific data here... */ |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
166 } fmt; |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
167 } fmt_t; |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
168 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
169 |
17 | 170 /* |
171 * Read in a fmt_t from disk. This makes this process safe regardless of | |
172 * the processor's byte order or how the fmt_t structure is packed. | |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
173 * Note that the union "fmt" is not read in here; that is handled as |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
174 * needed in the read_fmt_* functions. |
17 | 175 */ |
176 static int read_fmt_chunk(SDL_RWops *rw, fmt_t *fmt) | |
177 { | |
178 /* skip reading the chunk ID, since it was already read at this point... */ | |
179 fmt->chunkID = fmtID; | |
180 | |
183
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
181 BAIL_IF_MACRO(!read_le32(rw, &fmt->chunkSize), NULL, 0); |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
182 BAIL_IF_MACRO(!read_le16(rw, &fmt->wFormatTag), NULL, 0); |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
183 BAIL_IF_MACRO(!read_le16(rw, &fmt->wChannels), NULL, 0); |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
184 BAIL_IF_MACRO(!read_le32(rw, &fmt->dwSamplesPerSec), NULL, 0); |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
185 BAIL_IF_MACRO(!read_le32(rw, &fmt->dwAvgBytesPerSec), NULL, 0); |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
186 BAIL_IF_MACRO(!read_le16(rw, &fmt->wBlockAlign), NULL, 0); |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
187 BAIL_IF_MACRO(!read_le16(rw, &fmt->wBitsPerSample), NULL, 0); |
17 | 188 |
189 return(1); | |
190 } /* read_fmt_chunk */ | |
191 | |
192 | |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
193 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
194 /***************************************************************************** |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
195 * The DATA chunk... * |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
196 *****************************************************************************/ |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
197 |
17 | 198 #define dataID 0x61746164 /* "data", in ascii. */ |
199 | |
200 typedef struct | |
201 { | |
202 Uint32 chunkID; | |
203 Sint32 chunkSize; | |
204 /* Then, (chunkSize) bytes of waveform data... */ | |
205 } data_t; | |
206 | |
207 | |
208 /* | |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
209 * Read in a data_t from disk. This makes this process safe regardless of |
17 | 210 * the processor's byte order or how the fmt_t structure is packed. |
211 */ | |
212 static int read_data_chunk(SDL_RWops *rw, data_t *data) | |
213 { | |
214 /* skip reading the chunk ID, since it was already read at this point... */ | |
215 data->chunkID = dataID; | |
183
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
216 BAIL_IF_MACRO(!read_le32(rw, &data->chunkSize), NULL, 0); |
17 | 217 return(1); |
40
c15396fc0e55
Fixed incorrect comment, by Torbj�rn Andersson. :)
Ryan C. Gordon <icculus@icculus.org>
parents:
17
diff
changeset
|
218 } /* read_data_chunk */ |
17 | 219 |
220 | |
221 | |
222 | |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
223 /***************************************************************************** |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
224 * this is what we store in our internal->decoder_private field... * |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
225 *****************************************************************************/ |
17 | 226 |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
227 typedef struct |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
228 { |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
229 fmt_t *fmt; |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
230 Sint32 bytesLeft; |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
231 } wav_t; |
17 | 232 |
233 | |
234 | |
235 | |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
236 /***************************************************************************** |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
237 * Normal, uncompressed waveform handler... * |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
238 *****************************************************************************/ |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
239 |
185
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
240 /* |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
241 * Sound_Decode() lands here for uncompressed WAVs... |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
242 */ |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
243 static Uint32 read_sample_fmt_normal(Sound_Sample *sample) |
17 | 244 { |
245 Uint32 retval; | |
246 Sound_SampleInternal *internal = (Sound_SampleInternal *) sample->opaque; | |
247 wav_t *w = (wav_t *) internal->decoder_private; | |
248 Uint32 max = (internal->buffer_size < (Uint32) w->bytesLeft) ? | |
249 internal->buffer_size : (Uint32) w->bytesLeft; | |
250 | |
251 assert(max > 0); | |
252 | |
253 /* | |
254 * We don't actually do any decoding, so we read the wav data | |
255 * directly into the internal buffer... | |
256 */ | |
257 retval = SDL_RWread(internal->rw, internal->buffer, 1, max); | |
258 | |
259 w->bytesLeft -= retval; | |
260 | |
261 /* Make sure the read went smoothly... */ | |
262 if ((retval == 0) || (w->bytesLeft == 0)) | |
263 sample->flags |= SOUND_SAMPLEFLAG_EOF; | |
264 | |
265 else if (retval == -1) | |
266 sample->flags |= SOUND_SAMPLEFLAG_ERROR; | |
267 | |
268 /* (next call this EAGAIN may turn into an EOF or error.) */ | |
269 else if (retval < internal->buffer_size) | |
270 sample->flags |= SOUND_SAMPLEFLAG_EAGAIN; | |
271 | |
272 return(retval); | |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
273 } /* read_sample_fmt_normal */ |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
274 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
275 |
221
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
193
diff
changeset
|
276 static int rewind_sample_fmt_normal(Sound_Sample *sample) |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
193
diff
changeset
|
277 { |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
193
diff
changeset
|
278 /* no-op. */ |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
193
diff
changeset
|
279 return(1); |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
193
diff
changeset
|
280 } /* rewind_sample_fmt_normal */ |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
193
diff
changeset
|
281 |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
282 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
283 static int read_fmt_normal(SDL_RWops *rw, fmt_t *fmt) |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
284 { |
178
bdbe09014724
Minor tweaks and such.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
285 /* (don't need to read more from the RWops...) */ |
183
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
286 fmt->free = NULL; |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
287 fmt->read_sample = read_sample_fmt_normal; |
221
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
193
diff
changeset
|
288 fmt->rewind_sample = rewind_sample_fmt_normal; |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
289 return(1); |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
290 } /* read_fmt_normal */ |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
291 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
292 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
293 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
294 /***************************************************************************** |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
295 * ADPCM compression handler... * |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
296 *****************************************************************************/ |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
297 |
185
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
298 #define FIXED_POINT_COEF_BASE 256 |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
299 #define FIXED_POINT_ADAPTION_BASE 256 |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
300 #define SMALLEST_ADPCM_DELTA 16 |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
301 |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
302 |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
303 static inline int read_adpcm_block_headers(Sound_Sample *sample) |
183
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
304 { |
185
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
305 Sound_SampleInternal *internal = (Sound_SampleInternal *) sample->opaque; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
306 SDL_RWops *rw = internal->rw; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
307 wav_t *w = (wav_t *) internal->decoder_private; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
308 fmt_t *fmt = w->fmt; |
183
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
309 ADPCMBLOCKHEADER *headers = fmt->fmt.adpcm.blockheaders; |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
310 int i; |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
311 int max = fmt->wChannels; |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
312 |
185
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
313 if (w->bytesLeft < fmt->wBlockAlign) |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
314 { |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
315 sample->flags |= SOUND_SAMPLEFLAG_EOF; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
316 return(0); |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
317 } /* if */ |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
318 |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
319 w->bytesLeft -= fmt->wBlockAlign; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
320 |
183
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
321 for (i = 0; i < max; i++) |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
322 BAIL_IF_MACRO(!read_uint8(rw, &headers[i].bPredictor), NULL, 0); |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
323 |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
324 for (i = 0; i < max; i++) |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
325 BAIL_IF_MACRO(!read_le16(rw, &headers[i].iDelta), NULL, 0); |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
326 |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
327 for (i = 0; i < max; i++) |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
328 BAIL_IF_MACRO(!read_le16(rw, &headers[i].iSamp1), NULL, 0); |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
329 |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
330 for (i = 0; i < max; i++) |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
331 BAIL_IF_MACRO(!read_le16(rw, &headers[i].iSamp2), NULL, 0); |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
332 |
185
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
333 fmt->fmt.adpcm.samples_left_in_block = fmt->fmt.adpcm.wSamplesPerBlock; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
334 fmt->fmt.adpcm.nibble_state = 0; |
183
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
335 return(1); |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
336 } /* read_adpcm_block_headers */ |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
337 |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
338 |
185
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
339 static inline void do_adpcm_nibble(Uint8 nib, |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
340 ADPCMBLOCKHEADER *header, |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
341 Sint32 lPredSamp) |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
342 { |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
343 static const Sint32 max_audioval = ((1<<(16-1))-1); |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
344 static const Sint32 min_audioval = -(1<<(16-1)); |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
345 static const Sint32 AdaptionTable[] = |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
346 { |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
347 230, 230, 230, 230, 307, 409, 512, 614, |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
348 768, 614, 512, 409, 307, 230, 230, 230 |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
349 }; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
350 |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
351 Sint32 lNewSamp; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
352 Sint32 delta; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
353 |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
354 if (nib & 0x08) |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
355 lNewSamp = lPredSamp + (header->iDelta * (nib - 0x10)); |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
356 else |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
357 lNewSamp = lPredSamp + (header->iDelta * nib); |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
358 |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
359 /* clamp value... */ |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
360 if (lNewSamp < min_audioval) |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
361 lNewSamp = min_audioval; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
362 else if (lNewSamp > max_audioval) |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
363 lNewSamp = max_audioval; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
364 |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
365 delta = ((Sint32) header->iDelta * AdaptionTable[nib]) / |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
366 FIXED_POINT_ADAPTION_BASE; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
367 |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
368 if (delta < SMALLEST_ADPCM_DELTA) |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
369 delta = SMALLEST_ADPCM_DELTA; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
370 |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
371 header->iDelta = delta; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
372 header->iSamp2 = header->iSamp1; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
373 header->iSamp1 = lNewSamp; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
374 } /* do_adpcm_nibble */ |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
375 |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
376 |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
377 static inline int decode_adpcm_sample_frame(Sound_Sample *sample) |
183
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
378 { |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
379 Sound_SampleInternal *internal = (Sound_SampleInternal *) sample->opaque; |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
380 wav_t *w = (wav_t *) internal->decoder_private; |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
381 fmt_t *fmt = w->fmt; |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
382 ADPCMBLOCKHEADER *headers = fmt->fmt.adpcm.blockheaders; |
185
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
383 SDL_RWops *rw = internal->rw; |
183
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
384 int i; |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
385 int max = fmt->wChannels; |
185
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
386 Sint32 delta; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
387 Uint8 nib = fmt->fmt.adpcm.nibble; |
183
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
388 |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
389 for (i = 0; i < max; i++) |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
390 { |
185
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
391 Uint8 byte; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
392 Sint16 iCoef1 = fmt->fmt.adpcm.aCoef[headers[i].bPredictor].iCoef1; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
393 Sint16 iCoef2 = fmt->fmt.adpcm.aCoef[headers[i].bPredictor].iCoef2; |
183
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
394 Sint32 lPredSamp = ((headers[i].iSamp1 * iCoef1) + |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
395 (headers[i].iSamp2 * iCoef2)) / |
185
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
396 FIXED_POINT_COEF_BASE; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
397 |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
398 if (fmt->fmt.adpcm.nibble_state == 0) |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
399 { |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
400 BAIL_IF_MACRO(!read_uint8(rw, &nib), NULL, 0); |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
401 fmt->fmt.adpcm.nibble_state = 1; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
402 do_adpcm_nibble(nib >> 4, &headers[i], lPredSamp); |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
403 } /* if */ |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
404 else |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
405 { |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
406 fmt->fmt.adpcm.nibble_state = 0; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
407 do_adpcm_nibble(nib & 0x0F, &headers[i], lPredSamp); |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
408 } /* else */ |
183
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
409 } /* for */ |
185
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
410 |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
411 fmt->fmt.adpcm.nibble = nib; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
412 return(1); |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
413 } /* decode_adpcm_sample_frame */ |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
414 |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
415 |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
416 static inline void put_adpcm_sample_frame1(Uint8 *_buf, fmt_t *fmt) |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
417 { |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
418 Uint16 *buf = (Uint16 *) _buf; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
419 ADPCMBLOCKHEADER *headers = fmt->fmt.adpcm.blockheaders; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
420 int i; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
421 for (i = 0; i < fmt->wChannels; i++) |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
422 *(buf++) = headers[i].iSamp1; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
423 } /* put_adpcm_sample_frame1 */ |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
424 |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
425 |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
426 static inline void put_adpcm_sample_frame2(Uint8 *_buf, fmt_t *fmt) |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
427 { |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
428 Uint16 *buf = (Uint16 *) _buf; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
429 ADPCMBLOCKHEADER *headers = fmt->fmt.adpcm.blockheaders; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
430 int i; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
431 for (i = 0; i < fmt->wChannels; i++) |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
432 *(buf++) = headers[i].iSamp2; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
433 } /* put_adpcm_sample_frame2 */ |
183
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
434 |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
435 |
185
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
436 /* |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
437 * Sound_Decode() lands here for ADPCM-encoded WAVs... |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
438 */ |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
439 static Uint32 read_sample_fmt_adpcm(Sound_Sample *sample) |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
440 { |
185
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
441 Sound_SampleInternal *internal = (Sound_SampleInternal *) sample->opaque; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
442 wav_t *w = (wav_t *) internal->decoder_private; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
443 fmt_t *fmt = w->fmt; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
444 Uint32 bw = 0; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
445 |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
446 while (bw < internal->buffer_size) |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
447 { |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
448 /* write ongoing sample frame before reading more data... */ |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
449 switch (fmt->fmt.adpcm.samples_left_in_block) |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
450 { |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
451 case 0: /* need to read a new block... */ |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
452 if (!read_adpcm_block_headers(sample)) |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
453 { |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
454 if ((sample->flags & SOUND_SAMPLEFLAG_EOF) == 0) |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
455 sample->flags |= SOUND_SAMPLEFLAG_ERROR; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
456 return(bw); |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
457 } /* if */ |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
458 |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
459 /* only write first sample frame for now. */ |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
460 put_adpcm_sample_frame2(internal->buffer + bw, fmt); |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
461 fmt->fmt.adpcm.samples_left_in_block--; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
462 bw += fmt->sample_frame_size; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
463 break; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
464 |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
465 case 1: /* output last sample frame of block... */ |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
466 put_adpcm_sample_frame1(internal->buffer + bw, fmt); |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
467 fmt->fmt.adpcm.samples_left_in_block--; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
468 bw += fmt->sample_frame_size; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
469 break; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
470 |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
471 default: /* output latest sample frame and read a new one... */ |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
472 put_adpcm_sample_frame1(internal->buffer + bw, fmt); |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
473 fmt->fmt.adpcm.samples_left_in_block--; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
474 bw += fmt->sample_frame_size; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
475 |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
476 if (!decode_adpcm_sample_frame(sample)) |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
477 { |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
478 sample->flags |= SOUND_SAMPLEFLAG_ERROR; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
479 return(bw); |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
480 } /* if */ |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
481 } /* switch */ |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
482 } /* while */ |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
483 |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
484 return(bw); |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
485 } /* read_sample_fmt_adpcm */ |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
486 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
487 |
185
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
488 /* |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
489 * Sound_FreeSample() lands here for ADPCM-encoded WAVs... |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
490 */ |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
491 static void free_fmt_adpcm(fmt_t *fmt) |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
492 { |
183
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
493 if (fmt->fmt.adpcm.aCoef != NULL) |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
494 free(fmt->fmt.adpcm.aCoef); |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
495 |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
496 if (fmt->fmt.adpcm.blockheaders != NULL) |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
497 free(fmt->fmt.adpcm.blockheaders); |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
498 } /* free_fmt_adpcm */ |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
499 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
500 |
221
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
193
diff
changeset
|
501 static int rewind_sample_fmt_adpcm(Sound_Sample *sample) |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
193
diff
changeset
|
502 { |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
193
diff
changeset
|
503 Sound_SampleInternal *internal = (Sound_SampleInternal *) sample->opaque; |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
193
diff
changeset
|
504 wav_t *w = (wav_t *) internal->decoder_private; |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
193
diff
changeset
|
505 w->fmt->fmt.adpcm.samples_left_in_block = 0; |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
193
diff
changeset
|
506 return(1); |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
193
diff
changeset
|
507 } /* rewind_sample_fmt_adpcm */ |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
193
diff
changeset
|
508 |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
193
diff
changeset
|
509 |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
510 /* |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
511 * Read in a the adpcm-specific info from disk. This makes this process |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
512 * safe regardless of the processor's byte order or how the fmt_t |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
513 * structure is packed. |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
514 */ |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
515 static int read_fmt_adpcm(SDL_RWops *rw, fmt_t *fmt) |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
516 { |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
517 size_t i; |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
518 |
183
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
519 memset(&fmt->fmt.adpcm, '\0', sizeof (fmt->fmt.adpcm)); |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
520 fmt->free = free_fmt_adpcm; |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
521 fmt->read_sample = read_sample_fmt_adpcm; |
221
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
193
diff
changeset
|
522 fmt->rewind_sample = rewind_sample_fmt_adpcm; |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
523 |
183
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
524 BAIL_IF_MACRO(!read_le16(rw, &fmt->fmt.adpcm.cbSize), NULL, 0); |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
525 BAIL_IF_MACRO(!read_le16(rw, &fmt->fmt.adpcm.wSamplesPerBlock), NULL, 0); |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
526 BAIL_IF_MACRO(!read_le16(rw, &fmt->fmt.adpcm.wNumCoef), NULL, 0); |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
527 |
185
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
528 /* fmt->free() is always called, so these malloc()s will be cleaned up. */ |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
529 |
183
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
530 i = sizeof (ADPCMCOEFSET) * fmt->fmt.adpcm.wNumCoef; |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
531 fmt->fmt.adpcm.aCoef = (ADPCMCOEFSET *) malloc(i); |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
532 BAIL_IF_MACRO(fmt->fmt.adpcm.aCoef == NULL, ERR_OUT_OF_MEMORY, 0); |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
533 |
185
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
534 for (i = 0; i < fmt->fmt.adpcm.wNumCoef; i++) |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
535 { |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
536 BAIL_IF_MACRO(!read_le16(rw, &fmt->fmt.adpcm.aCoef[i].iCoef1), NULL, 0); |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
537 BAIL_IF_MACRO(!read_le16(rw, &fmt->fmt.adpcm.aCoef[i].iCoef2), NULL, 0); |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
538 } /* for */ |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
539 |
183
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
540 i = sizeof (ADPCMBLOCKHEADER) * fmt->wChannels; |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
541 fmt->fmt.adpcm.blockheaders = (ADPCMBLOCKHEADER *) malloc(i); |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
542 BAIL_IF_MACRO(fmt->fmt.adpcm.blockheaders == NULL, ERR_OUT_OF_MEMORY, 0); |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
543 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
544 return(1); |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
545 } /* read_fmt_adpcm */ |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
546 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
547 |
178
bdbe09014724
Minor tweaks and such.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
548 |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
549 /***************************************************************************** |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
550 * Everything else... * |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
551 *****************************************************************************/ |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
552 |
178
bdbe09014724
Minor tweaks and such.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
553 static int WAV_init(void) |
bdbe09014724
Minor tweaks and such.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
554 { |
bdbe09014724
Minor tweaks and such.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
555 return(1); /* always succeeds. */ |
bdbe09014724
Minor tweaks and such.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
556 } /* WAV_init */ |
bdbe09014724
Minor tweaks and such.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
557 |
bdbe09014724
Minor tweaks and such.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
558 |
bdbe09014724
Minor tweaks and such.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
559 static void WAV_quit(void) |
bdbe09014724
Minor tweaks and such.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
560 { |
bdbe09014724
Minor tweaks and such.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
561 /* it's a no-op. */ |
bdbe09014724
Minor tweaks and such.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
562 } /* WAV_quit */ |
bdbe09014724
Minor tweaks and such.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
563 |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
564 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
565 static int read_fmt(SDL_RWops *rw, fmt_t *fmt) |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
566 { |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
567 /* if it's in this switch statement, we support the format. */ |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
568 switch (fmt->wFormatTag) |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
569 { |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
570 case FMT_NORMAL: |
178
bdbe09014724
Minor tweaks and such.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
571 SNDDBG(("WAV: Appears to be uncompressed audio.\n")); |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
572 return(read_fmt_normal(rw, fmt)); |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
573 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
574 case FMT_ADPCM: |
178
bdbe09014724
Minor tweaks and such.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
575 SNDDBG(("WAV: Appears to be ADPCM compressed audio.\n")); |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
576 return(read_fmt_adpcm(rw, fmt)); |
178
bdbe09014724
Minor tweaks and such.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
577 |
bdbe09014724
Minor tweaks and such.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
578 /* add other types here. */ |
bdbe09014724
Minor tweaks and such.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
579 |
bdbe09014724
Minor tweaks and such.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
580 default: |
193
6cd07211a235
Added some debugging output in preparation for future codecs (gsm, maybe?)
Ryan C. Gordon <icculus@icculus.org>
parents:
185
diff
changeset
|
581 SNDDBG(("WAV: Format 0x%X is unknown.\n", |
178
bdbe09014724
Minor tweaks and such.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
582 (unsigned int) fmt->wFormatTag)); |
bdbe09014724
Minor tweaks and such.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
583 Sound_SetError("WAV: Unsupported format"); |
bdbe09014724
Minor tweaks and such.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
584 return(0); /* not supported whatsoever. */ |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
585 } /* switch */ |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
586 |
178
bdbe09014724
Minor tweaks and such.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
587 assert(0); /* shouldn't hit this point. */ |
bdbe09014724
Minor tweaks and such.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
588 return(0); |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
589 } /* read_fmt */ |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
590 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
591 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
592 /* |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
593 * Locate a specific chunk in the WAVE file by ID... |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
594 */ |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
595 static int find_chunk(SDL_RWops *rw, Uint32 id) |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
596 { |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
597 Sint32 siz = 0; |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
598 Uint32 _id = 0; |
185
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
599 Uint32 pos = SDL_RWtell(rw); |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
600 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
601 while (1) |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
602 { |
183
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
603 BAIL_IF_MACRO(!read_le32(rw, &_id), NULL, 0); |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
604 if (_id == id) |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
605 return(1); |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
606 |
183
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
607 /* skip ahead and see what next chunk is... */ |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
608 BAIL_IF_MACRO(!read_le32(rw, &siz), NULL, 0); |
185
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
609 assert(siz >= 0); |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
610 pos += (sizeof (Uint32) * 2) + siz; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
611 if (siz > 0) |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
612 BAIL_IF_MACRO(SDL_RWseek(rw, pos, SEEK_SET) != pos, NULL, 0); |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
613 } /* while */ |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
614 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
615 return(0); /* shouldn't hit this, but just in case... */ |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
616 } /* find_chunk */ |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
617 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
618 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
619 static int WAV_open_internal(Sound_Sample *sample, const char *ext, fmt_t *fmt) |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
620 { |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
621 Sound_SampleInternal *internal = (Sound_SampleInternal *) sample->opaque; |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
622 SDL_RWops *rw = internal->rw; |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
623 data_t d; |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
624 wav_t *w; |
185
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
625 Uint32 pos; |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
626 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
627 BAIL_IF_MACRO(SDL_ReadLE32(rw) != riffID, "WAV: Not a RIFF file.", 0); |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
628 SDL_ReadLE32(rw); /* throw the length away; we get this info later. */ |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
629 BAIL_IF_MACRO(SDL_ReadLE32(rw) != waveID, "WAV: Not a WAVE file.", 0); |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
630 BAIL_IF_MACRO(!find_chunk(rw, fmtID), "WAV: No format chunk.", 0); |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
631 BAIL_IF_MACRO(!read_fmt_chunk(rw, fmt), "WAV: Can't read format chunk.", 0); |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
632 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
633 sample->actual.channels = (Uint8) fmt->wChannels; |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
634 sample->actual.rate = fmt->dwSamplesPerSec; |
193
6cd07211a235
Added some debugging output in preparation for future codecs (gsm, maybe?)
Ryan C. Gordon <icculus@icculus.org>
parents:
185
diff
changeset
|
635 if ((fmt->wBitsPerSample == 4) /*|| (fmt->wBitsPerSample == 0) */ ) |
185
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
636 sample->actual.format = AUDIO_S16SYS; /* !!! FIXME ? */ |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
637 else if (fmt->wBitsPerSample == 8) |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
638 sample->actual.format = AUDIO_U8; |
185
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
639 else if (fmt->wBitsPerSample == 16) |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
640 sample->actual.format = AUDIO_S16LSB; |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
641 else |
193
6cd07211a235
Added some debugging output in preparation for future codecs (gsm, maybe?)
Ryan C. Gordon <icculus@icculus.org>
parents:
185
diff
changeset
|
642 { |
6cd07211a235
Added some debugging output in preparation for future codecs (gsm, maybe?)
Ryan C. Gordon <icculus@icculus.org>
parents:
185
diff
changeset
|
643 SNDDBG(("WAV: %d bits per sample!?\n", (int) fmt->wBitsPerSample)); |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
644 BAIL_MACRO("WAV: Unsupported sample size.", 0); |
193
6cd07211a235
Added some debugging output in preparation for future codecs (gsm, maybe?)
Ryan C. Gordon <icculus@icculus.org>
parents:
185
diff
changeset
|
645 } /* else */ |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
646 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
647 BAIL_IF_MACRO(!read_fmt(rw, fmt), NULL, 0); |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
648 BAIL_IF_MACRO(!find_chunk(rw, dataID), "WAV: No data chunk.", 0); |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
649 BAIL_IF_MACRO(!read_data_chunk(rw, &d), "WAV: Can't read data chunk.", 0); |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
650 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
651 w = (wav_t *) malloc(sizeof(wav_t)); |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
652 BAIL_IF_MACRO(w == NULL, ERR_OUT_OF_MEMORY, 0); |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
653 w->fmt = fmt; |
221
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
193
diff
changeset
|
654 fmt->total_bytes = w->bytesLeft = d.chunkSize; |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
193
diff
changeset
|
655 fmt->data_starting_offset = SDL_RWtell(rw); |
185
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
656 |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
657 /* !!! FIXME: Move this to Sound_SampleInfo ? */ |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
658 fmt->sample_frame_size = ( ((sample->actual.format & 0xFF) / 8) * |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
659 sample->actual.channels ); |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
660 |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
661 internal->decoder_private = (void *) w; |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
662 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
663 sample->flags = SOUND_SAMPLEFLAG_NONE; |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
664 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
665 SNDDBG(("WAV: Accepting data stream.\n")); |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
666 return(1); /* we'll handle this data. */ |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
667 } /* WAV_open_internal */ |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
668 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
669 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
670 static int WAV_open(Sound_Sample *sample, const char *ext) |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
671 { |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
672 int rc; |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
673 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
674 fmt_t *fmt = (fmt_t *) malloc(sizeof (fmt_t)); |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
675 BAIL_IF_MACRO(fmt == NULL, ERR_OUT_OF_MEMORY, 0); |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
676 memset(fmt, '\0', sizeof (fmt_t)); |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
677 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
678 rc = WAV_open_internal(sample, ext, fmt); |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
679 if (!rc) |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
680 { |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
681 if (fmt->free != NULL) |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
682 fmt->free(fmt); |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
683 free(fmt); |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
684 } /* if */ |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
685 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
686 return(rc); |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
687 } /* WAV_open */ |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
688 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
689 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
690 static void WAV_close(Sound_Sample *sample) |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
691 { |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
692 Sound_SampleInternal *internal = (Sound_SampleInternal *) sample->opaque; |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
693 wav_t *w = (wav_t *) internal->decoder_private; |
183
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
694 |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
695 if (w->fmt->free != NULL) |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
696 w->fmt->free(w->fmt); |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
697 |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
698 free(w->fmt); |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
699 free(w); |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
700 } /* WAV_close */ |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
701 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
702 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
703 static Uint32 WAV_read(Sound_Sample *sample) |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
704 { |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
705 Sound_SampleInternal *internal = (Sound_SampleInternal *) sample->opaque; |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
706 wav_t *w = (wav_t *) internal->decoder_private; |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
707 return(w->fmt->read_sample(sample)); |
17 | 708 } /* WAV_read */ |
709 | |
221
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
193
diff
changeset
|
710 |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
193
diff
changeset
|
711 static int WAV_rewind(Sound_Sample *sample) |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
193
diff
changeset
|
712 { |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
193
diff
changeset
|
713 Sound_SampleInternal *internal = (Sound_SampleInternal *) sample->opaque; |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
193
diff
changeset
|
714 wav_t *w = (wav_t *) internal->decoder_private; |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
193
diff
changeset
|
715 fmt_t *fmt = w->fmt; |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
193
diff
changeset
|
716 int rc = SDL_RWseek(internal->rw, fmt->data_starting_offset, SEEK_SET); |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
193
diff
changeset
|
717 BAIL_IF_MACRO(rc != fmt->data_starting_offset, ERR_IO_ERROR, 0); |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
193
diff
changeset
|
718 w->bytesLeft = fmt->total_bytes; |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
193
diff
changeset
|
719 return(fmt->rewind_sample(sample)); |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
193
diff
changeset
|
720 } /* WAV_rewind */ |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
193
diff
changeset
|
721 |
64
40006625142a
Changes in preparation of autoconf support.
Ryan C. Gordon <icculus@icculus.org>
parents:
62
diff
changeset
|
722 #endif /* SOUND_SUPPORTS_WAV */ |
17 | 723 |
724 /* end of wav.c ... */ | |
725 |