// ampler.c #include #include #include #include #include "ampler.h" #include "audio.c" #include "draw.c" Ampler_state *init() { Ampler_state *state = malloc(sizeof Ampler_state); SDL_memset(state, 0, sizeof Ampler_state); state -> size = sizeof Ampler_state; SDL_AudioSpec want = { 0 }, have = { 0 }; want.freq = SAMPLE_RATE; want.format = AUDIO_S16; want.channels = CHANNELS; want.samples = 512; want.callback = NULL; // use que funcs want.userdata = NULL; state -> playdev = SDL_OpenAudioDevice( NULL, // default device 0, // not capture &want, &have, 0 // no changes allowed ); if !(state -> playdev) do puts(SDL_GetError()); // TODO: iterate a directory to load samples load_track(state); puts("init."); return state; } int ampler_main(SDL_Window *w, SDL_Renderer *r, Ampler_state **u_data) { if *u_data == NULL do *u_data = init(); u32 old_size = (*u_data) -> size, new_size = sizeof Ampler_state; if old_size < new_size do { printf("increasing size. %i to %i\n", old_size, new_size); Ampler_state *nu = malloc(new_size); SDL_memset(nu, 0, new_size); SDL_memcpy(nu, *u_data, old_size); nu -> size = new_size; free(*u_data); *u_data = nu; } Ampler_state *state = *u_data; SDL_PauseAudioDevice(state -> playdev, 0); // unpause audio while 1 do { SDL_Event e; while SDL_PollEvent(&e) do if e.type == SDL_QUIT do return 1; audio_frame(state); draw_frame(w, r, state); SDL_Delay(1); if !remove("reload-trigger") do { SDL_PauseAudioDevice(state -> playdev, 1); // pause audio puts("removed reload-trigger, reloading..."); return 0; } } }