ampler/ampler.c

81 lines
1.7 KiB
C
Raw Normal View History

2021-12-18 17:36:08 +00:00
// ampler.c
#include <stdio.h>
#include <stdlib.h>
2021-12-18 20:58:21 +00:00
#include <stdint.h>
2021-12-18 17:36:08 +00:00
#include <SDL2/SDL.h>
2021-12-19 22:44:48 +00:00
#include "ampler.h"
2021-12-18 20:58:21 +00:00
2021-12-19 22:44:48 +00:00
#include "audio.c"
#include "draw.c"
2021-12-18 20:58:21 +00:00
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
);
2021-12-19 22:44:48 +00:00
if !(state -> playdev) do
2021-12-18 20:58:21 +00:00
puts(SDL_GetError());
// TODO: iterate a directory to load samples
load_track(state);
2021-12-18 20:58:21 +00:00
puts("init.");
return state;
}
int ampler_main(SDL_Window *w, SDL_Renderer *r, Ampler_state **u_data) {
2021-12-19 22:44:48 +00:00
if *u_data == NULL do *u_data = init();
2021-12-18 20:58:21 +00:00
2021-12-19 22:44:48 +00:00
u32 old_size = (*u_data) -> size, new_size = sizeof Ampler_state;
if old_size < new_size do {
2021-12-18 20:58:21 +00:00
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
2021-12-19 22:44:48 +00:00
while 1 do {
2021-12-18 20:58:21 +00:00
SDL_Event e;
2021-12-19 22:44:48 +00:00
while SDL_PollEvent(&e) do
if e.type == SDL_QUIT do
2021-12-18 17:36:08 +00:00
return 1;
2021-12-18 20:58:21 +00:00
2021-12-20 02:06:02 +00:00
state -> played_audio_last_frame = audio_frame(state);
2021-12-19 22:44:48 +00:00
draw_frame(w, r, state);
2021-12-18 20:58:21 +00:00
2021-12-18 17:36:08 +00:00
SDL_Delay(1);
2021-12-19 22:44:48 +00:00
if !remove("reload-trigger") do {
2021-12-18 20:58:21 +00:00
SDL_PauseAudioDevice(state -> playdev, 1); // pause audio
2021-12-18 17:36:08 +00:00
puts("removed reload-trigger, reloading...");
return 0;
}
}
}