All pastes #830441 Raw Edit

Anonymous

public text v1 · immutable
#830441 ·published 2007-12-23 23:33 UTC
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;
}