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