comparison test/loopwave.c @ 1895:c121d94672cb

SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
author Sam Lantinga <slouken@libsdl.org>
date Mon, 10 Jul 2006 21:04:37 +0000
parents 290b5baf2fca
children 5f6550e5184f
comparison
equal deleted inserted replaced
1894:c69cee13dd76 1895:c121d94672cb
14 #endif 14 #endif
15 15
16 #include "SDL.h" 16 #include "SDL.h"
17 #include "SDL_audio.h" 17 #include "SDL_audio.h"
18 18
19 struct { 19 struct
20 SDL_AudioSpec spec; 20 {
21 Uint8 *sound; /* Pointer to wave data */ 21 SDL_AudioSpec spec;
22 Uint32 soundlen; /* Length of wave data */ 22 Uint8 *sound; /* Pointer to wave data */
23 int soundpos; /* Current play position */ 23 Uint32 soundlen; /* Length of wave data */
24 int soundpos; /* Current play position */
24 } wave; 25 } wave;
25 26
26 27
27 /* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */ 28 /* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */
28 static void quit(int rc) 29 static void
30 quit(int rc)
29 { 31 {
30 SDL_Quit(); 32 SDL_Quit();
31 exit(rc); 33 exit(rc);
32 } 34 }
33 35
34 36
35 void SDLCALL fillerup(void *unused, Uint8 *stream, int len) 37 void SDLCALL
38 fillerup(void *unused, Uint8 * stream, int len)
36 { 39 {
37 Uint8 *waveptr; 40 Uint8 *waveptr;
38 int waveleft; 41 int waveleft;
39 42
40 /* Set up the pointers */ 43 /* Set up the pointers */
41 waveptr = wave.sound + wave.soundpos; 44 waveptr = wave.sound + wave.soundpos;
42 waveleft = wave.soundlen - wave.soundpos; 45 waveleft = wave.soundlen - wave.soundpos;
43 46
44 /* Go! */ 47 /* Go! */
45 while ( waveleft <= len ) { 48 while (waveleft <= len) {
46 SDL_MixAudio(stream, waveptr, waveleft, SDL_MIX_MAXVOLUME); 49 SDL_MixAudio(stream, waveptr, waveleft, SDL_MIX_MAXVOLUME);
47 stream += waveleft; 50 stream += waveleft;
48 len -= waveleft; 51 len -= waveleft;
49 waveptr = wave.sound; 52 waveptr = wave.sound;
50 waveleft = wave.soundlen; 53 waveleft = wave.soundlen;
51 wave.soundpos = 0; 54 wave.soundpos = 0;
52 } 55 }
53 SDL_MixAudio(stream, waveptr, len, SDL_MIX_MAXVOLUME); 56 SDL_MixAudio(stream, waveptr, len, SDL_MIX_MAXVOLUME);
54 wave.soundpos += len; 57 wave.soundpos += len;
55 } 58 }
56 59
57 static int done = 0; 60 static int done = 0;
58 void poked(int sig) 61 void
62 poked(int sig)
59 { 63 {
60 done = 1; 64 done = 1;
61 } 65 }
62 66
63 int main(int argc, char *argv[]) 67 int
68 main(int argc, char *argv[])
64 { 69 {
65 char name[32]; 70 int i, n;
66 71
67 /* Load the SDL library */ 72 /* Print available audio drivers */
68 if ( SDL_Init(SDL_INIT_AUDIO) < 0 ) { 73 n = SDL_GetNumAudioDrivers();
69 fprintf(stderr, "Couldn't initialize SDL: %s\n",SDL_GetError()); 74 if (n == 0) {
70 return(1); 75 printf("No built-in audio drivers\n");
71 } 76 } else {
72 if ( argv[1] == NULL ) { 77 printf("Built-in audio drivers:");
73 argv[1] = "sample.wav"; 78 for (i = 0; i < n; ++i) {
74 } 79 if (i > 0) {
75 /* Load the wave file into memory */ 80 printf(",");
76 if ( SDL_LoadWAV(argv[1], 81 }
77 &wave.spec, &wave.sound, &wave.soundlen) == NULL ) { 82 printf(" %s", SDL_GetAudioDriver(i));
78 fprintf(stderr, "Couldn't load %s: %s\n", 83 }
79 argv[1], SDL_GetError()); 84 printf("\n");
80 quit(1); 85 }
81 }
82 86
83 wave.spec.callback = fillerup; 87 /* Load the SDL library */
88 if (SDL_Init(SDL_INIT_AUDIO) < 0) {
89 fprintf(stderr, "Couldn't initialize SDL: %s\n", SDL_GetError());
90 return (1);
91 }
92 if (argv[1] == NULL) {
93 argv[1] = "sample.wav";
94 }
95 /* Load the wave file into memory */
96 if (SDL_LoadWAV(argv[1], &wave.spec, &wave.sound, &wave.soundlen) == NULL) {
97 fprintf(stderr, "Couldn't load %s: %s\n", argv[1], SDL_GetError());
98 quit(1);
99 }
100
101 wave.spec.callback = fillerup;
84 #if HAVE_SIGNAL_H 102 #if HAVE_SIGNAL_H
85 /* Set the signals */ 103 /* Set the signals */
86 #ifdef SIGHUP 104 #ifdef SIGHUP
87 signal(SIGHUP, poked); 105 signal(SIGHUP, poked);
88 #endif 106 #endif
89 signal(SIGINT, poked); 107 signal(SIGINT, poked);
90 #ifdef SIGQUIT 108 #ifdef SIGQUIT
91 signal(SIGQUIT, poked); 109 signal(SIGQUIT, poked);
92 #endif 110 #endif
93 signal(SIGTERM, poked); 111 signal(SIGTERM, poked);
94 #endif /* HAVE_SIGNAL_H */ 112 #endif /* HAVE_SIGNAL_H */
95 113
96 /* Initialize fillerup() variables */ 114 /* Initialize fillerup() variables */
97 if ( SDL_OpenAudio(&wave.spec, NULL) < 0 ) { 115 if (SDL_OpenAudio(&wave.spec, NULL) < 0) {
98 fprintf(stderr, "Couldn't open audio: %s\n", SDL_GetError()); 116 fprintf(stderr, "Couldn't open audio: %s\n", SDL_GetError());
99 SDL_FreeWAV(wave.sound); 117 SDL_FreeWAV(wave.sound);
100 quit(2); 118 quit(2);
101 } 119 }
102 SDL_PauseAudio(0); 120 SDL_PauseAudio(0);
103 121
104 /* Let the audio run */ 122 /* Let the audio run */
105 printf("Using audio driver: %s\n", SDL_AudioDriverName(name, 32)); 123 printf("Using audio driver: %s\n", SDL_GetCurrentAudioDriver());
106 while ( ! done && (SDL_GetAudioStatus() == SDL_AUDIO_PLAYING) ) 124 while (!done && (SDL_GetAudioStatus() == SDL_AUDIO_PLAYING))
107 SDL_Delay(1000); 125 SDL_Delay(1000);
108 126
109 /* Clean up on signal */ 127 /* Clean up on signal */
110 SDL_CloseAudio(); 128 SDL_CloseAudio();
111 SDL_FreeWAV(wave.sound); 129 SDL_FreeWAV(wave.sound);
112 SDL_Quit(); 130 SDL_Quit();
113 return(0); 131 return (0);
114 } 132 }