#include #include #include #define IMAX 65535 #define VOLUME IMAX #define PITCH 1000 struct UData { int bsize; int freq; int step; int volume; int pitch; }; void make_wave(void *udata, Uint8 *stream, int len) { int i; struct UData *data = (struct UData *)udata; int bpp = data->freq / data->pitch; for(i = 0; i < len; i++) { int outval = (int) ( data->volume * sin(data->step * 6.28/bpp) ); if(outval > IMAX) outval = IMAX; if(outval < -IMAX) outval = -IMAX; stream[i] = outval; data->step++; data->step%=bpp; } } int main(int argc, char **argv) { if( SDL_Init(SDL_INIT_AUDIO) < 0 ) { fprintf(stderr, "Can't init SDL: %s\n", SDL_GetError()); exit(EXIT_FAILURE); } SDL_AudioSpec desired; struct UData *udata = malloc(sizeof(struct UData)); udata->volume = VOLUME; udata->pitch = PITCH; if(argc > 2 ) { udata->volume = atoi(argv[1]); udata->pitch = atoi(argv[2]); } desired.freq = 44100; desired.format = AUDIO_S16; desired.samples = 4192; desired.callback = make_wave; desired.userdata = udata; desired.channels = 1; if( SDL_OpenAudio(&desired, NULL) < 0) { fprintf(stderr, "Couldn't open audio: %s\n", SDL_GetError()); exit(EXIT_FAILURE); } udata->bsize = desired.samples; udata->freq = desired.freq; SDL_PauseAudio(0); int mod = -1; for(;;) { SDL_Delay(1); udata->pitch+=mod;; if(udata->pitch < 2) mod = 1; if(udata->pitch > 1000) mod = -1; } return EXIT_SUCCESS; }