Mercurial > sdl-ios-xcode
comparison test/testmultiaudio.c @ 2049:5f6550e5184f
Merged SDL-ryan-multiple-audio-device branch r2803:2871 into the trunk.
author | Ryan C. Gordon <icculus@icculus.org> |
---|---|
date | Tue, 17 Oct 2006 09:15:21 +0000 |
parents | |
children | 866052b01ee5 |
comparison
equal
deleted
inserted
replaced
2048:6067c7f9a672 | 2049:5f6550e5184f |
---|---|
1 #include "SDL.h" | |
2 | |
3 static SDL_AudioSpec spec; | |
4 static Uint8 *sound = NULL; /* Pointer to wave data */ | |
5 static Uint32 soundlen = 0; /* Length of wave data */ | |
6 | |
7 typedef struct | |
8 { | |
9 SDL_AudioDeviceID dev; | |
10 int soundpos; | |
11 volatile int done; | |
12 } callback_data; | |
13 | |
14 void SDLCALL play_through_once(void *arg, Uint8 * stream, int len) | |
15 { | |
16 callback_data *cbd = (callback_data *) arg; | |
17 Uint8 *waveptr = sound + cbd->soundpos; | |
18 int waveleft = soundlen - cbd->soundpos; | |
19 int cpy = len; | |
20 if (cpy > waveleft) | |
21 cpy = waveleft; | |
22 | |
23 memcpy(stream, waveptr, cpy); | |
24 len -= cpy; | |
25 cbd->soundpos += cpy; | |
26 if (len > 0) { | |
27 stream += cpy; | |
28 memset(stream, spec.silence, len); | |
29 cbd->done++; | |
30 } | |
31 } | |
32 | |
33 static void test_multi_audio(int devcount) | |
34 { | |
35 callback_data cbd[64]; | |
36 int keep_going = 1; | |
37 int i; | |
38 | |
39 if (devcount > 64) { | |
40 fprintf(stderr, "Too many devices (%d), clamping to 64...\n", devcount); | |
41 devcount = 64; | |
42 } | |
43 | |
44 spec.callback = play_through_once; | |
45 | |
46 for (i = 0; i < devcount; i++) { | |
47 const char *devname = SDL_GetAudioDeviceName(i, 0); | |
48 printf("playing on device #%d: ('%s')...", i, devname); | |
49 fflush(stdout); | |
50 | |
51 memset(&cbd[0], '\0', sizeof (callback_data)); | |
52 spec.userdata = &cbd[0]; | |
53 cbd[0].dev = SDL_OpenAudioDevice(devname, 0, &spec, NULL); | |
54 if (cbd[0].dev == 0) { | |
55 printf("Open device failed: %s\n", SDL_GetError()); | |
56 } else { | |
57 SDL_PauseAudioDevice(cbd[0].dev, 0); | |
58 while (!cbd[0].done) | |
59 SDL_Delay(100); | |
60 SDL_PauseAudioDevice(cbd[0].dev, 1); | |
61 printf("done.\n"); | |
62 SDL_CloseAudioDevice(cbd[0].dev); | |
63 } | |
64 } | |
65 | |
66 memset(cbd, '\0', sizeof (cbd)); | |
67 | |
68 printf("playing on all devices...\n"); | |
69 for (i = 0; i < devcount; i++) { | |
70 const char *devname = SDL_GetAudioDeviceName(i, 0); | |
71 spec.userdata = &cbd[i]; | |
72 cbd[i].dev = SDL_OpenAudioDevice(devname, 0, &spec, NULL); | |
73 if (cbd[i].dev == 0) { | |
74 printf("Open device %d failed: %s\n", i, SDL_GetError()); | |
75 } | |
76 } | |
77 | |
78 for (i = 0; i < devcount; i++) { | |
79 if (cbd[i].dev) { | |
80 SDL_PauseAudioDevice(cbd[i].dev, 0); | |
81 } | |
82 } | |
83 | |
84 while (keep_going) { | |
85 keep_going = 0; | |
86 for (i = 0; i < devcount; i++) { | |
87 if ((cbd[i].dev) && (!cbd[i].done)) { | |
88 keep_going = 1; | |
89 } | |
90 } | |
91 SDL_Delay(100); | |
92 } | |
93 | |
94 for (i = 0; i < devcount; i++) { | |
95 if (cbd[i].dev) { | |
96 SDL_PauseAudioDevice(cbd[i].dev, 1); | |
97 SDL_CloseAudioDevice(cbd[i].dev); | |
98 } | |
99 } | |
100 | |
101 printf("All done!\n"); | |
102 } | |
103 | |
104 | |
105 int main(int argc, char **argv) | |
106 { | |
107 int devcount = 0; | |
108 | |
109 /* Load the SDL library */ | |
110 if (SDL_Init(SDL_INIT_AUDIO) < 0) { | |
111 fprintf(stderr, "Couldn't initialize SDL: %s\n", SDL_GetError()); | |
112 return (1); | |
113 } | |
114 | |
115 printf("Using audio driver: %s\n", SDL_GetCurrentAudioDriver()); | |
116 | |
117 devcount = SDL_GetNumAudioDevices(0); | |
118 if (devcount < 1) { | |
119 fprintf(stderr, "Don't see any specific audio devices!\n"); | |
120 } else { | |
121 if (argv[1] == NULL) { | |
122 argv[1] = "sample.wav"; | |
123 } | |
124 | |
125 /* Load the wave file into memory */ | |
126 if (SDL_LoadWAV(argv[1], &spec, &sound, &soundlen) == NULL) { | |
127 fprintf(stderr, "Couldn't load %s: %s\n", argv[1], SDL_GetError()); | |
128 } else { | |
129 test_multi_audio(devcount); | |
130 SDL_FreeWAV(sound); | |
131 } | |
132 } | |
133 | |
134 SDL_Quit(); | |
135 return 0; | |
136 } |