This repository has been archived by the owner on Feb 11, 2021. It is now read-only.
/
loopwave.c
128 lines (106 loc) · 2.9 KB
1
2
3
4
5
6
7
8
9
10
11
/*
Copyright (C) 1997-2011 Sam Lantinga <slouken@libsdl.org>
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely.
*/
12
13
14
15
16
17
/* 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
*/
18
#include "SDL_config.h"
19
20
21
#include <stdio.h>
#include <stdlib.h>
22
23
#if HAVE_SIGNAL_H
24
#include <signal.h>
25
#endif
26
27
28
29
#include "SDL.h"
#include "SDL_audio.h"
30
31
32
33
34
35
struct
{
SDL_AudioSpec spec;
Uint8 *sound; /* Pointer to wave data */
Uint32 soundlen; /* Length of wave data */
int soundpos; /* Current play position */
36
37
} wave;
38
39
/* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */
40
41
static void
quit(int rc)
42
{
43
44
SDL_Quit();
exit(rc);
45
46
47
}
48
49
void SDLCALL
fillerup(void *unused, Uint8 * stream, int len)
50
{
51
52
53
54
55
56
57
58
59
Uint8 *waveptr;
int waveleft;
/* Set up the pointers */
waveptr = wave.sound + wave.soundpos;
waveleft = wave.soundlen - wave.soundpos;
/* Go! */
while (waveleft <= len) {
60
SDL_memcpy(stream, waveptr, waveleft);
61
62
63
64
65
66
stream += waveleft;
len -= waveleft;
waveptr = wave.sound;
waveleft = wave.soundlen;
wave.soundpos = 0;
}
67
SDL_memcpy(stream, waveptr, len);
68
wave.soundpos += len;
69
70
71
}
static int done = 0;
72
73
void
poked(int sig)
74
{
75
done = 1;
76
77
}
78
79
int
main(int argc, char *argv[])
80
{
81
82
83
84
85
/* Load the SDL library */
if (SDL_Init(SDL_INIT_AUDIO) < 0) {
fprintf(stderr, "Couldn't initialize SDL: %s\n", SDL_GetError());
return (1);
}
86
87
88
89
90
91
92
93
94
95
96
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;
97
#if HAVE_SIGNAL_H
98
/* Set the signals */
99
#ifdef SIGHUP
100
signal(SIGHUP, poked);
101
#endif
102
signal(SIGINT, poked);
103
#ifdef SIGQUIT
104
signal(SIGQUIT, poked);
105
#endif
106
signal(SIGTERM, poked);
107
#endif /* HAVE_SIGNAL_H */
108
109
110
111
112
113
114
/* 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);
}
115
116
printf("Using audio driver: %s\n", SDL_GetCurrentAudioDriver());
117
118
/* Let the audio run */
119
SDL_PauseAudio(0);
120
121
122
123
124
125
126
127
while (!done && (SDL_GetAudioStatus() == SDL_AUDIO_PLAYING))
SDL_Delay(1000);
/* Clean up on signal */
SDL_CloseAudio();
SDL_FreeWAV(wave.sound);
SDL_Quit();
return (0);
128
}