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

Latest commit

 

History

History
128 lines (106 loc) · 2.9 KB

loopwave.c

File metadata and controls

128 lines (106 loc) · 2.9 KB
 
Apr 8, 2011
Apr 8, 2011
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.
*/
Apr 26, 2001
Apr 26, 2001
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
*/
Mar 3, 2006
Mar 3, 2006
18
#include "SDL_config.h"
Apr 26, 2001
Apr 26, 2001
19
20
21
#include <stdio.h>
#include <stdlib.h>
Mar 3, 2006
Mar 3, 2006
22
23
#if HAVE_SIGNAL_H
Apr 26, 2001
Apr 26, 2001
24
#include <signal.h>
Mar 3, 2006
Mar 3, 2006
25
#endif
Apr 26, 2001
Apr 26, 2001
26
27
28
29
#include "SDL.h"
#include "SDL_audio.h"
Jul 10, 2006
Jul 10, 2006
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 */
Apr 26, 2001
Apr 26, 2001
36
37
} wave;
Sep 28, 2005
Sep 28, 2005
38
39
/* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */
Jul 10, 2006
Jul 10, 2006
40
41
static void
quit(int rc)
Sep 28, 2005
Sep 28, 2005
42
{
Jul 10, 2006
Jul 10, 2006
43
44
SDL_Quit();
exit(rc);
Sep 28, 2005
Sep 28, 2005
45
46
47
}
Jul 10, 2006
Jul 10, 2006
48
49
void SDLCALL
fillerup(void *unused, Uint8 * stream, int len)
Apr 26, 2001
Apr 26, 2001
50
{
Jul 10, 2006
Jul 10, 2006
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) {
Jul 5, 2007
Jul 5, 2007
60
SDL_memcpy(stream, waveptr, waveleft);
Jul 10, 2006
Jul 10, 2006
61
62
63
64
65
66
stream += waveleft;
len -= waveleft;
waveptr = wave.sound;
waveleft = wave.soundlen;
wave.soundpos = 0;
}
Jul 5, 2007
Jul 5, 2007
67
SDL_memcpy(stream, waveptr, len);
Jul 10, 2006
Jul 10, 2006
68
wave.soundpos += len;
Apr 26, 2001
Apr 26, 2001
69
70
71
}
static int done = 0;
Jul 10, 2006
Jul 10, 2006
72
73
void
poked(int sig)
Apr 26, 2001
Apr 26, 2001
74
{
Jul 10, 2006
Jul 10, 2006
75
done = 1;
Apr 26, 2001
Apr 26, 2001
76
77
}
Jul 10, 2006
Jul 10, 2006
78
79
int
main(int argc, char *argv[])
Apr 26, 2001
Apr 26, 2001
80
{
Jul 10, 2006
Jul 10, 2006
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);
}
Oct 17, 2006
Oct 17, 2006
86
Jul 10, 2006
Jul 10, 2006
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;
Mar 3, 2006
Mar 3, 2006
97
#if HAVE_SIGNAL_H
Jul 10, 2006
Jul 10, 2006
98
/* Set the signals */
Apr 26, 2001
Apr 26, 2001
99
#ifdef SIGHUP
Jul 10, 2006
Jul 10, 2006
100
signal(SIGHUP, poked);
Apr 26, 2001
Apr 26, 2001
101
#endif
Jul 10, 2006
Jul 10, 2006
102
signal(SIGINT, poked);
Apr 26, 2001
Apr 26, 2001
103
#ifdef SIGQUIT
Jul 10, 2006
Jul 10, 2006
104
signal(SIGQUIT, poked);
Apr 26, 2001
Apr 26, 2001
105
#endif
Jul 10, 2006
Jul 10, 2006
106
signal(SIGTERM, poked);
Mar 3, 2006
Mar 3, 2006
107
#endif /* HAVE_SIGNAL_H */
Apr 26, 2001
Apr 26, 2001
108
Jul 10, 2006
Jul 10, 2006
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);
}
Oct 10, 2009
Oct 10, 2009
115
Oct 10, 2009
Oct 10, 2009
116
printf("Using audio driver: %s\n", SDL_GetCurrentAudioDriver());
Jul 10, 2006
Jul 10, 2006
117
118
/* Let the audio run */
Oct 10, 2009
Oct 10, 2009
119
SDL_PauseAudio(0);
Jul 10, 2006
Jul 10, 2006
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);
Apr 26, 2001
Apr 26, 2001
128
}