SDL  2.0
loopwave.c
Go to the documentation of this file.
1 /*
2  Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org>
3 
4  This software is provided 'as-is', without any express or implied
5  warranty. In no event will the authors be held liable for any damages
6  arising from the use of this software.
7 
8  Permission is granted to anyone to use this software for any purpose,
9  including commercial applications, and to alter it and redistribute it
10  freely.
11 */
12 
13 /* Program to load a wave file and loop playing it using SDL audio */
14 
15 /* loopwaves.c is much more robust in handling WAVE files --
16  This is only for simple WAVEs
17 */
18 #include "SDL_config.h"
19 
20 #include <stdio.h>
21 #include <stdlib.h>
22 
23 #if HAVE_SIGNAL_H
24 #include <signal.h>
25 #endif
26 
27 #ifdef __EMSCRIPTEN__
28 #include <emscripten/emscripten.h>
29 #endif
30 
31 #include "SDL.h"
32 
33 struct
34 {
36  Uint8 *sound; /* Pointer to wave data */
37  Uint32 soundlen; /* Length of wave data */
38  int soundpos; /* Current play position */
39 } wave;
40 
41 
42 /* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */
43 static void
44 quit(int rc)
45 {
46  SDL_Quit();
47  exit(rc);
48 }
49 
50 
51 void SDLCALL
52 fillerup(void *unused, Uint8 * stream, int len)
53 {
54  Uint8 *waveptr;
55  int waveleft;
56 
57  /* Set up the pointers */
58  waveptr = wave.sound + wave.soundpos;
59  waveleft = wave.soundlen - wave.soundpos;
60 
61  /* Go! */
62  while (waveleft <= len) {
63  SDL_memcpy(stream, waveptr, waveleft);
64  stream += waveleft;
65  len -= waveleft;
66  waveptr = wave.sound;
67  waveleft = wave.soundlen;
68  wave.soundpos = 0;
69  }
70  SDL_memcpy(stream, waveptr, len);
71  wave.soundpos += len;
72 }
73 
74 static int done = 0;
75 void
76 poked(int sig)
77 {
78  done = 1;
79 }
80 
81 #ifdef __EMSCRIPTEN__
82 void
83 loop()
84 {
86  emscripten_cancel_main_loop();
87 }
88 #endif
89 
90 int
91 main(int argc, char *argv[])
92 {
93  int i;
94  char filename[4096];
95 
96  /* Enable standard application logging */
98 
99  /* Load the SDL library */
100  if (SDL_Init(SDL_INIT_AUDIO) < 0) {
101  SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't initialize SDL: %s\n", SDL_GetError());
102  return (1);
103  }
104 
105  if (argc > 1) {
106  SDL_strlcpy(filename, argv[1], sizeof(filename));
107  } else {
108  SDL_strlcpy(filename, "sample.wav", sizeof(filename));
109  }
110  /* Load the wave file into memory */
111  if (SDL_LoadWAV(filename, &wave.spec, &wave.sound, &wave.soundlen) == NULL) {
112  SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't load %s: %s\n", filename, SDL_GetError());
113  quit(1);
114  }
115 
116  wave.spec.callback = fillerup;
117 #if HAVE_SIGNAL_H
118  /* Set the signals */
119 #ifdef SIGHUP
120  signal(SIGHUP, poked);
121 #endif
122  signal(SIGINT, poked);
123 #ifdef SIGQUIT
124  signal(SIGQUIT, poked);
125 #endif
126  signal(SIGTERM, poked);
127 #endif /* HAVE_SIGNAL_H */
128 
129  /* Show the list of available drivers */
130  SDL_Log("Available audio drivers:");
131  for (i = 0; i < SDL_GetNumAudioDrivers(); ++i) {
132  SDL_Log("%i: %s", i, SDL_GetAudioDriver(i));
133  }
134 
135  /* Initialize fillerup() variables */
136  if (SDL_OpenAudio(&wave.spec, NULL) < 0) {
137  SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't open audio: %s\n", SDL_GetError());
138  SDL_FreeWAV(wave.sound);
139  quit(2);
140  }
141 
142  SDL_Log("Using audio driver: %s\n", SDL_GetCurrentAudioDriver());
143 
144  /* Let the audio run */
145  SDL_PauseAudio(0);
146 
147 #ifdef __EMSCRIPTEN__
148  emscripten_set_main_loop(loop, 0, 1);
149 #else
150  while (!done && (SDL_GetAudioStatus() == SDL_AUDIO_PLAYING))
151  SDL_Delay(1000);
152 #endif
153 
154  /* Clean up on signal */
155  SDL_CloseAudio();
156  SDL_FreeWAV(wave.sound);
157  SDL_Quit();
158  return (0);
159 }
160 
161 /* vi: set ts=4 sw=4 expandtab: */
#define SDL_GetNumAudioDrivers
#define SDL_strlcpy
void loop()
Definition: checkkeys.c:152
#define SDL_GetError
#define SDL_GetAudioStatus
void poked(int sig)
Definition: loopwave.c:76
#define SDL_OpenAudio
uint32_t Uint32
An unsigned 32-bit integer type.
Definition: SDL_stdinc.h:155
GLuint GLuint stream
Uint32 soundlen
Definition: loopwave.c:37
int main(int argc, char *argv[])
Definition: loopwave.c:91
Uint8 * sound
Definition: loopwave.c:36
#define SDL_FreeWAV
GLenum GLsizei len
#define SDL_LogError
SDL_AudioSpec spec
Definition: loopwave.c:35
#define SDL_Log
#define SDL_PauseAudio
#define SDL_memcpy
int soundpos
Definition: loopwave.c:38
void fillerup(void *unused, Uint8 *stream, int len)
Definition: loopwave.c:52
uint8_t Uint8
An unsigned 8-bit integer type.
Definition: SDL_stdinc.h:139
static void quit(int rc)
Definition: loopwave.c:44
#define SDL_Quit
#define SDL_LoadWAV(file, spec, audio_buf, audio_len)
Definition: SDL_audio.h:424
#define SDL_GetAudioDriver
static int done
Definition: loopwave.c:74
#define SDL_Delay
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
Definition: SDL_x11sym.h:42
#define SDL_LogSetPriority
#define SDL_GetCurrentAudioDriver
#define NULL
Definition: begin_code.h:143
#define SDL_INIT_AUDIO
Definition: SDL.h:76
#define SDL_CloseAudio
struct @39 wave
#define SDL_Init
#define SDLCALL
Definition: SDL_internal.h:31