rendered paste body#include <stdio.h>
#include <math.h>
#include <SDL/SDL.h>
#define IMAX 65535
#define VOLUME IMAX
#define PITCH 1000
struct UData {
int bsize;
int freq;
int step;
int volume;
float 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 = abs((int) ( data->volume * sin(data->step * 6.28/bpp) ));
if(outval > IMAX) outval = IMAX;
if(outval < 0) outval = 0;
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 = 22050;
desired.format = AUDIO_S16SYS;
desired.samples = 1024;
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);
float mod = -1;
for(;;) {
udata->pitch+=mod;
if(udata->pitch < 2) mod=1;
if(udata->pitch > 1000) mod = -1;
SDL_Delay(1);
}
return EXIT_SUCCESS;
}