Mercurial > SDL_sound_CoreAudio
annotate playsound/playsound_simple.c @ 562:7e08477b0fc1
MP3 decoder upgrade work.
Ripped out SMPEG and mpglib support, replaced it with "mpg123.c" and libmpg123.
libmpg123 is a much better version of mpglib, so it should solve all the
problems about MP3's not seeking, or most modern MP3's not playing at all,
etc. Since you no longer have to make a tradeoff with SMPEG for features, and
SMPEG is basically rotting, I removed it from the project.
There is still work to be done with libmpg123...there are MMX, 3DNow, SSE,
Altivec, etc decoders which we don't have enabled at the moment, and the
build system could use some work to make this compile more cleanly, etc.
Still: huge win.
author | Ryan C. Gordon <icculus@icculus.org> |
---|---|
date | Fri, 30 Jan 2009 02:44:47 -0500 |
parents | 2e8907ff98e9 |
children |
rev | line source |
---|---|
494
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
1 /* |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
2 * SDL_sound -- An abstract sound format decoding API. |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
3 * Copyright (C) 2001 Ryan C. Gordon. |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
4 * |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
5 * This library is free software; you can redistribute it and/or |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
6 * modify it under the terms of the GNU Lesser General Public |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
7 * License as published by the Free Software Foundation; either |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
8 * version 2.1 of the License, or (at your option) any later version. |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
9 * |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
10 * This library is distributed in the hope that it will be useful, |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
13 * Lesser General Public License for more details. |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
14 * |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
15 * You should have received a copy of the GNU Lesser General Public |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
16 * License along with this library; if not, write to the Free Software |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
18 */ |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
19 |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
20 /** |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
21 * This is just a simple "decode sound, play it through SDL" example. |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
22 * The much more complex, fancy, and robust code is playsound.c. |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
23 * |
552
2e8907ff98e9
Replaced references to COPYING with references to LICENSE.txt ...
Ryan C. Gordon <icculus@icculus.org>
parents:
526
diff
changeset
|
24 * Please see the file LICENSE.txt in the source's root directory. |
494
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
25 * |
526
2df1f5c62d38
Updated my email address.
Ryan C. Gordon <icculus@icculus.org>
parents:
506
diff
changeset
|
26 * This file written by Ryan C. Gordon. (icculus@icculus.org) |
494
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
27 */ |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
28 |
504
6455549cd562
Clean up gcc4 compiler warnings.
Ryan C. Gordon <icculus@icculus.org>
parents:
494
diff
changeset
|
29 #include <stdio.h> |
6455549cd562
Clean up gcc4 compiler warnings.
Ryan C. Gordon <icculus@icculus.org>
parents:
494
diff
changeset
|
30 #include <stdlib.h> |
506
6ae286a80da5
Whoops, didn't actually fix the gcc4 warnings last time.
Ryan C. Gordon <icculus@icculus.org>
parents:
504
diff
changeset
|
31 #include <string.h> |
504
6455549cd562
Clean up gcc4 compiler warnings.
Ryan C. Gordon <icculus@icculus.org>
parents:
494
diff
changeset
|
32 |
494
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
33 #include "SDL.h" |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
34 #include "SDL_sound.h" |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
35 |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
36 /* global decoding state. */ |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
37 typedef struct |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
38 { |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
39 Sound_Sample *sample; |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
40 SDL_AudioSpec devformat; |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
41 Uint8 *decoded_ptr; |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
42 Uint32 decoded_bytes; |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
43 } PlaysoundAudioCallbackData; |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
44 |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
45 /* |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
46 * This variable is flipped to non-zero when the audio callback has |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
47 * finished playing the whole file. |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
48 */ |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
49 static volatile int global_done_flag = 0; |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
50 |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
51 |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
52 /* |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
53 * The audio callback. SDL calls this frequently to feed the audio device. |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
54 * We decode the audio file being played in here in small chunks and feed |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
55 * the device as necessary. Other solutions may want to predecode more |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
56 * (or all) of the file, since this needs to run fast and frequently, |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
57 * but since we're only sitting here and waiting for the file to play, |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
58 * the only real requirement is that we can decode a given audio file |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
59 * faster than realtime, which isn't really a problem with any modern format |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
60 * on even pretty old hardware at this point. |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
61 */ |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
62 static void audio_callback(void *userdata, Uint8 *stream, int len) |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
63 { |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
64 PlaysoundAudioCallbackData *data = (PlaysoundAudioCallbackData *) userdata; |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
65 Sound_Sample *sample = data->sample; |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
66 int bw = 0; /* bytes written to stream this time through the callback */ |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
67 |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
68 while (bw < len) |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
69 { |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
70 int cpysize; /* bytes to copy on this iteration of the loop. */ |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
71 |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
72 if (data->decoded_bytes == 0) /* need more data! */ |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
73 { |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
74 /* if there wasn't previously an error or EOF, read more. */ |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
75 if ( ((sample->flags & SOUND_SAMPLEFLAG_ERROR) == 0) && |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
76 ((sample->flags & SOUND_SAMPLEFLAG_EOF) == 0) ) |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
77 { |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
78 data->decoded_bytes = Sound_Decode(sample); |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
79 data->decoded_ptr = sample->buffer; |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
80 } /* if */ |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
81 |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
82 if (data->decoded_bytes == 0) |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
83 { |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
84 /* ...there isn't any more data to read! */ |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
85 memset(stream + bw, '\0', len - bw); /* write silence. */ |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
86 global_done_flag = 1; |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
87 return; /* we're done playback, one way or another. */ |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
88 } /* if */ |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
89 } /* if */ |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
90 |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
91 /* we have data decoded and ready to write to the device... */ |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
92 cpysize = len - bw; /* len - bw == amount device still wants. */ |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
93 if (cpysize > data->decoded_bytes) |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
94 cpysize = data->decoded_bytes; /* clamp to what we have left. */ |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
95 |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
96 /* if it's 0, next iteration will decode more or decide we're done. */ |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
97 if (cpysize > 0) |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
98 { |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
99 /* write this iteration's data to the device. */ |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
100 memcpy(stream + bw, (Uint8 *) data->decoded_ptr, cpysize); |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
101 |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
102 /* update state for next iteration or callback */ |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
103 bw += cpysize; |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
104 data->decoded_ptr += cpysize; |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
105 data->decoded_bytes -= cpysize; |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
106 } /* if */ |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
107 } /* while */ |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
108 } /* audio_callback */ |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
109 |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
110 |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
111 |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
112 static void playOneSoundFile(const char *fname) |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
113 { |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
114 PlaysoundAudioCallbackData data; |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
115 |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
116 memset(&data, '\0', sizeof (PlaysoundAudioCallbackData)); |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
117 data.sample = Sound_NewSampleFromFile(fname, NULL, 65536); |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
118 if (data.sample == NULL) |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
119 { |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
120 fprintf(stderr, "Couldn't load '%s': %s.\n", fname, Sound_GetError()); |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
121 return; |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
122 } /* if */ |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
123 |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
124 /* |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
125 * Open device in format of the the sound to be played. |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
126 * We open and close the device for each sound file, so that SDL |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
127 * handles the data conversion to hardware format; this is the |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
128 * easy way out, but isn't practical for most apps. Usually you'll |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
129 * want to pick one format for all the data or one format for the |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
130 * audio device and convert the data when needed. This is a more |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
131 * complex issue than I can describe in a source code comment, though. |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
132 */ |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
133 data.devformat.freq = data.sample->actual.rate; |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
134 data.devformat.format = data.sample->actual.format; |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
135 data.devformat.channels = data.sample->actual.channels; |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
136 data.devformat.samples = 4096; /* I just picked a largish number here. */ |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
137 data.devformat.callback = audio_callback; |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
138 data.devformat.userdata = &data; |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
139 if (SDL_OpenAudio(&data.devformat, NULL) < 0) |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
140 { |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
141 fprintf(stderr, "Couldn't open audio device: %s.\n", SDL_GetError()); |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
142 Sound_FreeSample(data.sample); |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
143 return; |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
144 } /* if */ |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
145 |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
146 printf("Now playing [%s]...\n", fname); |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
147 SDL_PauseAudio(0); /* SDL audio device is "paused" right after opening. */ |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
148 |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
149 global_done_flag = 0; /* the audio callback will flip this flag. */ |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
150 while (!global_done_flag) |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
151 SDL_Delay(10); /* just wait for the audio callback to finish. */ |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
152 |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
153 /* at this point, we've played the entire audio file. */ |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
154 SDL_PauseAudio(1); /* so stop the device. */ |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
155 |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
156 /* |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
157 * Sleep two buffers' worth of audio before closing, in order |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
158 * to allow the playback to finish. This isn't always enough; |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
159 * perhaps SDL needs a way to explicitly wait for device drain? |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
160 * Most apps don't have this issue, since they aren't explicitly |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
161 * closing the device as soon as a sound file is done playback. |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
162 * As an alternative for this app, you could also change the callback |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
163 * to write silence for a call or two before flipping global_done_flag. |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
164 */ |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
165 SDL_Delay(2 * 1000 * data.devformat.samples / data.devformat.freq); |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
166 |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
167 /* if there was an error, tell the user. */ |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
168 if (data.sample->flags & SOUND_SAMPLEFLAG_ERROR) |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
169 fprintf(stderr, "Error decoding file: %s\n", Sound_GetError()); |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
170 |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
171 Sound_FreeSample(data.sample); /* clean up SDL_Sound resources... */ |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
172 SDL_CloseAudio(); /* will reopen with next file's format. */ |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
173 } /* playOneSoundFile */ |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
174 |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
175 |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
176 int main(int argc, char **argv) |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
177 { |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
178 int i; |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
179 |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
180 if (!Sound_Init()) /* this calls SDL_Init(SDL_INIT_AUDIO) ... */ |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
181 { |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
182 fprintf(stderr, "Sound_Init() failed: %s.\n", Sound_GetError()); |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
183 SDL_Quit(); |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
184 return(42); |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
185 } /* if */ |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
186 |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
187 for (i = 1; i < argc; i++) /* each arg is an audio file to play. */ |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
188 playOneSoundFile(argv[i]); |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
189 |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
190 /* Shutdown the libraries... */ |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
191 Sound_Quit(); |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
192 SDL_Quit(); |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
193 return(0); |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
194 } /* main */ |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
195 |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
196 /* end of playsound-simple.c ... */ |
355129c687b7
Added playsound_simple.c, as a basic example.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff
changeset
|
197 |