Skip to content

Latest commit

 

History

History
179 lines (145 loc) · 4.21 KB

loopwave.c

File metadata and controls

179 lines (145 loc) · 4.21 KB
 
Jan 17, 2020
Jan 17, 2020
2
Copyright (C) 1997-2020 Sam Lantinga <slouken@libsdl.org>
3
4
5
6
7
8
9
10
11
12
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.
*/
Dec 6, 2015
Dec 6, 2015
13
/* Program to load a wave file and loop playing it using SDL audio */
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/* loopwaves.c is much more robust in handling WAVE files --
This is only for simple WAVEs
*/
#include "SDL_config.h"
#include <stdio.h>
#include <stdlib.h>
#ifdef __EMSCRIPTEN__
#include <emscripten/emscripten.h>
#endif
#include "SDL.h"
Feb 19, 2017
Feb 19, 2017
29
static struct
30
31
32
33
34
35
36
{
SDL_AudioSpec spec;
Uint8 *sound; /* Pointer to wave data */
Uint32 soundlen; /* Length of wave data */
int soundpos; /* Current play position */
} wave;
Mar 9, 2017
Mar 9, 2017
37
static SDL_AudioDeviceID device;
38
39
40
41
42
43
44
45
46
/* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */
static void
quit(int rc)
{
SDL_Quit();
exit(rc);
}
Mar 9, 2017
Mar 9, 2017
47
48
49
static void
close_audio()
{
Mar 9, 2017
Mar 9, 2017
50
51
52
53
if (device != 0) {
SDL_CloseAudioDevice(device);
device = 0;
}
Mar 9, 2017
Mar 9, 2017
54
55
56
57
58
}
static void
open_audio()
{
Mar 9, 2017
Mar 9, 2017
59
60
61
62
63
64
65
/* Initialize fillerup() variables */
device = SDL_OpenAudioDevice(NULL, SDL_FALSE, &wave.spec, NULL, 0);
if (!device) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't open audio: %s\n", SDL_GetError());
SDL_FreeWAV(wave.sound);
quit(2);
}
Mar 9, 2017
Mar 9, 2017
66
67
Mar 9, 2017
Mar 9, 2017
68
69
/* Let the audio run */
SDL_PauseAudioDevice(device, SDL_FALSE);
Mar 9, 2017
Mar 9, 2017
70
71
72
73
}
static void reopen_audio()
{
Mar 9, 2017
Mar 9, 2017
74
75
close_audio();
open_audio();
Mar 9, 2017
Mar 9, 2017
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
102
103
104
105
106
107
void SDLCALL
fillerup(void *unused, Uint8 * stream, int len)
{
Uint8 *waveptr;
int waveleft;
/* Set up the pointers */
waveptr = wave.sound + wave.soundpos;
waveleft = wave.soundlen - wave.soundpos;
/* Go! */
while (waveleft <= len) {
SDL_memcpy(stream, waveptr, waveleft);
stream += waveleft;
len -= waveleft;
waveptr = wave.sound;
waveleft = wave.soundlen;
wave.soundpos = 0;
}
SDL_memcpy(stream, waveptr, len);
wave.soundpos += len;
}
static int done = 0;
#ifdef __EMSCRIPTEN__
void
loop()
{
Mar 9, 2017
Mar 9, 2017
108
if(done || (SDL_GetAudioDeviceStatus(device) != SDL_AUDIO_PLAYING))
109
110
111
112
113
114
115
116
117
118
emscripten_cancel_main_loop();
}
#endif
int
main(int argc, char *argv[])
{
int i;
char filename[4096];
Nov 25, 2015
Nov 25, 2015
119
120
/* Enable standard application logging */
SDL_LogSetPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO);
121
122
/* Load the SDL library */
Mar 9, 2017
Mar 9, 2017
123
if (SDL_Init(SDL_INIT_AUDIO|SDL_INIT_EVENTS) < 0) {
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't initialize SDL: %s\n", SDL_GetError());
return (1);
}
if (argc > 1) {
SDL_strlcpy(filename, argv[1], sizeof(filename));
} else {
SDL_strlcpy(filename, "sample.wav", sizeof(filename));
}
/* Load the wave file into memory */
if (SDL_LoadWAV(filename, &wave.spec, &wave.sound, &wave.soundlen) == NULL) {
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't load %s: %s\n", filename, SDL_GetError());
quit(1);
}
wave.spec.callback = fillerup;
/* Show the list of available drivers */
SDL_Log("Available audio drivers:");
for (i = 0; i < SDL_GetNumAudioDrivers(); ++i) {
Nov 25, 2015
Nov 25, 2015
144
SDL_Log("%i: %s", i, SDL_GetAudioDriver(i));
Mar 9, 2017
Mar 9, 2017
145
}
Mar 9, 2017
Mar 9, 2017
147
SDL_Log("Using audio driver: %s\n", SDL_GetCurrentAudioDriver());
Mar 9, 2017
Mar 9, 2017
149
open_audio();
Mar 9, 2017
Mar 9, 2017
151
SDL_FlushEvents(SDL_AUDIODEVICEADDED, SDL_AUDIODEVICEREMOVED);
152
153
154
155
#ifdef __EMSCRIPTEN__
emscripten_set_main_loop(loop, 0, 1);
#else
Mar 9, 2017
Mar 9, 2017
156
157
158
159
160
161
162
163
164
165
166
167
168
169
while (!done) {
SDL_Event event;
while (SDL_PollEvent(&event) > 0) {
if (event.type == SDL_QUIT) {
done = 1;
}
if ((event.type == SDL_AUDIODEVICEADDED && !event.adevice.iscapture) ||
(event.type == SDL_AUDIODEVICEREMOVED && !event.adevice.iscapture && event.adevice.which == device)) {
reopen_audio();
}
}
SDL_Delay(100);
}
170
171
172
#endif
/* Clean up on signal */
Mar 9, 2017
Mar 9, 2017
173
close_audio();
174
175
176
177
178
179
SDL_FreeWAV(wave.sound);
SDL_Quit();
return (0);
}
/* vi: set ts=4 sw=4 expandtab: */