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 | *.exe | ||||||
| *.dll | *.dll | ||||||
|  | reload-trigger | ||||||
|  | |||||||
							
								
								
									
										88
									
								
								ampler.c
									
									
									
									
									
								
							
							
						
						
									
										88
									
								
								ampler.c
									
									
									
									
									
								
							| @ -2,19 +2,103 @@ | |||||||
| 
 | 
 | ||||||
| #include <stdio.h> | #include <stdio.h> | ||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
|  | #include <stdint.h> | ||||||
| 
 | 
 | ||||||
| #include <SDL2/SDL.h> | #include <SDL2/SDL.h> | ||||||
| 
 | 
 | ||||||
| int ampler_main(SDL_Window *w, SDL_Renderer *r, void **u_data) { | #define SAMPLE_RATE (44100) | ||||||
| 	SDL_Event e; | #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) { | 	while (1) { | ||||||
|  | 		SDL_Event e; | ||||||
| 		while(SDL_PollEvent(&e)) | 		while(SDL_PollEvent(&e)) | ||||||
| 			if (e.type == SDL_QUIT) | 			if (e.type == SDL_QUIT) | ||||||
| 				return 1; | 				return 1; | ||||||
|  | 
 | ||||||
|  | 		audio_frame(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")) { | ||||||
|  | 			SDL_PauseAudioDevice(state -> playdev, 1); // pause audio
 | ||||||
| 			puts("removed reload-trigger, reloading..."); | 			puts("removed reload-trigger, reloading..."); | ||||||
| 			return 0; | 			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