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

Latest commit

 

History

History
141 lines (119 loc) · 3.51 KB

testmultiaudio.c

File metadata and controls

141 lines (119 loc) · 3.51 KB
 
1
2
3
#include "SDL.h"
static SDL_AudioSpec spec;
Oct 28, 2006
Oct 28, 2006
4
5
static Uint8 *sound = NULL; /* Pointer to wave data */
static Uint32 soundlen = 0; /* Length of wave data */
6
7
8
9
10
11
12
13
typedef struct
{
SDL_AudioDeviceID dev;
int soundpos;
volatile int done;
} callback_data;
Oct 28, 2006
Oct 28, 2006
14
15
void SDLCALL
play_through_once(void *arg, Uint8 * stream, int len)
16
17
18
19
20
21
22
23
{
callback_data *cbd = (callback_data *) arg;
Uint8 *waveptr = sound + cbd->soundpos;
int waveleft = soundlen - cbd->soundpos;
int cpy = len;
if (cpy > waveleft)
cpy = waveleft;
Jul 5, 2007
Jul 5, 2007
24
SDL_memcpy(stream, waveptr, cpy);
25
26
27
28
len -= cpy;
cbd->soundpos += cpy;
if (len > 0) {
stream += cpy;
Jul 5, 2007
Jul 5, 2007
29
SDL_memset(stream, spec.silence, len);
30
31
32
33
cbd->done++;
}
}
Oct 28, 2006
Oct 28, 2006
34
35
static void
test_multi_audio(int devcount)
36
37
38
39
40
41
{
callback_data cbd[64];
int keep_going = 1;
int i;
if (devcount > 64) {
Oct 28, 2006
Oct 28, 2006
42
43
fprintf(stderr, "Too many devices (%d), clamping to 64...\n",
devcount);
44
45
46
47
48
49
50
51
52
53
devcount = 64;
}
spec.callback = play_through_once;
for (i = 0; i < devcount; i++) {
const char *devname = SDL_GetAudioDeviceName(i, 0);
printf("playing on device #%d: ('%s')...", i, devname);
fflush(stdout);
Jul 5, 2007
Jul 5, 2007
54
SDL_memset(&cbd[0], '\0', sizeof(callback_data));
55
spec.userdata = &cbd[0];
Dec 13, 2008
Dec 13, 2008
56
cbd[0].dev = SDL_OpenAudioDevice(devname, 0, &spec, NULL, 0);
57
if (cbd[0].dev == 0) {
Mar 24, 2009
Mar 24, 2009
58
printf("\nOpen device failed: %s\n", SDL_GetError());
59
60
61
62
63
64
65
66
67
68
} else {
SDL_PauseAudioDevice(cbd[0].dev, 0);
while (!cbd[0].done)
SDL_Delay(100);
SDL_PauseAudioDevice(cbd[0].dev, 1);
printf("done.\n");
SDL_CloseAudioDevice(cbd[0].dev);
}
}
Jul 5, 2007
Jul 5, 2007
69
SDL_memset(cbd, '\0', sizeof(cbd));
70
71
72
73
74
printf("playing on all devices...\n");
for (i = 0; i < devcount; i++) {
const char *devname = SDL_GetAudioDeviceName(i, 0);
spec.userdata = &cbd[i];
Dec 13, 2008
Dec 13, 2008
75
cbd[i].dev = SDL_OpenAudioDevice(devname, 0, &spec, NULL, 0);
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
if (cbd[i].dev == 0) {
printf("Open device %d failed: %s\n", i, SDL_GetError());
}
}
for (i = 0; i < devcount; i++) {
if (cbd[i].dev) {
SDL_PauseAudioDevice(cbd[i].dev, 0);
}
}
while (keep_going) {
keep_going = 0;
for (i = 0; i < devcount; i++) {
if ((cbd[i].dev) && (!cbd[i].done)) {
keep_going = 1;
}
}
SDL_Delay(100);
}
for (i = 0; i < devcount; i++) {
if (cbd[i].dev) {
SDL_PauseAudioDevice(cbd[i].dev, 1);
SDL_CloseAudioDevice(cbd[i].dev);
}
}
printf("All done!\n");
}
Oct 28, 2006
Oct 28, 2006
108
109
int
main(int argc, char **argv)
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
{
int devcount = 0;
/* Load the SDL library */
if (SDL_Init(SDL_INIT_AUDIO) < 0) {
fprintf(stderr, "Couldn't initialize SDL: %s\n", SDL_GetError());
return (1);
}
printf("Using audio driver: %s\n", SDL_GetCurrentAudioDriver());
devcount = SDL_GetNumAudioDevices(0);
if (devcount < 1) {
fprintf(stderr, "Don't see any specific audio devices!\n");
} else {
if (argv[1] == NULL) {
argv[1] = "sample.wav";
}
/* Load the wave file into memory */
if (SDL_LoadWAV(argv[1], &spec, &sound, &soundlen) == NULL) {
Oct 28, 2006
Oct 28, 2006
131
132
fprintf(stderr, "Couldn't load %s: %s\n", argv[1],
SDL_GetError());
133
134
135
136
137
138
139
140
141
} else {
test_multi_audio(devcount);
SDL_FreeWAV(sound);
}
}
SDL_Quit();
return 0;
}