playing test audio works now
This commit is contained in:
		
							parent
							
								
									2e1d171251
								
							
						
					
					
						commit
						cffa8ca132
					
				
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @ -1,3 +1,4 @@ | ||||
| 
 | ||||
| *.exe | ||||
| *.dll | ||||
| reload-trigger | ||||
|  | ||||
							
								
								
									
										88
									
								
								ampler.c
									
									
									
									
									
								
							
							
						
						
									
										88
									
								
								ampler.c
									
									
									
									
									
								
							| @ -2,19 +2,103 @@ | ||||
| 
 | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <stdint.h> | ||||
| 
 | ||||
| #include <SDL2/SDL.h> | ||||
| 
 | ||||
| int ampler_main(SDL_Window *w, SDL_Renderer *r, void **u_data) { | ||||
| 	SDL_Event e; | ||||
| #define SAMPLE_RATE (44100) | ||||
| #define CHANNELS (2) | ||||
| #define FRAME_SAMPLES (SAMPLE_RATE / 60) | ||||
| 
 | ||||
| typedef uint8_t s8; | ||||
| typedef uint16_t s16; | ||||
| 
 | ||||
| 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 *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)) | ||||
| 		puts(SDL_GetError()); | ||||
| 
 | ||||
| 	puts("init."); | ||||
| 	return state; | ||||
| } | ||||
| 
 | ||||
| int ampler_main(SDL_Window *w, SDL_Renderer *r, Ampler_state **u_data) { | ||||
| 	if(*u_data == NULL) *u_data = init(); | ||||
| 
 | ||||
| 	int old_size = (*u_data) -> size, new_size = sizeof Ampler_state; | ||||
| 	if(old_size < new_size) { | ||||
| 		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) { | ||||
| 		SDL_Event e; | ||||
| 		while(SDL_PollEvent(&e)) | ||||
| 			if (e.type == SDL_QUIT) | ||||
| 				return 1; | ||||
| 
 | ||||
| 		audio_frame(state); | ||||
| 		// draw_frame(w, r, state);
 | ||||
| 
 | ||||
| 		SDL_RenderPresent(r); | ||||
| 		SDL_Delay(1); | ||||
| 
 | ||||
| 		if (!remove("reload-trigger")) { | ||||
| 			SDL_PauseAudioDevice(state -> playdev, 1); // pause audio
 | ||||
| 			puts("removed reload-trigger, reloading..."); | ||||
| 			return 0; | ||||
| 		} | ||||
|  | ||||
							
								
								
									
										21
									
								
								audio.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								audio.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,21 @@ | ||||
| // audio.c
 | ||||
| 
 | ||||
| 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
 | ||||
| } | ||||
| 
 | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user