Mercurial > SDL_sound_CoreAudio
annotate decoders/wav.c @ 368:84d6c604eaa9
Fixes to interface with SDL_sound correctly by Torbjorn.
author | Ryan C. Gordon <icculus@icculus.org> |
---|---|
date | Sat, 22 Jun 2002 23:19:41 +0000 |
parents | 4bcbc442d145 |
children | cbb15ecf423a |
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); |
306
c97be6e1bd27
Added framework for Sound_Seek() support.
Ryan C. Gordon <icculus@icculus.org>
parents:
246
diff
changeset
|
53 static int WAV_seek(Sound_Sample *sample, Uint32 ms); |
17 | 54 |
149
1df5c106504e
Decoders can now list multiple file extensions.
Ryan C. Gordon <icculus@icculus.org>
parents:
124
diff
changeset
|
55 static const char *extensions_wav[] = { "WAV", NULL }; |
17 | 56 const Sound_DecoderFunctions __Sound_DecoderFunctions_WAV = |
57 { | |
58 { | |
149
1df5c106504e
Decoders can now list multiple file extensions.
Ryan C. Gordon <icculus@icculus.org>
parents:
124
diff
changeset
|
59 extensions_wav, |
17 | 60 "Microsoft WAVE audio format", |
61 "Ryan C. Gordon <icculus@clutteredmind.org>", | |
62 "http://www.icculus.org/SDL_sound/" | |
63 }, | |
64 | |
221
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
193
diff
changeset
|
65 WAV_init, /* init() method */ |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
193
diff
changeset
|
66 WAV_quit, /* quit() method */ |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
193
diff
changeset
|
67 WAV_open, /* open() method */ |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
193
diff
changeset
|
68 WAV_close, /* close() method */ |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
193
diff
changeset
|
69 WAV_read, /* read() method */ |
306
c97be6e1bd27
Added framework for Sound_Seek() support.
Ryan C. Gordon <icculus@icculus.org>
parents:
246
diff
changeset
|
70 WAV_rewind, /* rewind() method */ |
c97be6e1bd27
Added framework for Sound_Seek() support.
Ryan C. Gordon <icculus@icculus.org>
parents:
246
diff
changeset
|
71 WAV_seek /* seek() method */ |
17 | 72 }; |
73 | |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
74 |
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
|
75 /* 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
|
76 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
|
77 { |
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 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
|
79 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
|
80 *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
|
81 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
|
82 } /* 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
|
83 |
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 |
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 /* 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
|
86 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
|
87 { |
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 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
|
89 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
|
90 *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
|
91 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
|
92 } /* 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
|
93 |
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 |
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 /* 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
|
96 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
|
97 { |
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 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
|
99 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
|
100 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
|
101 } /* 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
|
102 |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
103 |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
104 /* Chunk management code... */ |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
105 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
106 #define riffID 0x46464952 /* "RIFF", in ascii. */ |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
107 #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
|
108 #define factID 0x74636166 /* "fact", in ascii. */ |
124
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 |
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 * The FORMAT chunk... * |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
113 *****************************************************************************/ |
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 fmtID 0x20746D66 /* "fmt ", in ascii. */ |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
116 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
117 #define FMT_NORMAL 0x0001 /* Uncompressed waveform data. */ |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
118 #define FMT_ADPCM 0x0002 /* ADPCM compressed waveform data. */ |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
119 |
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
|
120 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
|
121 { |
185
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
122 Sint16 iCoef1; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
123 Sint16 iCoef2; |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
124 } ADPCMCOEFSET; |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
125 |
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
|
126 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
|
127 { |
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 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
|
129 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
|
130 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
|
131 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
|
132 } 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
|
133 |
178
bdbe09014724
Minor tweaks and such.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
134 typedef struct S_WAV_FMT_T |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
135 { |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
136 Uint32 chunkID; |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
137 Sint32 chunkSize; |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
138 Sint16 wFormatTag; |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
139 Uint16 wChannels; |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
140 Uint32 dwSamplesPerSec; |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
141 Uint32 dwAvgBytesPerSec; |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
142 Uint16 wBlockAlign; |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
143 Uint16 wBitsPerSample; |
178
bdbe09014724
Minor tweaks and such.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
144 |
364
4bcbc442d145
Fix to handle strange WAV fmt chunks.
Ryan C. Gordon <icculus@icculus.org>
parents:
351
diff
changeset
|
145 Uint32 next_chunk_offset; |
4bcbc442d145
Fix to handle strange WAV fmt chunks.
Ryan C. Gordon <icculus@icculus.org>
parents:
351
diff
changeset
|
146 |
185
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
147 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
|
148 Uint32 data_starting_offset; |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
193
diff
changeset
|
149 Uint32 total_bytes; |
185
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
150 |
178
bdbe09014724
Minor tweaks and such.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
151 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
|
152 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
|
153 int (*rewind_sample)(Sound_Sample *sample); |
307
eb7c929193dd
Added seek support for uncompressed WAVs.
Ryan C. Gordon <icculus@icculus.org>
parents:
306
diff
changeset
|
154 int (*seek_sample)(Sound_Sample *sample, Uint32 ms); |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
155 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
156 union |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
157 { |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
158 struct |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
159 { |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
160 Uint16 cbSize; |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
161 Uint16 wSamplesPerBlock; |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
162 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
|
163 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
|
164 ADPCMBLOCKHEADER *blockheaders; |
185
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
165 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
|
166 int nibble_state; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
167 Sint8 nibble; |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
168 } adpcm; |
178
bdbe09014724
Minor tweaks and such.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
169 |
bdbe09014724
Minor tweaks and such.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
170 /* put other format-specific data here... */ |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
171 } fmt; |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
172 } fmt_t; |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
173 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
174 |
17 | 175 /* |
176 * Read in a fmt_t from disk. This makes this process safe regardless of | |
177 * 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
|
178 * 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
|
179 * needed in the read_fmt_* functions. |
17 | 180 */ |
181 static int read_fmt_chunk(SDL_RWops *rw, fmt_t *fmt) | |
182 { | |
183 /* skip reading the chunk ID, since it was already read at this point... */ | |
184 fmt->chunkID = fmtID; | |
185 | |
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
|
186 BAIL_IF_MACRO(!read_le32(rw, &fmt->chunkSize), NULL, 0); |
364
4bcbc442d145
Fix to handle strange WAV fmt chunks.
Ryan C. Gordon <icculus@icculus.org>
parents:
351
diff
changeset
|
187 BAIL_IF_MACRO(fmt->chunkSize < 16, "WAV: Invalid chunk size", 0); |
4bcbc442d145
Fix to handle strange WAV fmt chunks.
Ryan C. Gordon <icculus@icculus.org>
parents:
351
diff
changeset
|
188 fmt->next_chunk_offset = SDL_RWtell(rw) + fmt->chunkSize; |
4bcbc442d145
Fix to handle strange WAV fmt chunks.
Ryan C. Gordon <icculus@icculus.org>
parents:
351
diff
changeset
|
189 |
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
|
190 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
|
191 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
|
192 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
|
193 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
|
194 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
|
195 BAIL_IF_MACRO(!read_le16(rw, &fmt->wBitsPerSample), NULL, 0); |
17 | 196 |
197 return(1); | |
198 } /* read_fmt_chunk */ | |
199 | |
200 | |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
201 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
202 /***************************************************************************** |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
203 * The DATA chunk... * |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
204 *****************************************************************************/ |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
205 |
17 | 206 #define dataID 0x61746164 /* "data", in ascii. */ |
207 | |
208 typedef struct | |
209 { | |
210 Uint32 chunkID; | |
211 Sint32 chunkSize; | |
212 /* Then, (chunkSize) bytes of waveform data... */ | |
213 } data_t; | |
214 | |
215 | |
216 /* | |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
217 * Read in a data_t from disk. This makes this process safe regardless of |
17 | 218 * the processor's byte order or how the fmt_t structure is packed. |
219 */ | |
220 static int read_data_chunk(SDL_RWops *rw, data_t *data) | |
221 { | |
222 /* skip reading the chunk ID, since it was already read at this point... */ | |
223 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
|
224 BAIL_IF_MACRO(!read_le32(rw, &data->chunkSize), NULL, 0); |
17 | 225 return(1); |
40
c15396fc0e55
Fixed incorrect comment, by Torbj�rn Andersson. :)
Ryan C. Gordon <icculus@icculus.org>
parents:
17
diff
changeset
|
226 } /* read_data_chunk */ |
17 | 227 |
228 | |
229 | |
230 | |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
231 /***************************************************************************** |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
232 * 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
|
233 *****************************************************************************/ |
17 | 234 |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
235 typedef struct |
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 fmt_t *fmt; |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
238 Sint32 bytesLeft; |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
239 } wav_t; |
17 | 240 |
241 | |
242 | |
243 | |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
244 /***************************************************************************** |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
245 * Normal, uncompressed waveform handler... * |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
246 *****************************************************************************/ |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
247 |
185
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
248 /* |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
249 * 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
|
250 */ |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
251 static Uint32 read_sample_fmt_normal(Sound_Sample *sample) |
17 | 252 { |
253 Uint32 retval; | |
254 Sound_SampleInternal *internal = (Sound_SampleInternal *) sample->opaque; | |
255 wav_t *w = (wav_t *) internal->decoder_private; | |
256 Uint32 max = (internal->buffer_size < (Uint32) w->bytesLeft) ? | |
257 internal->buffer_size : (Uint32) w->bytesLeft; | |
258 | |
259 assert(max > 0); | |
260 | |
261 /* | |
262 * We don't actually do any decoding, so we read the wav data | |
263 * directly into the internal buffer... | |
264 */ | |
265 retval = SDL_RWread(internal->rw, internal->buffer, 1, max); | |
266 | |
267 w->bytesLeft -= retval; | |
268 | |
269 /* Make sure the read went smoothly... */ | |
270 if ((retval == 0) || (w->bytesLeft == 0)) | |
271 sample->flags |= SOUND_SAMPLEFLAG_EOF; | |
272 | |
273 else if (retval == -1) | |
274 sample->flags |= SOUND_SAMPLEFLAG_ERROR; | |
275 | |
276 /* (next call this EAGAIN may turn into an EOF or error.) */ | |
277 else if (retval < internal->buffer_size) | |
278 sample->flags |= SOUND_SAMPLEFLAG_EAGAIN; | |
279 | |
280 return(retval); | |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
281 } /* read_sample_fmt_normal */ |
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 |
307
eb7c929193dd
Added seek support for uncompressed WAVs.
Ryan C. Gordon <icculus@icculus.org>
parents:
306
diff
changeset
|
284 static int seek_sample_fmt_normal(Sound_Sample *sample, Uint32 ms) |
eb7c929193dd
Added seek support for uncompressed WAVs.
Ryan C. Gordon <icculus@icculus.org>
parents:
306
diff
changeset
|
285 { |
eb7c929193dd
Added seek support for uncompressed WAVs.
Ryan C. Gordon <icculus@icculus.org>
parents:
306
diff
changeset
|
286 Sound_SampleInternal *internal = (Sound_SampleInternal *) sample->opaque; |
eb7c929193dd
Added seek support for uncompressed WAVs.
Ryan C. Gordon <icculus@icculus.org>
parents:
306
diff
changeset
|
287 wav_t *w = (wav_t *) internal->decoder_private; |
eb7c929193dd
Added seek support for uncompressed WAVs.
Ryan C. Gordon <icculus@icculus.org>
parents:
306
diff
changeset
|
288 fmt_t *fmt = w->fmt; |
eb7c929193dd
Added seek support for uncompressed WAVs.
Ryan C. Gordon <icculus@icculus.org>
parents:
306
diff
changeset
|
289 int offset = __Sound_convertMsToBytePos(&sample->actual, ms); |
eb7c929193dd
Added seek support for uncompressed WAVs.
Ryan C. Gordon <icculus@icculus.org>
parents:
306
diff
changeset
|
290 int pos = (int) (fmt->data_starting_offset + offset); |
eb7c929193dd
Added seek support for uncompressed WAVs.
Ryan C. Gordon <icculus@icculus.org>
parents:
306
diff
changeset
|
291 int rc = SDL_RWseek(internal->rw, pos, SEEK_SET); |
eb7c929193dd
Added seek support for uncompressed WAVs.
Ryan C. Gordon <icculus@icculus.org>
parents:
306
diff
changeset
|
292 BAIL_IF_MACRO(rc != pos, ERR_IO_ERROR, 0); |
eb7c929193dd
Added seek support for uncompressed WAVs.
Ryan C. Gordon <icculus@icculus.org>
parents:
306
diff
changeset
|
293 w->bytesLeft = fmt->total_bytes - offset; |
eb7c929193dd
Added seek support for uncompressed WAVs.
Ryan C. Gordon <icculus@icculus.org>
parents:
306
diff
changeset
|
294 return(1); /* success. */ |
eb7c929193dd
Added seek support for uncompressed WAVs.
Ryan C. Gordon <icculus@icculus.org>
parents:
306
diff
changeset
|
295 } /* seek_sample_fmt_normal */ |
eb7c929193dd
Added seek support for uncompressed WAVs.
Ryan C. Gordon <icculus@icculus.org>
parents:
306
diff
changeset
|
296 |
eb7c929193dd
Added seek support for uncompressed WAVs.
Ryan C. Gordon <icculus@icculus.org>
parents:
306
diff
changeset
|
297 |
221
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
193
diff
changeset
|
298 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
|
299 { |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
193
diff
changeset
|
300 /* no-op. */ |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
193
diff
changeset
|
301 return(1); |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
193
diff
changeset
|
302 } /* rewind_sample_fmt_normal */ |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
193
diff
changeset
|
303 |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
304 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
305 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
|
306 { |
178
bdbe09014724
Minor tweaks and such.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
307 /* (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
|
308 fmt->free = NULL; |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
309 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
|
310 fmt->rewind_sample = rewind_sample_fmt_normal; |
307
eb7c929193dd
Added seek support for uncompressed WAVs.
Ryan C. Gordon <icculus@icculus.org>
parents:
306
diff
changeset
|
311 fmt->seek_sample = seek_sample_fmt_normal; |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
312 return(1); |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
313 } /* read_fmt_normal */ |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
314 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
315 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
316 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
317 /***************************************************************************** |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
318 * ADPCM compression handler... * |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
319 *****************************************************************************/ |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
320 |
185
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
321 #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
|
322 #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
|
323 #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
|
324 |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
325 |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
326 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
|
327 { |
185
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
328 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
|
329 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
|
330 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
|
331 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
|
332 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
|
333 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
|
334 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
|
335 |
185
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
336 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
|
337 { |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
338 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
|
339 return(0); |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
340 } /* if */ |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
341 |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
342 w->bytesLeft -= fmt->wBlockAlign; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
343 |
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
|
344 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
|
345 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
|
346 |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
347 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
|
348 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
|
349 |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
350 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
|
351 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
|
352 |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
353 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
|
354 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
|
355 |
185
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
356 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
|
357 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
|
358 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
|
359 } /* 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
|
360 |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
361 |
185
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
362 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
|
363 ADPCMBLOCKHEADER *header, |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
364 Sint32 lPredSamp) |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
365 { |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
366 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
|
367 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
|
368 static const Sint32 AdaptionTable[] = |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
369 { |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
370 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
|
371 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
|
372 }; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
373 |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
374 Sint32 lNewSamp; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
375 Sint32 delta; |
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 if (nib & 0x08) |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
378 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
|
379 else |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
380 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
|
381 |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
382 /* clamp value... */ |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
383 if (lNewSamp < min_audioval) |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
384 lNewSamp = min_audioval; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
385 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
|
386 lNewSamp = max_audioval; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
387 |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
388 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
|
389 FIXED_POINT_ADAPTION_BASE; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
390 |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
391 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
|
392 delta = SMALLEST_ADPCM_DELTA; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
393 |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
394 header->iDelta = delta; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
395 header->iSamp2 = header->iSamp1; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
396 header->iSamp1 = lNewSamp; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
397 } /* do_adpcm_nibble */ |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
398 |
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 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
|
401 { |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
402 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
|
403 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
|
404 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
|
405 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
|
406 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
|
407 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
|
408 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
|
409 Sint32 delta; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
410 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
|
411 |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
412 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
|
413 { |
185
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
414 Uint8 byte; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
415 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
|
416 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
|
417 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
|
418 (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
|
419 FIXED_POINT_COEF_BASE; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
420 |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
421 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
|
422 { |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
423 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
|
424 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
|
425 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
|
426 } /* if */ |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
427 else |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
428 { |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
429 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
|
430 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
|
431 } /* 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
|
432 } /* for */ |
185
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
433 |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
434 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
|
435 return(1); |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
436 } /* decode_adpcm_sample_frame */ |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
437 |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
438 |
242
12a9c2e0b00f
Fixed compiler warnings (thanks, Darrell!)
Ryan C. Gordon <icculus@icculus.org>
parents:
221
diff
changeset
|
439 static inline void put_adpcm_sample_frame1(void *_buf, fmt_t *fmt) |
185
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
440 { |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
441 Uint16 *buf = (Uint16 *) _buf; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
442 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
|
443 int i; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
444 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
|
445 *(buf++) = headers[i].iSamp1; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
446 } /* put_adpcm_sample_frame1 */ |
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 |
242
12a9c2e0b00f
Fixed compiler warnings (thanks, Darrell!)
Ryan C. Gordon <icculus@icculus.org>
parents:
221
diff
changeset
|
449 static inline void put_adpcm_sample_frame2(void *_buf, fmt_t *fmt) |
185
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 Uint16 *buf = (Uint16 *) _buf; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
452 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
|
453 int i; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
454 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
|
455 *(buf++) = headers[i].iSamp2; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
456 } /* 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
|
457 |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
458 |
185
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
459 /* |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
460 * 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
|
461 */ |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
462 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
|
463 { |
185
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
464 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
|
465 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
|
466 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
|
467 Uint32 bw = 0; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
468 |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
469 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
|
470 { |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
471 /* 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
|
472 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
|
473 { |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
474 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
|
475 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
|
476 { |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
477 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
|
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 |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
482 /* only write first sample frame for now. */ |
246
170b1400e060
Cast to prevent pointer arithmatic on a (void *).
Ryan C. Gordon <icculus@icculus.org>
parents:
242
diff
changeset
|
483 put_adpcm_sample_frame2((Uint8 *) internal->buffer + bw, fmt); |
185
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
484 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
|
485 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
|
486 break; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
487 |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
488 case 1: /* output last sample frame of block... */ |
246
170b1400e060
Cast to prevent pointer arithmatic on a (void *).
Ryan C. Gordon <icculus@icculus.org>
parents:
242
diff
changeset
|
489 put_adpcm_sample_frame1((Uint8 *) internal->buffer + bw, fmt); |
185
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
490 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
|
491 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
|
492 break; |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
493 |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
494 default: /* output latest sample frame and read a new one... */ |
246
170b1400e060
Cast to prevent pointer arithmatic on a (void *).
Ryan C. Gordon <icculus@icculus.org>
parents:
242
diff
changeset
|
495 put_adpcm_sample_frame1((Uint8 *) internal->buffer + bw, fmt); |
185
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
496 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
|
497 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
|
498 |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
499 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
|
500 { |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
501 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
|
502 return(bw); |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
503 } /* if */ |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
504 } /* switch */ |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
505 } /* while */ |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
506 |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
507 return(bw); |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
508 } /* read_sample_fmt_adpcm */ |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
509 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
510 |
185
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
511 /* |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
512 * 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
|
513 */ |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
514 static void free_fmt_adpcm(fmt_t *fmt) |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
515 { |
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
|
516 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
|
517 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
|
518 |
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 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
|
520 free(fmt->fmt.adpcm.blockheaders); |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
521 } /* free_fmt_adpcm */ |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
522 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
523 |
221
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
193
diff
changeset
|
524 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
|
525 { |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
193
diff
changeset
|
526 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
|
527 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
|
528 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
|
529 return(1); |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
193
diff
changeset
|
530 } /* rewind_sample_fmt_adpcm */ |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
193
diff
changeset
|
531 |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
193
diff
changeset
|
532 |
307
eb7c929193dd
Added seek support for uncompressed WAVs.
Ryan C. Gordon <icculus@icculus.org>
parents:
306
diff
changeset
|
533 static int seek_sample_fmt_adpcm(Sound_Sample *sample, Uint32 ms) |
eb7c929193dd
Added seek support for uncompressed WAVs.
Ryan C. Gordon <icculus@icculus.org>
parents:
306
diff
changeset
|
534 { |
333
565ae12fa74e
Implemented seek support for ADPCM-compressed WAVs.
Ryan C. Gordon <icculus@icculus.org>
parents:
307
diff
changeset
|
535 Sound_SampleInternal *internal = (Sound_SampleInternal *) sample->opaque; |
565ae12fa74e
Implemented seek support for ADPCM-compressed WAVs.
Ryan C. Gordon <icculus@icculus.org>
parents:
307
diff
changeset
|
536 wav_t *w = (wav_t *) internal->decoder_private; |
565ae12fa74e
Implemented seek support for ADPCM-compressed WAVs.
Ryan C. Gordon <icculus@icculus.org>
parents:
307
diff
changeset
|
537 fmt_t *fmt = w->fmt; |
565ae12fa74e
Implemented seek support for ADPCM-compressed WAVs.
Ryan C. Gordon <icculus@icculus.org>
parents:
307
diff
changeset
|
538 Uint32 origsampsleft = fmt->fmt.adpcm.samples_left_in_block; |
565ae12fa74e
Implemented seek support for ADPCM-compressed WAVs.
Ryan C. Gordon <icculus@icculus.org>
parents:
307
diff
changeset
|
539 int origpos = SDL_RWtell(internal->rw); |
565ae12fa74e
Implemented seek support for ADPCM-compressed WAVs.
Ryan C. Gordon <icculus@icculus.org>
parents:
307
diff
changeset
|
540 int offset = __Sound_convertMsToBytePos(&sample->actual, ms); |
565ae12fa74e
Implemented seek support for ADPCM-compressed WAVs.
Ryan C. Gordon <icculus@icculus.org>
parents:
307
diff
changeset
|
541 int bpb = (fmt->fmt.adpcm.wSamplesPerBlock * fmt->sample_frame_size); |
565ae12fa74e
Implemented seek support for ADPCM-compressed WAVs.
Ryan C. Gordon <icculus@icculus.org>
parents:
307
diff
changeset
|
542 int skipsize = (offset / bpb) * fmt->wBlockAlign; |
565ae12fa74e
Implemented seek support for ADPCM-compressed WAVs.
Ryan C. Gordon <icculus@icculus.org>
parents:
307
diff
changeset
|
543 int pos = skipsize + fmt->data_starting_offset; |
565ae12fa74e
Implemented seek support for ADPCM-compressed WAVs.
Ryan C. Gordon <icculus@icculus.org>
parents:
307
diff
changeset
|
544 int rc = SDL_RWseek(internal->rw, pos, SEEK_SET); |
565ae12fa74e
Implemented seek support for ADPCM-compressed WAVs.
Ryan C. Gordon <icculus@icculus.org>
parents:
307
diff
changeset
|
545 BAIL_IF_MACRO(rc != pos, ERR_IO_ERROR, 0); |
565ae12fa74e
Implemented seek support for ADPCM-compressed WAVs.
Ryan C. Gordon <icculus@icculus.org>
parents:
307
diff
changeset
|
546 |
565ae12fa74e
Implemented seek support for ADPCM-compressed WAVs.
Ryan C. Gordon <icculus@icculus.org>
parents:
307
diff
changeset
|
547 /* The offset we need is in this block, so we need to decode to there. */ |
565ae12fa74e
Implemented seek support for ADPCM-compressed WAVs.
Ryan C. Gordon <icculus@icculus.org>
parents:
307
diff
changeset
|
548 skipsize += (offset % bpb); |
565ae12fa74e
Implemented seek support for ADPCM-compressed WAVs.
Ryan C. Gordon <icculus@icculus.org>
parents:
307
diff
changeset
|
549 rc = (offset % bpb); /* bytes into this block we need to decode */ |
565ae12fa74e
Implemented seek support for ADPCM-compressed WAVs.
Ryan C. Gordon <icculus@icculus.org>
parents:
307
diff
changeset
|
550 if (!read_adpcm_block_headers(sample)) |
565ae12fa74e
Implemented seek support for ADPCM-compressed WAVs.
Ryan C. Gordon <icculus@icculus.org>
parents:
307
diff
changeset
|
551 { |
565ae12fa74e
Implemented seek support for ADPCM-compressed WAVs.
Ryan C. Gordon <icculus@icculus.org>
parents:
307
diff
changeset
|
552 SDL_RWseek(internal->rw, origpos, SEEK_SET); /* try to make sane. */ |
565ae12fa74e
Implemented seek support for ADPCM-compressed WAVs.
Ryan C. Gordon <icculus@icculus.org>
parents:
307
diff
changeset
|
553 return(0); |
565ae12fa74e
Implemented seek support for ADPCM-compressed WAVs.
Ryan C. Gordon <icculus@icculus.org>
parents:
307
diff
changeset
|
554 } /* if */ |
565ae12fa74e
Implemented seek support for ADPCM-compressed WAVs.
Ryan C. Gordon <icculus@icculus.org>
parents:
307
diff
changeset
|
555 |
565ae12fa74e
Implemented seek support for ADPCM-compressed WAVs.
Ryan C. Gordon <icculus@icculus.org>
parents:
307
diff
changeset
|
556 /* first sample frame of block is a freebie. :) */ |
565ae12fa74e
Implemented seek support for ADPCM-compressed WAVs.
Ryan C. Gordon <icculus@icculus.org>
parents:
307
diff
changeset
|
557 fmt->fmt.adpcm.samples_left_in_block--; |
565ae12fa74e
Implemented seek support for ADPCM-compressed WAVs.
Ryan C. Gordon <icculus@icculus.org>
parents:
307
diff
changeset
|
558 rc -= fmt->sample_frame_size; |
565ae12fa74e
Implemented seek support for ADPCM-compressed WAVs.
Ryan C. Gordon <icculus@icculus.org>
parents:
307
diff
changeset
|
559 while (rc > 0) |
565ae12fa74e
Implemented seek support for ADPCM-compressed WAVs.
Ryan C. Gordon <icculus@icculus.org>
parents:
307
diff
changeset
|
560 { |
565ae12fa74e
Implemented seek support for ADPCM-compressed WAVs.
Ryan C. Gordon <icculus@icculus.org>
parents:
307
diff
changeset
|
561 if (!decode_adpcm_sample_frame(sample)) |
565ae12fa74e
Implemented seek support for ADPCM-compressed WAVs.
Ryan C. Gordon <icculus@icculus.org>
parents:
307
diff
changeset
|
562 { |
565ae12fa74e
Implemented seek support for ADPCM-compressed WAVs.
Ryan C. Gordon <icculus@icculus.org>
parents:
307
diff
changeset
|
563 SDL_RWseek(internal->rw, origpos, SEEK_SET); |
565ae12fa74e
Implemented seek support for ADPCM-compressed WAVs.
Ryan C. Gordon <icculus@icculus.org>
parents:
307
diff
changeset
|
564 fmt->fmt.adpcm.samples_left_in_block = origsampsleft; |
565ae12fa74e
Implemented seek support for ADPCM-compressed WAVs.
Ryan C. Gordon <icculus@icculus.org>
parents:
307
diff
changeset
|
565 return(0); |
565ae12fa74e
Implemented seek support for ADPCM-compressed WAVs.
Ryan C. Gordon <icculus@icculus.org>
parents:
307
diff
changeset
|
566 } /* if */ |
565ae12fa74e
Implemented seek support for ADPCM-compressed WAVs.
Ryan C. Gordon <icculus@icculus.org>
parents:
307
diff
changeset
|
567 |
565ae12fa74e
Implemented seek support for ADPCM-compressed WAVs.
Ryan C. Gordon <icculus@icculus.org>
parents:
307
diff
changeset
|
568 fmt->fmt.adpcm.samples_left_in_block--; |
565ae12fa74e
Implemented seek support for ADPCM-compressed WAVs.
Ryan C. Gordon <icculus@icculus.org>
parents:
307
diff
changeset
|
569 rc -= fmt->sample_frame_size; |
565ae12fa74e
Implemented seek support for ADPCM-compressed WAVs.
Ryan C. Gordon <icculus@icculus.org>
parents:
307
diff
changeset
|
570 } /* while */ |
565ae12fa74e
Implemented seek support for ADPCM-compressed WAVs.
Ryan C. Gordon <icculus@icculus.org>
parents:
307
diff
changeset
|
571 |
565ae12fa74e
Implemented seek support for ADPCM-compressed WAVs.
Ryan C. Gordon <icculus@icculus.org>
parents:
307
diff
changeset
|
572 w->bytesLeft = fmt->total_bytes - skipsize; |
565ae12fa74e
Implemented seek support for ADPCM-compressed WAVs.
Ryan C. Gordon <icculus@icculus.org>
parents:
307
diff
changeset
|
573 return(1); /* success. */ |
307
eb7c929193dd
Added seek support for uncompressed WAVs.
Ryan C. Gordon <icculus@icculus.org>
parents:
306
diff
changeset
|
574 } /* seek_sample_fmt_adpcm */ |
eb7c929193dd
Added seek support for uncompressed WAVs.
Ryan C. Gordon <icculus@icculus.org>
parents:
306
diff
changeset
|
575 |
eb7c929193dd
Added seek support for uncompressed WAVs.
Ryan C. Gordon <icculus@icculus.org>
parents:
306
diff
changeset
|
576 |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
577 /* |
307
eb7c929193dd
Added seek support for uncompressed WAVs.
Ryan C. Gordon <icculus@icculus.org>
parents:
306
diff
changeset
|
578 * Read in the adpcm-specific info from disk. This makes this process |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
579 * 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
|
580 * structure is packed. |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
581 */ |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
582 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
|
583 { |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
584 size_t i; |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
585 |
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
|
586 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
|
587 fmt->free = free_fmt_adpcm; |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
588 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
|
589 fmt->rewind_sample = rewind_sample_fmt_adpcm; |
333
565ae12fa74e
Implemented seek support for ADPCM-compressed WAVs.
Ryan C. Gordon <icculus@icculus.org>
parents:
307
diff
changeset
|
590 fmt->seek_sample = seek_sample_fmt_adpcm; |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
591 |
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
|
592 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
|
593 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
|
594 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
|
595 |
185
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
596 /* 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
|
597 |
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
|
598 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
|
599 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
|
600 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
|
601 |
185
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
602 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
|
603 { |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
604 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
|
605 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
|
606 } /* for */ |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
607 |
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
|
608 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
|
609 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
|
610 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
|
611 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
612 return(1); |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
613 } /* read_fmt_adpcm */ |
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 |
178
bdbe09014724
Minor tweaks and such.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
616 |
124
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 * Everything else... * |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
619 *****************************************************************************/ |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
620 |
178
bdbe09014724
Minor tweaks and such.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
621 static int WAV_init(void) |
bdbe09014724
Minor tweaks and such.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
622 { |
bdbe09014724
Minor tweaks and such.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
623 return(1); /* always succeeds. */ |
bdbe09014724
Minor tweaks and such.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
624 } /* WAV_init */ |
bdbe09014724
Minor tweaks and such.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
625 |
bdbe09014724
Minor tweaks and such.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
626 |
bdbe09014724
Minor tweaks and such.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
627 static void WAV_quit(void) |
bdbe09014724
Minor tweaks and such.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
628 { |
bdbe09014724
Minor tweaks and such.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
629 /* it's a no-op. */ |
bdbe09014724
Minor tweaks and such.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
630 } /* WAV_quit */ |
bdbe09014724
Minor tweaks and such.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
631 |
124
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 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
|
634 { |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
635 /* 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
|
636 switch (fmt->wFormatTag) |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
637 { |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
638 case FMT_NORMAL: |
178
bdbe09014724
Minor tweaks and such.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
639 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
|
640 return(read_fmt_normal(rw, fmt)); |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
641 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
642 case FMT_ADPCM: |
178
bdbe09014724
Minor tweaks and such.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
643 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
|
644 return(read_fmt_adpcm(rw, fmt)); |
178
bdbe09014724
Minor tweaks and such.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
645 |
bdbe09014724
Minor tweaks and such.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
646 /* add other types here. */ |
bdbe09014724
Minor tweaks and such.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
647 |
bdbe09014724
Minor tweaks and such.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
648 default: |
193
6cd07211a235
Added some debugging output in preparation for future codecs (gsm, maybe?)
Ryan C. Gordon <icculus@icculus.org>
parents:
185
diff
changeset
|
649 SNDDBG(("WAV: Format 0x%X is unknown.\n", |
178
bdbe09014724
Minor tweaks and such.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
650 (unsigned int) fmt->wFormatTag)); |
bdbe09014724
Minor tweaks and such.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
651 Sound_SetError("WAV: Unsupported format"); |
bdbe09014724
Minor tweaks and such.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
652 return(0); /* not supported whatsoever. */ |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
653 } /* switch */ |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
654 |
178
bdbe09014724
Minor tweaks and such.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
655 assert(0); /* shouldn't hit this point. */ |
bdbe09014724
Minor tweaks and such.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
656 return(0); |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
657 } /* read_fmt */ |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
658 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
659 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
660 /* |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
661 * 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
|
662 */ |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
663 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
|
664 { |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
665 Sint32 siz = 0; |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
666 Uint32 _id = 0; |
185
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
667 Uint32 pos = SDL_RWtell(rw); |
124
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 while (1) |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
670 { |
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
|
671 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
|
672 if (_id == id) |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
673 return(1); |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
674 |
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
|
675 /* 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
|
676 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
|
677 assert(siz >= 0); |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
678 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
|
679 if (siz > 0) |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
680 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
|
681 } /* while */ |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
682 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
683 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
|
684 } /* find_chunk */ |
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 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
687 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
|
688 { |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
689 Sound_SampleInternal *internal = (Sound_SampleInternal *) sample->opaque; |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
690 SDL_RWops *rw = internal->rw; |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
691 data_t d; |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
692 wav_t *w; |
185
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
693 Uint32 pos; |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
694 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
695 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
|
696 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
|
697 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
|
698 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
|
699 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
|
700 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
701 sample->actual.channels = (Uint8) fmt->wChannels; |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
702 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
|
703 if ((fmt->wBitsPerSample == 4) /*|| (fmt->wBitsPerSample == 0) */ ) |
351 | 704 sample->actual.format = AUDIO_S16SYS; |
185
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
705 else if (fmt->wBitsPerSample == 8) |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
706 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
|
707 else if (fmt->wBitsPerSample == 16) |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
708 sample->actual.format = AUDIO_S16LSB; |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
709 else |
193
6cd07211a235
Added some debugging output in preparation for future codecs (gsm, maybe?)
Ryan C. Gordon <icculus@icculus.org>
parents:
185
diff
changeset
|
710 { |
6cd07211a235
Added some debugging output in preparation for future codecs (gsm, maybe?)
Ryan C. Gordon <icculus@icculus.org>
parents:
185
diff
changeset
|
711 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
|
712 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
|
713 } /* else */ |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
714 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
715 BAIL_IF_MACRO(!read_fmt(rw, fmt), NULL, 0); |
364
4bcbc442d145
Fix to handle strange WAV fmt chunks.
Ryan C. Gordon <icculus@icculus.org>
parents:
351
diff
changeset
|
716 SDL_RWseek(rw, fmt->next_chunk_offset, SEEK_SET); |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
717 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
|
718 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
|
719 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
720 w = (wav_t *) malloc(sizeof(wav_t)); |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
721 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
|
722 w->fmt = fmt; |
221
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
193
diff
changeset
|
723 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
|
724 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
|
725 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
|
726 sample->actual.channels ); |
6bb68b3bdcf1
ADPCM decoder seems to be complete, other fixes too...
Ryan C. Gordon <icculus@icculus.org>
parents:
183
diff
changeset
|
727 |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
728 internal->decoder_private = (void *) w; |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
729 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
730 sample->flags = SOUND_SAMPLEFLAG_NONE; |
333
565ae12fa74e
Implemented seek support for ADPCM-compressed WAVs.
Ryan C. Gordon <icculus@icculus.org>
parents:
307
diff
changeset
|
731 if (fmt->seek_sample != NULL) |
307
eb7c929193dd
Added seek support for uncompressed WAVs.
Ryan C. Gordon <icculus@icculus.org>
parents:
306
diff
changeset
|
732 sample->flags |= SOUND_SAMPLEFLAG_CANSEEK; |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
733 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
734 SNDDBG(("WAV: Accepting data stream.\n")); |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
735 return(1); /* we'll handle this data. */ |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
736 } /* WAV_open_internal */ |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
737 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
738 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
739 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
|
740 { |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
741 int rc; |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
742 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
743 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
|
744 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
|
745 memset(fmt, '\0', sizeof (fmt_t)); |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
746 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
747 rc = WAV_open_internal(sample, ext, fmt); |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
748 if (!rc) |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
749 { |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
750 if (fmt->free != NULL) |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
751 fmt->free(fmt); |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
752 free(fmt); |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
753 } /* if */ |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
754 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
755 return(rc); |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
756 } /* WAV_open */ |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
757 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
758 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
759 static void WAV_close(Sound_Sample *sample) |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
760 { |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
761 Sound_SampleInternal *internal = (Sound_SampleInternal *) sample->opaque; |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
762 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
|
763 |
26996236d790
Updated comments to reflect change from LICENSE to COPYING file, and put a
Ryan C. Gordon <icculus@icculus.org>
parents:
178
diff
changeset
|
764 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
|
765 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
|
766 |
124
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
767 free(w->fmt); |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
768 free(w); |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
769 } /* WAV_close */ |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
770 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
771 |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
772 static Uint32 WAV_read(Sound_Sample *sample) |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
773 { |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
774 Sound_SampleInternal *internal = (Sound_SampleInternal *) sample->opaque; |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
775 wav_t *w = (wav_t *) internal->decoder_private; |
e46e31fdecfd
Restructured to handle multiple formats.
Ryan C. Gordon <icculus@icculus.org>
parents:
106
diff
changeset
|
776 return(w->fmt->read_sample(sample)); |
17 | 777 } /* WAV_read */ |
778 | |
221
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
193
diff
changeset
|
779 |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
193
diff
changeset
|
780 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
|
781 { |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
193
diff
changeset
|
782 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
|
783 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
|
784 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
|
785 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
|
786 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
|
787 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
|
788 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
|
789 } /* WAV_rewind */ |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
193
diff
changeset
|
790 |
306
c97be6e1bd27
Added framework for Sound_Seek() support.
Ryan C. Gordon <icculus@icculus.org>
parents:
246
diff
changeset
|
791 |
c97be6e1bd27
Added framework for Sound_Seek() support.
Ryan C. Gordon <icculus@icculus.org>
parents:
246
diff
changeset
|
792 static int WAV_seek(Sound_Sample *sample, Uint32 ms) |
c97be6e1bd27
Added framework for Sound_Seek() support.
Ryan C. Gordon <icculus@icculus.org>
parents:
246
diff
changeset
|
793 { |
307
eb7c929193dd
Added seek support for uncompressed WAVs.
Ryan C. Gordon <icculus@icculus.org>
parents:
306
diff
changeset
|
794 Sound_SampleInternal *internal = (Sound_SampleInternal *) sample->opaque; |
eb7c929193dd
Added seek support for uncompressed WAVs.
Ryan C. Gordon <icculus@icculus.org>
parents:
306
diff
changeset
|
795 wav_t *w = (wav_t *) internal->decoder_private; |
eb7c929193dd
Added seek support for uncompressed WAVs.
Ryan C. Gordon <icculus@icculus.org>
parents:
306
diff
changeset
|
796 return(w->fmt->seek_sample(sample, ms)); |
306
c97be6e1bd27
Added framework for Sound_Seek() support.
Ryan C. Gordon <icculus@icculus.org>
parents:
246
diff
changeset
|
797 } /* WAV_seek */ |
c97be6e1bd27
Added framework for Sound_Seek() support.
Ryan C. Gordon <icculus@icculus.org>
parents:
246
diff
changeset
|
798 |
64
40006625142a
Changes in preparation of autoconf support.
Ryan C. Gordon <icculus@icculus.org>
parents:
62
diff
changeset
|
799 #endif /* SOUND_SUPPORTS_WAV */ |
17 | 800 |
801 /* end of wav.c ... */ | |
802 |