Skip to content
This repository has been archived by the owner on Feb 11, 2021. It is now read-only.

Latest commit

 

History

History
132 lines (112 loc) · 2.93 KB

loopwave.c

File metadata and controls

132 lines (112 loc) · 2.93 KB
 
Apr 26, 2001
Apr 26, 2001
1
2
3
4
5
6
/* Program to load a wave file and loop playing it using SDL sound */
/* loopwaves.c is much more robust in handling WAVE files --
This is only for simple WAVEs
*/
Mar 3, 2006
Mar 3, 2006
7
#include "SDL_config.h"
Apr 26, 2001
Apr 26, 2001
8
9
10
#include <stdio.h>
#include <stdlib.h>
Mar 3, 2006
Mar 3, 2006
11
12
#if HAVE_SIGNAL_H
Apr 26, 2001
Apr 26, 2001
13
#include <signal.h>
Mar 3, 2006
Mar 3, 2006
14
#endif
Apr 26, 2001
Apr 26, 2001
15
16
17
18
#include "SDL.h"
#include "SDL_audio.h"
Jul 10, 2006
Jul 10, 2006
19
20
21
22
23
24
struct
{
SDL_AudioSpec spec;
Uint8 *sound; /* Pointer to wave data */
Uint32 soundlen; /* Length of wave data */
int soundpos; /* Current play position */
Apr 26, 2001
Apr 26, 2001
25
26
} wave;
Sep 28, 2005
Sep 28, 2005
27
28
/* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */
Jul 10, 2006
Jul 10, 2006
29
30
static void
quit(int rc)
Sep 28, 2005
Sep 28, 2005
31
{
Jul 10, 2006
Jul 10, 2006
32
33
SDL_Quit();
exit(rc);
Sep 28, 2005
Sep 28, 2005
34
35
36
}
Jul 10, 2006
Jul 10, 2006
37
38
void SDLCALL
fillerup(void *unused, Uint8 * stream, int len)
Apr 26, 2001
Apr 26, 2001
39
{
Jul 10, 2006
Jul 10, 2006
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
Uint8 *waveptr;
int waveleft;
/* Set up the pointers */
waveptr = wave.sound + wave.soundpos;
waveleft = wave.soundlen - wave.soundpos;
/* Go! */
while (waveleft <= len) {
SDL_MixAudio(stream, waveptr, waveleft, SDL_MIX_MAXVOLUME);
stream += waveleft;
len -= waveleft;
waveptr = wave.sound;
waveleft = wave.soundlen;
wave.soundpos = 0;
}
SDL_MixAudio(stream, waveptr, len, SDL_MIX_MAXVOLUME);
wave.soundpos += len;
Apr 26, 2001
Apr 26, 2001
58
59
60
}
static int done = 0;
Jul 10, 2006
Jul 10, 2006
61
62
void
poked(int sig)
Apr 26, 2001
Apr 26, 2001
63
{
Jul 10, 2006
Jul 10, 2006
64
done = 1;
Apr 26, 2001
Apr 26, 2001
65
66
}
Jul 10, 2006
Jul 10, 2006
67
68
int
main(int argc, char *argv[])
Apr 26, 2001
Apr 26, 2001
69
{
Jul 10, 2006
Jul 10, 2006
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
int i, n;
/* Print available audio drivers */
n = SDL_GetNumAudioDrivers();
if (n == 0) {
printf("No built-in audio drivers\n");
} else {
printf("Built-in audio drivers:");
for (i = 0; i < n; ++i) {
if (i > 0) {
printf(",");
}
printf(" %s", SDL_GetAudioDriver(i));
}
printf("\n");
}
/* Load the SDL library */
if (SDL_Init(SDL_INIT_AUDIO) < 0) {
fprintf(stderr, "Couldn't initialize SDL: %s\n", SDL_GetError());
return (1);
}
if (argv[1] == NULL) {
argv[1] = "sample.wav";
}
/* Load the wave file into memory */
if (SDL_LoadWAV(argv[1], &wave.spec, &wave.sound, &wave.soundlen) == NULL) {
fprintf(stderr, "Couldn't load %s: %s\n", argv[1], SDL_GetError());
quit(1);
}
wave.spec.callback = fillerup;
Mar 3, 2006
Mar 3, 2006
102
#if HAVE_SIGNAL_H
Jul 10, 2006
Jul 10, 2006
103
/* Set the signals */
Apr 26, 2001
Apr 26, 2001
104
#ifdef SIGHUP
Jul 10, 2006
Jul 10, 2006
105
signal(SIGHUP, poked);
Apr 26, 2001
Apr 26, 2001
106
#endif
Jul 10, 2006
Jul 10, 2006
107
signal(SIGINT, poked);
Apr 26, 2001
Apr 26, 2001
108
#ifdef SIGQUIT
Jul 10, 2006
Jul 10, 2006
109
signal(SIGQUIT, poked);
Apr 26, 2001
Apr 26, 2001
110
#endif
Jul 10, 2006
Jul 10, 2006
111
signal(SIGTERM, poked);
Mar 3, 2006
Mar 3, 2006
112
#endif /* HAVE_SIGNAL_H */
Apr 26, 2001
Apr 26, 2001
113
Jul 10, 2006
Jul 10, 2006
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/* Initialize fillerup() variables */
if (SDL_OpenAudio(&wave.spec, NULL) < 0) {
fprintf(stderr, "Couldn't open audio: %s\n", SDL_GetError());
SDL_FreeWAV(wave.sound);
quit(2);
}
SDL_PauseAudio(0);
/* Let the audio run */
printf("Using audio driver: %s\n", SDL_GetCurrentAudioDriver());
while (!done && (SDL_GetAudioStatus() == SDL_AUDIO_PLAYING))
SDL_Delay(1000);
/* Clean up on signal */
SDL_CloseAudio();
SDL_FreeWAV(wave.sound);
SDL_Quit();
return (0);
Apr 26, 2001
Apr 26, 2001
132
}