Mercurial > SDL_sound_CoreAudio
annotate decoders/aiff.c @ 474:c66080364dff
Most decoders now report total sample play time, now. Technically, this
breaks binary compatibility with the 1.0 branch, since it extends the
Sound_Sample struct, but most (all?) programs are just passing pointers
allocated by SDL_sound around, and might be okay.
Source-level compatibility is not broken...yet! :)
--ryan.
-------- Original Message --------
Subject: SDL_sound patch: Finding total length of time of sound file.
Date: Sun, 26 Jan 2003 09:31:17 -0800 (PST)
Hi Ryan,
I am working with Eric Wing and helping him modify
SDL_sound. AS part of our efforts in improving and
enhancing SDL_sound, we like to submit this patch. We
modified the codecs to find the total time of a sound
file. Below is the explanation of the patch. The
patch is appended as an attachment to this email.
* MOTIVATION:
We needed the ability to get the total play time of a
sample (And we noticed that we're not the only ones).
Since SDL_sound blocks direct access to the specific
decoders, there is no way for a user to know this
information short of decoding the whole thing.
Because of this, we believe this will be a useful
addition, even though the accuracy may not be perfect
(subject to each decoder) or the information may not
always be available.
* CONTRIBUTORS:
Wesley Leong (modified the majority of the codecs and
verified the results)
Eric Wing (showed everyone how to do modify codec,
modified mikmod)
Wang Lam (modified a handful of codecs, researched
into specs and int overflow)
Ahilan Anantha (modified a few codecs and helped with
integer math)
* GENERAL ISSUES:
We chose the value to be milliseconds as an Sint32.
Milliseconds because that's what Sound_Seek takes as a
parameter and -1 to allow for instances/codecs where
the value could not be determined. We are
not sure if this is the final convention you want, so
we are willing to work with you on this.
We also expect the total_time field to be set on open
and never again modified by SDL_sound. Users may
access it directly much like the sample buffer and
buffer_size. We thought about recomputing the time
on DecodeAll, but since users may seek or decode small
chunks first, not all the data may be there. So this
is better done by the user. This may be good
information to document.
Currently, all the main codecs are implemented except
for QuickTime.
author | Ryan C. Gordon <icculus@icculus.org> |
---|---|
date | Sat, 08 May 2004 08:19:50 +0000 |
parents | 9d0b5ec9cc26 |
children | 3e705c9180e5 |
rev | line source |
---|---|
34
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
1 /* |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
2 * SDL_sound -- An abstract sound format decoding API. |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
3 * Copyright (C) 2001 Ryan C. Gordon. |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
4 * |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
5 * This library is free software; you can redistribute it and/or |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
6 * modify it under the terms of the GNU Lesser General Public |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
7 * License as published by the Free Software Foundation; either |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
8 * version 2.1 of the License, or (at your option) any later version. |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
9 * |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
10 * This library is distributed in the hope that it will be useful, |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
13 * Lesser General Public License for more details. |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
14 * |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
15 * You should have received a copy of the GNU Lesser General Public |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
16 * License along with this library; if not, write to the Free Software |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
18 */ |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
19 |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
20 /* |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
21 * AIFF decoder for SDL_sound |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
22 * |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
23 * [Insert something profound about the AIFF file format here.] |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
24 * |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
25 * This code was ripped from a decoder I had written for SDL_mixer, which was |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
26 * based on SDL_mixer's old AIFF music loader. (This loader was unfortunately |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
27 * completely broken, but it was still useful because all the pieces were |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
28 * still there, so to speak.) |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
29 * |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
30 * When rewriting it for SDL_sound, I changed its structure to be more like |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
31 * the WAV loader Ryan wrote. Had they not both been part of the same project |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
32 * it would have been embarrassing how similar they are. |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
33 * |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
34 * It is not the most feature-complete AIFF loader the world has ever seen. |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
35 * For instance, it only makes a token attempt at implementing the AIFF-C |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
36 * standard; basically the parts of it that I can easily understand and test. |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
37 * It's a start, though. |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
38 * |
184
47cc2de2ae36
Changed reference to "LICENSE" file to "COPYING".
Ryan C. Gordon <icculus@icculus.org>
parents:
180
diff
changeset
|
39 * Please see the file COPYING in the source's root directory. |
34
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
40 * |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
41 * This file was written by Torbjörn Andersson. (d91tan@Update.UU.SE) |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
42 */ |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
43 |
106
40de367eb59e
Changing my include structure to do this right.
Ryan C. Gordon <icculus@icculus.org>
parents:
104
diff
changeset
|
44 #if HAVE_CONFIG_H |
40de367eb59e
Changing my include structure to do this right.
Ryan C. Gordon <icculus@icculus.org>
parents:
104
diff
changeset
|
45 # include <config.h> |
40de367eb59e
Changing my include structure to do this right.
Ryan C. Gordon <icculus@icculus.org>
parents:
104
diff
changeset
|
46 #endif |
100
6d9fdec2f708
added config.h, added --enable-debug flag, various other changes to the build system
fingolfin
parents:
64
diff
changeset
|
47 |
104
103cfcb3c014
Updated to fix build system problem.
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
48 #ifdef SOUND_SUPPORTS_AIFF |
103cfcb3c014
Updated to fix build system problem.
Ryan C. Gordon <icculus@icculus.org>
parents:
100
diff
changeset
|
49 |
34
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
50 #include <stdio.h> |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
51 #include <stdlib.h> |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
52 #include <string.h> |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
53 |
106
40de367eb59e
Changing my include structure to do this right.
Ryan C. Gordon <icculus@icculus.org>
parents:
104
diff
changeset
|
54 #include "SDL_sound.h" |
40de367eb59e
Changing my include structure to do this right.
Ryan C. Gordon <icculus@icculus.org>
parents:
104
diff
changeset
|
55 |
40de367eb59e
Changing my include structure to do this right.
Ryan C. Gordon <icculus@icculus.org>
parents:
104
diff
changeset
|
56 #define __SDL_SOUND_INTERNAL__ |
40de367eb59e
Changing my include structure to do this right.
Ryan C. Gordon <icculus@icculus.org>
parents:
104
diff
changeset
|
57 #include "SDL_sound_internal.h" |
40de367eb59e
Changing my include structure to do this right.
Ryan C. Gordon <icculus@icculus.org>
parents:
104
diff
changeset
|
58 |
180
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
59 static Uint32 SANE_to_Uint32 (Uint8 *sanebuf); |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
60 |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
61 |
47
ea58bc3b15d7
Added init() and quit() methods.
Ryan C. Gordon <icculus@icculus.org>
parents:
41
diff
changeset
|
62 static int AIFF_init(void); |
ea58bc3b15d7
Added init() and quit() methods.
Ryan C. Gordon <icculus@icculus.org>
parents:
41
diff
changeset
|
63 static void AIFF_quit(void); |
34
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
64 static int AIFF_open(Sound_Sample *sample, const char *ext); |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
65 static void AIFF_close(Sound_Sample *sample); |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
66 static Uint32 AIFF_read(Sound_Sample *sample); |
221
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
184
diff
changeset
|
67 static int AIFF_rewind(Sound_Sample *sample); |
306
c97be6e1bd27
Added framework for Sound_Seek() support.
Ryan C. Gordon <icculus@icculus.org>
parents:
221
diff
changeset
|
68 static int AIFF_seek(Sound_Sample *sample, Uint32 ms); |
34
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
69 |
149
1df5c106504e
Decoders can now list multiple file extensions.
Ryan C. Gordon <icculus@icculus.org>
parents:
116
diff
changeset
|
70 static const char *extensions_aiff[] = { "AIFF", NULL }; |
34
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
71 const Sound_DecoderFunctions __Sound_DecoderFunctions_AIFF = |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
72 { |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
73 { |
149
1df5c106504e
Decoders can now list multiple file extensions.
Ryan C. Gordon <icculus@icculus.org>
parents:
116
diff
changeset
|
74 extensions_aiff, |
34
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
75 "Audio Interchange File Format", |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
76 "Torbjörn Andersson <d91tan@Update.UU.SE>", |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
77 "http://www.icculus.org/SDL_sound/" |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
78 }, |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
79 |
221
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
184
diff
changeset
|
80 AIFF_init, /* init() method */ |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
184
diff
changeset
|
81 AIFF_quit, /* quit() method */ |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
184
diff
changeset
|
82 AIFF_open, /* open() method */ |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
184
diff
changeset
|
83 AIFF_close, /* close() method */ |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
184
diff
changeset
|
84 AIFF_read, /* read() method */ |
306
c97be6e1bd27
Added framework for Sound_Seek() support.
Ryan C. Gordon <icculus@icculus.org>
parents:
221
diff
changeset
|
85 AIFF_rewind, /* rewind() method */ |
c97be6e1bd27
Added framework for Sound_Seek() support.
Ryan C. Gordon <icculus@icculus.org>
parents:
221
diff
changeset
|
86 AIFF_seek /* seek() method */ |
34
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
87 }; |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
88 |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
89 |
180
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
90 /***************************************************************************** |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
91 * aiff_t is what we store in our internal->decoder_private field... * |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
92 *****************************************************************************/ |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
93 typedef struct S_AIFF_FMT_T |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
94 { |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
95 Uint32 type; |
221
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
184
diff
changeset
|
96 |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
184
diff
changeset
|
97 Uint32 total_bytes; |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
184
diff
changeset
|
98 Uint32 data_starting_offset; |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
184
diff
changeset
|
99 |
180
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
100 void (*free)(struct S_AIFF_FMT_T *fmt); |
221
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
184
diff
changeset
|
101 Uint32 (*read_sample)(Sound_Sample *sample); |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
184
diff
changeset
|
102 int (*rewind_sample)(Sound_Sample *sample); |
332
8ba541e81c1e
seek method implementation.
Ryan C. Gordon <icculus@icculus.org>
parents:
306
diff
changeset
|
103 int (*seek_sample)(Sound_Sample *sample, Uint32 ms); |
221
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
184
diff
changeset
|
104 |
180
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
105 |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
106 #if 0 |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
107 /* |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
108 this is ripped from wav.c as ann example of format-specific data. |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
109 please replace with something more appropriate when the need arises. |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
110 */ |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
111 union |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
112 { |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
113 struct |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
114 { |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
115 Uint16 cbSize; |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
116 Uint16 wSamplesPerBlock; |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
117 Uint16 wNumCoef; |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
118 ADPCMCOEFSET *aCoeff; |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
119 } adpcm; |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
120 |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
121 /* put other format-specific data here... */ |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
122 } fmt; |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
123 #endif |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
124 } fmt_t; |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
125 |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
126 |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
127 typedef struct |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
128 { |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
129 fmt_t fmt; |
34
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
130 Sint32 bytesLeft; |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
131 } aiff_t; |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
132 |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
133 |
180
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
134 |
34
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
135 /* Chunk management code... */ |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
136 |
180
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
137 #define formID 0x4D524F46 /* "FORM", in ascii. */ |
34
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
138 #define aiffID 0x46464941 /* "AIFF", in ascii. */ |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
139 #define aifcID 0x43464941 /* "AIFC", in ascii. */ |
180
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
140 #define ssndID 0x444E5353 /* "SSND", in ascii. */ |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
141 |
34
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
142 |
180
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
143 /***************************************************************************** |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
144 * The COMM chunk... * |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
145 *****************************************************************************/ |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
146 |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
147 #define commID 0x4D4D4F43 /* "COMM", in ascii. */ |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
148 |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
149 /* format/compression types... */ |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
150 #define noneID 0x454E4F4E /* "NONE", in ascii. */ |
34
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
151 |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
152 typedef struct |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
153 { |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
154 Uint32 ckID; |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
155 Uint32 ckDataSize; |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
156 Uint16 numChannels; |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
157 Uint32 numSampleFrames; |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
158 Uint16 sampleSize; |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
159 Uint32 sampleRate; |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
160 /* |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
161 * We don't handle AIFF-C compressed audio yet, but for those |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
162 * interested the allowed compression types are supposed to be |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
163 * |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
164 * compressionType compressionName meaning |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
165 * --------------------------------------------------------------- |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
166 * 'NONE' "not compressed" uncompressed, that is, |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
167 * straight digitized samples |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
168 * 'ACE2' "ACE 2-to-1" 2-to-1 IIGS ACE (Audio |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
169 * Compression / Expansion) |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
170 * 'ACE8' "ACE 8-to-3" 8-to-3 IIGS ACE (Audio |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
171 * Compression / Expansion) |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
172 * 'MAC3' "MACE 3-to-1" 3-to-1 Macintosh Audio |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
173 * Compression / Expansion |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
174 * 'MAC6' "MACE 6-to-1" 6-to-1 Macintosh Audio |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
175 * Compression / Expansion |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
176 * |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
177 * A pstring is a "Pascal-style string", that is, "one byte followed |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
178 * by test bytes followed when needed by one pad byte. The total |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
179 * number of bytes in a pstring must be even. The pad byte is |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
180 * included when the number of text bytes is even, so the total of |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
181 * text bytes + one count byte + one pad byte will be even. This pad |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
182 * byte is not reflected in the count." |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
183 * |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
184 * As for how these compression algorithms work, your guess is as |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
185 * good as mine. |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
186 */ |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
187 Uint32 compressionType; |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
188 #if 0 |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
189 pstring compressionName; |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
190 #endif |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
191 } comm_t; |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
192 |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
193 |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
194 /* |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
195 * Read in a comm_t from disk. This makes this process safe regardless of |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
196 * the processor's byte order or how the comm_t structure is packed. |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
197 */ |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
198 |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
199 static int read_comm_chunk(SDL_RWops *rw, comm_t *comm) |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
200 { |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
201 Uint8 sampleRate[10]; |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
202 |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
203 /* skip reading the chunk ID, since it was already read at this point... */ |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
204 comm->ckID = commID; |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
205 |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
206 if (SDL_RWread(rw, &comm->ckDataSize, sizeof (comm->ckDataSize), 1) != 1) |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
207 return(0); |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
208 comm->ckDataSize = SDL_SwapBE32(comm->ckDataSize); |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
209 |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
210 if (SDL_RWread(rw, &comm->numChannels, sizeof (comm->numChannels), 1) != 1) |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
211 return(0); |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
212 comm->numChannels = SDL_SwapBE16(comm->numChannels); |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
213 |
41
0d5ff5679523
Cleanups from Torbj�rn Andersson.
Ryan C. Gordon <icculus@icculus.org>
parents:
34
diff
changeset
|
214 if (SDL_RWread(rw, &comm->numSampleFrames, |
0d5ff5679523
Cleanups from Torbj�rn Andersson.
Ryan C. Gordon <icculus@icculus.org>
parents:
34
diff
changeset
|
215 sizeof (comm->numSampleFrames), 1) != 1) |
34
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
216 return(0); |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
217 comm->numSampleFrames = SDL_SwapBE32(comm->numSampleFrames); |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
218 |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
219 if (SDL_RWread(rw, &comm->sampleSize, sizeof (comm->sampleSize), 1) != 1) |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
220 return(0); |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
221 comm->sampleSize = SDL_SwapBE16(comm->sampleSize); |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
222 |
41
0d5ff5679523
Cleanups from Torbj�rn Andersson.
Ryan C. Gordon <icculus@icculus.org>
parents:
34
diff
changeset
|
223 if (SDL_RWread(rw, sampleRate, sizeof (sampleRate), 1) != 1) |
34
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
224 return(0); |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
225 comm->sampleRate = SANE_to_Uint32(sampleRate); |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
226 |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
227 if (comm->ckDataSize > sizeof(comm->numChannels) |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
228 + sizeof(comm->numSampleFrames) |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
229 + sizeof(comm->sampleSize) |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
230 + sizeof(sampleRate)) |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
231 { |
41
0d5ff5679523
Cleanups from Torbj�rn Andersson.
Ryan C. Gordon <icculus@icculus.org>
parents:
34
diff
changeset
|
232 if (SDL_RWread(rw, &comm->compressionType, |
0d5ff5679523
Cleanups from Torbj�rn Andersson.
Ryan C. Gordon <icculus@icculus.org>
parents:
34
diff
changeset
|
233 sizeof (comm->compressionType), 1) != 1) |
34
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
234 return(0); |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
235 comm->compressionType = SDL_SwapBE32(comm->compressionType); |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
236 } /* if */ |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
237 else |
180
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
238 { |
34
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
239 comm->compressionType = noneID; |
180
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
240 } /* else */ |
34
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
241 |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
242 return(1); |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
243 } /* read_comm_chunk */ |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
244 |
180
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
245 |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
246 |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
247 /***************************************************************************** |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
248 * The SSND chunk... * |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
249 *****************************************************************************/ |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
250 |
34
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
251 typedef struct |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
252 { |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
253 Uint32 ckID; |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
254 Uint32 ckDataSize; |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
255 Uint32 offset; |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
256 Uint32 blockSize; |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
257 /* |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
258 * Then, comm->numSampleFrames sample frames. (It's better to get the |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
259 * length from numSampleFrames than from ckDataSize.) |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
260 */ |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
261 } ssnd_t; |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
262 |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
263 |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
264 static int read_ssnd_chunk(SDL_RWops *rw, ssnd_t *ssnd) |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
265 { |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
266 /* skip reading the chunk ID, since it was already read at this point... */ |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
267 ssnd->ckID = ssndID; |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
268 |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
269 if (SDL_RWread(rw, &ssnd->ckDataSize, sizeof (ssnd->ckDataSize), 1) != 1) |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
270 return(0); |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
271 ssnd->ckDataSize = SDL_SwapBE32(ssnd->ckDataSize); |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
272 |
41
0d5ff5679523
Cleanups from Torbj�rn Andersson.
Ryan C. Gordon <icculus@icculus.org>
parents:
34
diff
changeset
|
273 if (SDL_RWread(rw, &ssnd->offset, sizeof (ssnd->offset), 1) != 1) |
34
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
274 return(0); |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
275 ssnd->offset = SDL_SwapBE32(ssnd->offset); |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
276 |
41
0d5ff5679523
Cleanups from Torbj�rn Andersson.
Ryan C. Gordon <icculus@icculus.org>
parents:
34
diff
changeset
|
277 if (SDL_RWread(rw, &ssnd->blockSize, sizeof (ssnd->blockSize), 1) != 1) |
34
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
278 return(0); |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
279 ssnd->blockSize = SDL_SwapBE32(ssnd->blockSize); |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
280 |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
281 /* Leave the SDL_RWops position indicator at the start of the samples */ |
41
0d5ff5679523
Cleanups from Torbj�rn Andersson.
Ryan C. Gordon <icculus@icculus.org>
parents:
34
diff
changeset
|
282 if (SDL_RWseek(rw, (int) ssnd->offset, SEEK_CUR) == -1) |
34
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
283 return(0); |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
284 |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
285 return(1); |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
286 } /* read_ssnd_chunk */ |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
287 |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
288 |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
289 |
180
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
290 /***************************************************************************** |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
291 * Normal, uncompressed aiff handler... * |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
292 *****************************************************************************/ |
34
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
293 |
180
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
294 static Uint32 read_sample_fmt_normal(Sound_Sample *sample) |
34
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
295 { |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
296 Uint32 retval; |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
297 Sound_SampleInternal *internal = (Sound_SampleInternal *) sample->opaque; |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
298 aiff_t *a = (aiff_t *) internal->decoder_private; |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
299 Uint32 max = (internal->buffer_size < (Uint32) a->bytesLeft) ? |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
300 internal->buffer_size : (Uint32) a->bytesLeft; |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
301 |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
302 assert(max > 0); |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
303 |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
304 /* |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
305 * We don't actually do any decoding, so we read the AIFF data |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
306 * directly into the internal buffer... |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
307 */ |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
308 retval = SDL_RWread(internal->rw, internal->buffer, 1, max); |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
309 |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
310 a->bytesLeft -= retval; |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
311 |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
312 /* Make sure the read went smoothly... */ |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
313 if ((retval == 0) || (a->bytesLeft == 0)) |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
314 sample->flags |= SOUND_SAMPLEFLAG_EOF; |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
315 |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
316 else if (retval == -1) |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
317 sample->flags |= SOUND_SAMPLEFLAG_ERROR; |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
318 |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
319 /* (next call this EAGAIN may turn into an EOF or error.) */ |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
320 else if (retval < internal->buffer_size) |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
321 sample->flags |= SOUND_SAMPLEFLAG_EAGAIN; |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
322 |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
323 return(retval); |
180
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
324 } /* read_sample_fmt_normal */ |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
325 |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
326 |
221
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
184
diff
changeset
|
327 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:
184
diff
changeset
|
328 { |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
184
diff
changeset
|
329 /* no-op. */ |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
184
diff
changeset
|
330 return(1); |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
184
diff
changeset
|
331 } /* rewind_sample_fmt_normal */ |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
184
diff
changeset
|
332 |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
184
diff
changeset
|
333 |
332
8ba541e81c1e
seek method implementation.
Ryan C. Gordon <icculus@icculus.org>
parents:
306
diff
changeset
|
334 static int seek_sample_fmt_normal(Sound_Sample *sample, Uint32 ms) |
8ba541e81c1e
seek method implementation.
Ryan C. Gordon <icculus@icculus.org>
parents:
306
diff
changeset
|
335 { |
8ba541e81c1e
seek method implementation.
Ryan C. Gordon <icculus@icculus.org>
parents:
306
diff
changeset
|
336 Sound_SampleInternal *internal = (Sound_SampleInternal *) sample->opaque; |
8ba541e81c1e
seek method implementation.
Ryan C. Gordon <icculus@icculus.org>
parents:
306
diff
changeset
|
337 aiff_t *a = (aiff_t *) internal->decoder_private; |
8ba541e81c1e
seek method implementation.
Ryan C. Gordon <icculus@icculus.org>
parents:
306
diff
changeset
|
338 fmt_t *fmt = &a->fmt; |
8ba541e81c1e
seek method implementation.
Ryan C. Gordon <icculus@icculus.org>
parents:
306
diff
changeset
|
339 int offset = __Sound_convertMsToBytePos(&sample->actual, ms); |
8ba541e81c1e
seek method implementation.
Ryan C. Gordon <icculus@icculus.org>
parents:
306
diff
changeset
|
340 int pos = (int) (fmt->data_starting_offset + offset); |
8ba541e81c1e
seek method implementation.
Ryan C. Gordon <icculus@icculus.org>
parents:
306
diff
changeset
|
341 int rc = SDL_RWseek(internal->rw, pos, SEEK_SET); |
8ba541e81c1e
seek method implementation.
Ryan C. Gordon <icculus@icculus.org>
parents:
306
diff
changeset
|
342 BAIL_IF_MACRO(rc != pos, ERR_IO_ERROR, 0); |
8ba541e81c1e
seek method implementation.
Ryan C. Gordon <icculus@icculus.org>
parents:
306
diff
changeset
|
343 a->bytesLeft = fmt->total_bytes - offset; |
8ba541e81c1e
seek method implementation.
Ryan C. Gordon <icculus@icculus.org>
parents:
306
diff
changeset
|
344 return(1); /* success. */ |
8ba541e81c1e
seek method implementation.
Ryan C. Gordon <icculus@icculus.org>
parents:
306
diff
changeset
|
345 } /* seek_sample_fmt_normal */ |
8ba541e81c1e
seek method implementation.
Ryan C. Gordon <icculus@icculus.org>
parents:
306
diff
changeset
|
346 |
8ba541e81c1e
seek method implementation.
Ryan C. Gordon <icculus@icculus.org>
parents:
306
diff
changeset
|
347 |
180
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
348 static void free_fmt_normal(fmt_t *fmt) |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
349 { |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
350 /* it's a no-op. */ |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
351 } /* free_fmt_normal */ |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
352 |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
353 |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
354 static int read_fmt_normal(SDL_RWops *rw, fmt_t *fmt) |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
355 { |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
356 /* (don't need to read more from the RWops...) */ |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
357 fmt->free = free_fmt_normal; |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
358 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:
184
diff
changeset
|
359 fmt->rewind_sample = rewind_sample_fmt_normal; |
332
8ba541e81c1e
seek method implementation.
Ryan C. Gordon <icculus@icculus.org>
parents:
306
diff
changeset
|
360 fmt->seek_sample = seek_sample_fmt_normal; |
180
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
361 return(1); |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
362 } /* read_fmt_normal */ |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
363 |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
364 |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
365 |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
366 |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
367 /***************************************************************************** |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
368 * Everything else... * |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
369 *****************************************************************************/ |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
370 |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
371 static int AIFF_init(void) |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
372 { |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
373 return(1); /* always succeeds. */ |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
374 } /* AIFF_init */ |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
375 |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
376 |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
377 static void AIFF_quit(void) |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
378 { |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
379 /* it's a no-op. */ |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
380 } /* AIFF_quit */ |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
381 |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
382 |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
383 /* |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
384 * Sample rate is encoded as an "80 bit IEEE Standard 754 floating point |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
385 * number (Standard Apple Numeric Environment [SANE] data type Extended)". |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
386 * Whose bright idea was that? |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
387 * |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
388 * This function was adapted from libsndfile, and while I do know a little |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
389 * bit about the IEEE floating point standard I don't pretend to fully |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
390 * understand this. |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
391 */ |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
392 static Uint32 SANE_to_Uint32 (Uint8 *sanebuf) |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
393 { |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
394 /* Is the frequency outside of what we can represent with Uint32? */ |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
395 if ( (sanebuf[0] & 0x80) |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
396 || (sanebuf[0] <= 0x3F) |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
397 || (sanebuf[0] > 0x40) |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
398 || (sanebuf[0] == 0x40 && sanebuf[1] > 0x1C) ) |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
399 return 0; |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
400 |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
401 return ((sanebuf[2] << 23) | (sanebuf[3] << 15) | (sanebuf[4] << 7) |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
402 | (sanebuf[5] >> 1)) >> (29 - sanebuf[1]); |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
403 } /* SANE_to_Uint32 */ |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
404 |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
405 |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
406 static int find_chunk(SDL_RWops *rw, Uint32 id) |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
407 { |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
408 Sint32 siz = 0; |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
409 Uint32 _id = 0; |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
410 |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
411 while (1) |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
412 { |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
413 BAIL_IF_MACRO(SDL_RWread(rw, &_id, sizeof (_id), 1) != 1, NULL, 0); |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
414 if (SDL_SwapLE32(_id) == id) |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
415 return(1); |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
416 |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
417 BAIL_IF_MACRO(SDL_RWread(rw, &siz, sizeof (siz), 1) != 1, NULL, 0); |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
418 siz = SDL_SwapBE32(siz); |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
419 assert(siz > 0); |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
420 BAIL_IF_MACRO(SDL_RWseek(rw, siz, SEEK_CUR) == -1, NULL, 0); |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
421 } /* while */ |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
422 |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
423 return(0); /* shouldn't hit this, but just in case... */ |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
424 } /* find_chunk */ |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
425 |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
426 |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
427 static int read_fmt(SDL_RWops *rw, comm_t *c, fmt_t *fmt) |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
428 { |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
429 fmt->type = c->compressionType; |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
430 |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
431 /* if it's in this switch statement, we support the format. */ |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
432 switch (fmt->type) |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
433 { |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
434 case noneID: |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
435 SNDDBG(("AIFF: Appears to be uncompressed audio.\n")); |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
436 return(read_fmt_normal(rw, fmt)); |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
437 |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
438 /* add other types here. */ |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
439 |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
440 default: |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
441 SNDDBG(("AIFF: Format %lu is unknown.\n", |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
442 (unsigned int) fmt->type)); |
387
fb519e6028e3
Changed all the Sound_SetError() calls to __Sound_SetError (or BAIL*_MACRO)
Ryan C. Gordon <icculus@icculus.org>
parents:
377
diff
changeset
|
443 BAIL_MACRO("AIFF: Unsupported format", 0); |
180
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
444 } /* switch */ |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
445 |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
446 assert(0); /* shouldn't hit this point. */ |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
447 return(0); |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
448 } /* read_fmt */ |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
449 |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
450 |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
451 static int AIFF_open(Sound_Sample *sample, const char *ext) |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
452 { |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
453 Sound_SampleInternal *internal = (Sound_SampleInternal *) sample->opaque; |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
454 SDL_RWops *rw = internal->rw; |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
455 Uint32 chunk_id; |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
456 int bytes_per_sample; |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
457 long pos; |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
458 comm_t c; |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
459 ssnd_t s; |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
460 aiff_t *a; |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
461 |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
462 BAIL_IF_MACRO(SDL_ReadLE32(rw) != formID, "AIFF: Not a FORM file.", 0); |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
463 SDL_ReadBE32(rw); /* throw the length away; we don't need it. */ |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
464 |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
465 chunk_id = SDL_ReadLE32(rw); |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
466 BAIL_IF_MACRO(chunk_id != aiffID && chunk_id != aifcID, |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
467 "AIFF: Not an AIFF or AIFC file.", 0); |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
468 |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
469 /* Chunks may appear in any order, so we establish base camp here. */ |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
470 pos = SDL_RWtell(rw); |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
471 |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
472 BAIL_IF_MACRO(!find_chunk(rw, commID), "AIFF: No common chunk.", 0); |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
473 BAIL_IF_MACRO(!read_comm_chunk(rw, &c), |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
474 "AIFF: Can't read common chunk.", 0); |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
475 |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
476 sample->actual.channels = (Uint8) c.numChannels; |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
477 sample->actual.rate = c.sampleRate; |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
478 |
474
c66080364dff
Most decoders now report total sample play time, now. Technically, this
Ryan C. Gordon <icculus@icculus.org>
parents:
400
diff
changeset
|
479 /* Really, sample->total_time = (c.numSampleFrames*1000) c.sampleRate */ |
c66080364dff
Most decoders now report total sample play time, now. Technically, this
Ryan C. Gordon <icculus@icculus.org>
parents:
400
diff
changeset
|
480 sample->total_time = (c.numSampleFrames / c.sampleRate) * 1000; |
c66080364dff
Most decoders now report total sample play time, now. Technically, this
Ryan C. Gordon <icculus@icculus.org>
parents:
400
diff
changeset
|
481 sample->total_time += (c.numSampleFrames % c.sampleRate) |
c66080364dff
Most decoders now report total sample play time, now. Technically, this
Ryan C. Gordon <icculus@icculus.org>
parents:
400
diff
changeset
|
482 * 1000 / c.sampleRate; |
c66080364dff
Most decoders now report total sample play time, now. Technically, this
Ryan C. Gordon <icculus@icculus.org>
parents:
400
diff
changeset
|
483 |
180
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
484 if (c.sampleSize <= 8) |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
485 { |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
486 sample->actual.format = AUDIO_S8; |
369
d76a34316c84
Fixed to handle stereo AIFF files.
Ryan C. Gordon <icculus@icculus.org>
parents:
332
diff
changeset
|
487 bytes_per_sample = c.numChannels; |
180
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
488 } /* if */ |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
489 else if (c.sampleSize <= 16) |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
490 { |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
491 sample->actual.format = AUDIO_S16MSB; |
369
d76a34316c84
Fixed to handle stereo AIFF files.
Ryan C. Gordon <icculus@icculus.org>
parents:
332
diff
changeset
|
492 bytes_per_sample = 2 * c.numChannels; |
180
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
493 } /* if */ |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
494 else |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
495 { |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
496 BAIL_MACRO("AIFF: Unsupported sample size.", 0); |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
497 } /* else */ |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
498 |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
499 BAIL_IF_MACRO(c.sampleRate == 0, "AIFF: Unsupported sample rate.", 0); |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
500 |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
501 a = (aiff_t *) malloc(sizeof(aiff_t)); |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
502 BAIL_IF_MACRO(a == NULL, ERR_OUT_OF_MEMORY, 0); |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
503 |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
504 if (!read_fmt(rw, &c, &(a->fmt))) |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
505 { |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
506 free(a); |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
507 return(0); |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
508 } /* if */ |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
509 |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
510 SDL_RWseek(rw, pos, SEEK_SET); /* if the seek fails, let it go... */ |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
511 |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
512 if (!find_chunk(rw, ssndID)) |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
513 { |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
514 free(a); |
387
fb519e6028e3
Changed all the Sound_SetError() calls to __Sound_SetError (or BAIL*_MACRO)
Ryan C. Gordon <icculus@icculus.org>
parents:
377
diff
changeset
|
515 BAIL_MACRO("AIFF: No sound data chunk.", 0); |
180
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
516 } /* if */ |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
517 |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
518 if (!read_ssnd_chunk(rw, &s)) |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
519 { |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
520 free(a); |
387
fb519e6028e3
Changed all the Sound_SetError() calls to __Sound_SetError (or BAIL*_MACRO)
Ryan C. Gordon <icculus@icculus.org>
parents:
377
diff
changeset
|
521 BAIL_MACRO("AIFF: Can't read sound data chunk.", 0); |
180
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
522 } /* if */ |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
523 |
221
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
184
diff
changeset
|
524 a->fmt.total_bytes = a->bytesLeft = bytes_per_sample * c.numSampleFrames; |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
184
diff
changeset
|
525 a->fmt.data_starting_offset = SDL_RWtell(rw); |
180
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
526 internal->decoder_private = (void *) a; |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
527 |
332
8ba541e81c1e
seek method implementation.
Ryan C. Gordon <icculus@icculus.org>
parents:
306
diff
changeset
|
528 sample->flags = SOUND_SAMPLEFLAG_CANSEEK; |
180
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
529 |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
530 SNDDBG(("AIFF: Accepting data stream.\n")); |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
531 return(1); /* we'll handle this data. */ |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
532 } /* AIFF_open */ |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
533 |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
534 |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
535 static void AIFF_close(Sound_Sample *sample) |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
536 { |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
537 Sound_SampleInternal *internal = (Sound_SampleInternal *) sample->opaque; |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
538 aiff_t *a = (aiff_t *) internal->decoder_private; |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
539 a->fmt.free(&(a->fmt)); |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
540 free(a); |
306
c97be6e1bd27
Added framework for Sound_Seek() support.
Ryan C. Gordon <icculus@icculus.org>
parents:
221
diff
changeset
|
541 } /* AIFF_close */ |
180
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
542 |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
543 |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
544 static Uint32 AIFF_read(Sound_Sample *sample) |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
545 { |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
546 Sound_SampleInternal *internal = (Sound_SampleInternal *) sample->opaque; |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
547 aiff_t *a = (aiff_t *) internal->decoder_private; |
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
548 return(a->fmt.read_sample(sample)); |
34
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
549 } /* AIFF_read */ |
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
550 |
221
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
184
diff
changeset
|
551 |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
184
diff
changeset
|
552 static int AIFF_rewind(Sound_Sample *sample) |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
184
diff
changeset
|
553 { |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
184
diff
changeset
|
554 Sound_SampleInternal *internal = (Sound_SampleInternal *) sample->opaque; |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
184
diff
changeset
|
555 aiff_t *a = (aiff_t *) internal->decoder_private; |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
184
diff
changeset
|
556 fmt_t *fmt = &a->fmt; |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
184
diff
changeset
|
557 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:
184
diff
changeset
|
558 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:
184
diff
changeset
|
559 a->bytesLeft = fmt->total_bytes; |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
184
diff
changeset
|
560 return(fmt->rewind_sample(sample)); |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
184
diff
changeset
|
561 } /* AIFF_rewind */ |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
184
diff
changeset
|
562 |
306
c97be6e1bd27
Added framework for Sound_Seek() support.
Ryan C. Gordon <icculus@icculus.org>
parents:
221
diff
changeset
|
563 |
c97be6e1bd27
Added framework for Sound_Seek() support.
Ryan C. Gordon <icculus@icculus.org>
parents:
221
diff
changeset
|
564 static int AIFF_seek(Sound_Sample *sample, Uint32 ms) |
c97be6e1bd27
Added framework for Sound_Seek() support.
Ryan C. Gordon <icculus@icculus.org>
parents:
221
diff
changeset
|
565 { |
332
8ba541e81c1e
seek method implementation.
Ryan C. Gordon <icculus@icculus.org>
parents:
306
diff
changeset
|
566 Sound_SampleInternal *internal = (Sound_SampleInternal *) sample->opaque; |
8ba541e81c1e
seek method implementation.
Ryan C. Gordon <icculus@icculus.org>
parents:
306
diff
changeset
|
567 aiff_t *a = (aiff_t *) internal->decoder_private; |
8ba541e81c1e
seek method implementation.
Ryan C. Gordon <icculus@icculus.org>
parents:
306
diff
changeset
|
568 return(a->fmt.seek_sample(sample, ms)); |
306
c97be6e1bd27
Added framework for Sound_Seek() support.
Ryan C. Gordon <icculus@icculus.org>
parents:
221
diff
changeset
|
569 } /* AIFF_seek */ |
c97be6e1bd27
Added framework for Sound_Seek() support.
Ryan C. Gordon <icculus@icculus.org>
parents:
221
diff
changeset
|
570 |
64
40006625142a
Changes in preparation of autoconf support.
Ryan C. Gordon <icculus@icculus.org>
parents:
62
diff
changeset
|
571 #endif /* SOUND_SUPPORTS_AIFF */ |
40006625142a
Changes in preparation of autoconf support.
Ryan C. Gordon <icculus@icculus.org>
parents:
62
diff
changeset
|
572 |
180
db3f0ee7aac0
Modified to more easily allow for different compression types.
Ryan C. Gordon <icculus@icculus.org>
parents:
149
diff
changeset
|
573 /* end of aiff.c ... */ |
34
938ef560c7bf
Initial add. Thanks, Torbj�rn!
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
574 |