audio finally loads and plays
This commit is contained in:
		
							parent
							
								
									cffa8ca132
								
							
						
					
					
						commit
						412d2588cb
					
				
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @ -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; | ||||||
|  | |||||||
							
								
								
									
										35
									
								
								ampler.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								ampler.h
									
									
									
									
									
										Normal file
									
								
							| @ -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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user