audio finally loads and plays
parent
cffa8ca132
commit
412d2588cb
|
@ -2,3 +2,4 @@
|
||||||
*.exe
|
*.exe
|
||||||
*.dll
|
*.dll
|
||||||
reload-trigger
|
reload-trigger
|
||||||
|
*.wav
|
||||||
|
|
55
ampler.c
55
ampler.c
|
@ -6,39 +6,10 @@
|
||||||
|
|
||||||
#include <SDL2/SDL.h>
|
#include <SDL2/SDL.h>
|
||||||
|
|
||||||
#define SAMPLE_RATE (44100)
|
#include "ampler.h"
|
||||||
#define CHANNELS (2)
|
|
||||||
#define FRAME_SAMPLES (SAMPLE_RATE / 60)
|
|
||||||
|
|
||||||
typedef uint8_t s8;
|
#include "audio.c"
|
||||||
typedef uint16_t s16;
|
#include "draw.c"
|
||||||
|
|
||||||
typedef struct Ampler_state Ampler_state;
|
|
||||||
struct Ampler_state {
|
|
||||||
int size;
|
|
||||||
SDL_AudioDeviceID playdev;
|
|
||||||
s8 track_l[SAMPLE_RATE * 120]; // 2 minutes
|
|
||||||
s8 track_r[SAMPLE_RATE * 120]; // 2 minutes
|
|
||||||
};
|
|
||||||
|
|
||||||
int audio_frame(Ampler_state *state) {
|
|
||||||
int queued = SDL_GetQueuedAudioSize(state -> playdev);
|
|
||||||
queued /= sizeof s16; // queued is in bytes
|
|
||||||
|
|
||||||
if(queued > FRAME_SAMPLES * CHANNELS * 2) return 0;
|
|
||||||
// else puts("queued audio.");
|
|
||||||
|
|
||||||
s16 silence[FRAME_SAMPLES * CHANNELS] = { 0 };
|
|
||||||
for (int i = 0; i < FRAME_SAMPLES; i += CHANNELS) {
|
|
||||||
int vol = 10;
|
|
||||||
silence[i] = (i/2) * vol - FRAME_SAMPLES / 2;
|
|
||||||
silence[i + 1] = (i/2) * vol - FRAME_SAMPLES / 2;
|
|
||||||
}
|
|
||||||
if(SDL_QueueAudio(state -> playdev, silence, sizeof silence))
|
|
||||||
puts(SDL_GetError());
|
|
||||||
|
|
||||||
return 1; // audio was qued
|
|
||||||
}
|
|
||||||
|
|
||||||
Ampler_state *init() {
|
Ampler_state *init() {
|
||||||
Ampler_state *state = malloc(sizeof Ampler_state);
|
Ampler_state *state = malloc(sizeof Ampler_state);
|
||||||
|
@ -61,7 +32,7 @@ Ampler_state *init() {
|
||||||
&have,
|
&have,
|
||||||
0 // no changes allowed
|
0 // no changes allowed
|
||||||
);
|
);
|
||||||
if(!(state -> playdev))
|
if !(state -> playdev) do
|
||||||
puts(SDL_GetError());
|
puts(SDL_GetError());
|
||||||
|
|
||||||
puts("init.");
|
puts("init.");
|
||||||
|
@ -69,10 +40,10 @@ Ampler_state *init() {
|
||||||
}
|
}
|
||||||
|
|
||||||
int ampler_main(SDL_Window *w, SDL_Renderer *r, Ampler_state **u_data) {
|
int ampler_main(SDL_Window *w, SDL_Renderer *r, Ampler_state **u_data) {
|
||||||
if(*u_data == NULL) *u_data = init();
|
if *u_data == NULL do *u_data = init();
|
||||||
|
|
||||||
int old_size = (*u_data) -> size, new_size = sizeof Ampler_state;
|
u32 old_size = (*u_data) -> size, new_size = sizeof Ampler_state;
|
||||||
if(old_size < new_size) {
|
if old_size < new_size do {
|
||||||
printf("increasing size. %i to %i\n", old_size, new_size);
|
printf("increasing size. %i to %i\n", old_size, new_size);
|
||||||
Ampler_state *nu = malloc(new_size);
|
Ampler_state *nu = malloc(new_size);
|
||||||
SDL_memset(nu, 0, new_size);
|
SDL_memset(nu, 0, new_size);
|
||||||
|
@ -84,20 +55,22 @@ int ampler_main(SDL_Window *w, SDL_Renderer *r, Ampler_state **u_data) {
|
||||||
|
|
||||||
Ampler_state *state = *u_data;
|
Ampler_state *state = *u_data;
|
||||||
|
|
||||||
|
load_track(state);
|
||||||
|
|
||||||
SDL_PauseAudioDevice(state -> playdev, 0); // unpause audio
|
SDL_PauseAudioDevice(state -> playdev, 0); // unpause audio
|
||||||
while (1) {
|
while 1 do {
|
||||||
SDL_Event e;
|
SDL_Event e;
|
||||||
while(SDL_PollEvent(&e))
|
while SDL_PollEvent(&e) do
|
||||||
if (e.type == SDL_QUIT)
|
if e.type == SDL_QUIT do
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
audio_frame(state);
|
audio_frame(state);
|
||||||
// draw_frame(w, r, state);
|
draw_frame(w, r, state);
|
||||||
|
|
||||||
SDL_RenderPresent(r);
|
SDL_RenderPresent(r);
|
||||||
SDL_Delay(1);
|
SDL_Delay(1);
|
||||||
|
|
||||||
if (!remove("reload-trigger")) {
|
if !remove("reload-trigger") do {
|
||||||
SDL_PauseAudioDevice(state -> playdev, 1); // pause audio
|
SDL_PauseAudioDevice(state -> playdev, 1); // pause audio
|
||||||
puts("removed reload-trigger, reloading...");
|
puts("removed reload-trigger, reloading...");
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -0,0 +1,35 @@
|
||||||
|
// ampler.h
|
||||||
|
|
||||||
|
#define if if(
|
||||||
|
#define while while(
|
||||||
|
#define for for(
|
||||||
|
#define do )
|
||||||
|
|
||||||
|
typedef int8_t s8;
|
||||||
|
typedef int16_t s16;
|
||||||
|
typedef int32_t s32;
|
||||||
|
|
||||||
|
typedef uint8_t u8;
|
||||||
|
typedef uint16_t u16;
|
||||||
|
typedef uint32_t u32;
|
||||||
|
|
||||||
|
typedef float f32;
|
||||||
|
typedef double f64;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#define arraylen(a) (sizeof (a) / sizeof ((a)[0]))
|
||||||
|
|
||||||
|
#define SAMPLE_RATE (44100)
|
||||||
|
#define CHANNELS (2)
|
||||||
|
#define FRAME_SAMPLES (SAMPLE_RATE / 60)
|
||||||
|
|
||||||
|
typedef struct Ampler_state Ampler_state;
|
||||||
|
struct Ampler_state {
|
||||||
|
u32 size;
|
||||||
|
SDL_AudioDeviceID playdev;
|
||||||
|
s8 track_l[SAMPLE_RATE * 120]; // 2 minutes
|
||||||
|
s8 track_r[SAMPLE_RATE * 120]; // 2 minutes
|
||||||
|
};
|
||||||
|
|
58
audio.c
58
audio.c
|
@ -4,18 +4,62 @@ int audio_frame(Ampler_state *state) {
|
||||||
int queued = SDL_GetQueuedAudioSize(state -> playdev);
|
int queued = SDL_GetQueuedAudioSize(state -> playdev);
|
||||||
queued /= sizeof s16; // queued is in bytes
|
queued /= sizeof s16; // queued is in bytes
|
||||||
|
|
||||||
if(queued > FRAME_SAMPLES * CHANNELS * 2) return 0;
|
if queued > FRAME_SAMPLES * CHANNELS * 2 do return 0;
|
||||||
// else puts("queued audio.");
|
// else puts("queued audio.");
|
||||||
|
|
||||||
s16 silence[FRAME_SAMPLES * CHANNELS] = { 0 };
|
static s16 frame[SAMPLE_RATE * CHANNELS * 7] = { 0 };
|
||||||
for (int i = 0; i < FRAME_SAMPLES; i += CHANNELS) {
|
for int i = 0; i < arraylen(frame); i += CHANNELS do {
|
||||||
int vol = 10;
|
int vol = 64;
|
||||||
silence[i] = (i/2) * vol - FRAME_SAMPLES / 2;
|
frame[i] = ((s16) (state -> track_l[i])) * vol;
|
||||||
silence[i + 1] = (i/2) * vol - FRAME_SAMPLES / 2;
|
frame[i + 1] = ((s16) (state -> track_r[i])) * vol;
|
||||||
}
|
}
|
||||||
if(SDL_QueueAudio(state -> playdev, silence, sizeof silence))
|
if SDL_QueueAudio(state -> playdev, frame, sizeof frame) do
|
||||||
puts(SDL_GetError());
|
puts(SDL_GetError());
|
||||||
|
|
||||||
return 1; // audio was qued
|
return 1; // audio was qued
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void load_track(Ampler_state *state) {
|
||||||
|
SDL_AudioSpec spec;
|
||||||
|
s16 *buffer = NULL;
|
||||||
|
u32 bytes = 0;
|
||||||
|
|
||||||
|
SDL_LoadWAV("sample.wav", &spec, &buffer, &bytes);
|
||||||
|
|
||||||
|
if spec.format != AUDIO_S16 do {
|
||||||
|
puts("error: sample.wav is not s16");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const int len = bytes / sizeof s16;
|
||||||
|
|
||||||
|
// TODO: Use floats to print out total number of seconds
|
||||||
|
printf("loading sample.wav\n");
|
||||||
|
|
||||||
|
s8 *tracks[] = { state -> track_l, state -> track_r, };
|
||||||
|
for int i = 0; i < len; i += spec.channels do
|
||||||
|
for int c = 0; c < spec.channels; c++ do {
|
||||||
|
tracks[c][i] = (s8) (buffer[i + c] >> 8);
|
||||||
|
}
|
||||||
|
|
||||||
|
SDL_FreeWAV((void *) buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
void load_track_f32() { // idk if we're ever gonna be loading floats
|
||||||
|
/*
|
||||||
|
f32 max = 0.0f;
|
||||||
|
for int i = 0; i < len; i++ do
|
||||||
|
if buffer[i] > max do
|
||||||
|
max = buffer[i];
|
||||||
|
else if buffer[i] < -max do
|
||||||
|
max = -buffer[i];
|
||||||
|
printf("%f max\n", max);
|
||||||
|
for int i = 0; i < len; i += 2 do {
|
||||||
|
buffer[i] /= max;
|
||||||
|
buffer[i + 1] /= max;
|
||||||
|
state -> track_l[i] = ((s8)(buffer[i] * 127.0f));
|
||||||
|
state -> track_r[i] = ((s8)(buffer[i + 1] * 127.0f));
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
|
2
core.c
2
core.c
|
@ -21,7 +21,7 @@ int main(int argc, char **argv) {
|
||||||
|
|
||||||
w = SDL_CreateWindow("core",
|
w = SDL_CreateWindow("core",
|
||||||
SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
|
SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
|
||||||
480, 480, SDL_WINDOW_RESIZABLE);
|
512, 512, SDL_WINDOW_RESIZABLE);
|
||||||
r = SDL_CreateRenderer(w, -1,
|
r = SDL_CreateRenderer(w, -1,
|
||||||
SDL_RENDERER_ACCELERATED | SDL_RENDERER_TARGETTEXTURE);
|
SDL_RENDERER_ACCELERATED | SDL_RENDERER_TARGETTEXTURE);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue