visualiser now runns on defaut input device
This commit is contained in:
		
							parent
							
								
									6f01e60b10
								
							
						
					
					
						commit
						6b3c8210b5
					
				
							
								
								
									
										20
									
								
								ampler.c
									
									
									
									
									
								
							
							
						
						
									
										20
									
								
								ampler.c
									
									
									
									
									
								
							| @ -29,11 +29,21 @@ Ampler_state *init() { | ||||
| 	if !(state -> playdev) do | ||||
| 		puts(SDL_GetError()); | ||||
| 
 | ||||
| 	state -> recdev = SDL_OpenAudioDevice( | ||||
| 		NULL, // default device
 | ||||
| 		1, // is capture
 | ||||
| 		&want, | ||||
| 		&have, | ||||
| 		0 // no changes allowed
 | ||||
| 	); | ||||
| 	if !(state -> playdev) do | ||||
| 		puts(SDL_GetError()); | ||||
| 
 | ||||
| 	// TODO: iterate a directory to load samples
 | ||||
| 	//load_sample(state, "mix.wav");
 | ||||
| 	//load_sample(state, "loop2.wav");
 | ||||
| 	//load_sample(state, "loop.wav");
 | ||||
| 	//load_sample(state, "chord.wav");
 | ||||
| 	//load_sample(state, "./mix.wav");
 | ||||
| 	//load_sample(state, "./loop2.wav");
 | ||||
| 	//load_sample(state, "./loop.wav");
 | ||||
| 	//load_sample(state, "./chord.wav");
 | ||||
| 
 | ||||
| 	puts("init."); | ||||
| 	return state; | ||||
| @ -60,6 +70,7 @@ int ampler_main(SDL_Window *w, SDL_Renderer *r, Ampler_state **u_data) { | ||||
| 	// put results in state for last frame's perf, so that we can draw it
 | ||||
| 	SDL_SetWindowTitle(w, "ampler"); | ||||
| 	SDL_PauseAudioDevice(state -> playdev, 0); // unpause audio
 | ||||
| 	SDL_PauseAudioDevice(state -> recdev, 0); // unpause audio
 | ||||
| 	udp_init(state); | ||||
| 	while 1 do { | ||||
| 		SDL_Event e; | ||||
| @ -80,6 +91,7 @@ int ampler_main(SDL_Window *w, SDL_Renderer *r, Ampler_state **u_data) { | ||||
| 
 | ||||
| 		if !remove("reload-trigger") do { | ||||
| 			SDL_PauseAudioDevice(state -> playdev, 1); // pause audio
 | ||||
| 			SDL_PauseAudioDevice(state -> recdev, 1); // pause audio
 | ||||
| 			udp_quit(state); | ||||
| 			puts("removed reload-trigger, reloading..."); | ||||
| 			return 0; | ||||
|  | ||||
							
								
								
									
										2
									
								
								ampler.h
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								ampler.h
									
									
									
									
									
								
							| @ -63,10 +63,12 @@ typedef struct Ampler_state Ampler_state; | ||||
| struct Ampler_state { | ||||
| 	u32 size; // in bytes, off this struct
 | ||||
| 	SDL_AudioDeviceID playdev; | ||||
| 	SDL_AudioDeviceID recdev; | ||||
| 	Sound_src sounds[64]; | ||||
| 	s32 played_audio_last_frame; | ||||
| 	Udp_msg messages[64]; | ||||
| 	s8 frame_mix[CHANNELS][FRAME_SAMPLES]; | ||||
| 	s8 frame_rec[CHANNELS][FRAME_SAMPLES]; | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										26
									
								
								audio.c
									
									
									
									
									
								
							
							
						
						
									
										26
									
								
								audio.c
									
									
									
									
									
								
							| @ -60,7 +60,31 @@ void sound_src_frame(Sound_src *s, s8 *mix[]) { | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| void rec_frame(Ampler_state *state) { | ||||
| 	// const int frame_bytes = FRAME_SAMPLES * CHANNELS * sizeof(s16);
 | ||||
| 	static s16 buf[FRAME_SAMPLES * CHANNELS * sizeof(s16)]; | ||||
| 
 | ||||
| 	u32 samps = SDL_GetQueuedAudioSize(state->recdev) / sizeof(s16); | ||||
| 
 | ||||
| 	// TODO: this introduces a frame of lag, but should make sure we always
 | ||||
| 	// deque a full frame, maybe find a less laggy way ?
 | ||||
| 	if samps > FRAME_SAMPLES * CHANNELS * 2 do { | ||||
| 		u32 bytes = SDL_DequeueAudio(state->recdev, buf, sizeof(buf)); | ||||
| 		// printf("%i %i %i samples\n", samps, bytes / sizeof(s16), sizeof(buf) / 2);
 | ||||
| 	} | ||||
| 
 | ||||
| 	// TODO: test with stero recording input to make sure this works
 | ||||
| 	for int i = 0; i < FRAME_SAMPLES; i += 1 do | ||||
| 		for int c = 0; c < CHANNELS; c += 1 do { | ||||
| 			state->frame_rec[c][i] = buf[i * CHANNELS + c] >> 8; | ||||
| 		} | ||||
| } | ||||
| 
 | ||||
| int audio_frame(Ampler_state *state) { | ||||
| 	// TODO: it's unlikely but possible that we can miss recorded data because
 | ||||
| 	// gur rec buffer was filled on a frame where we didn't play anything
 | ||||
| 	rec_frame(state); | ||||
| 
 | ||||
| 	int queued = SDL_GetQueuedAudioSize(state -> playdev); | ||||
| 	queued /= sizeof (s16); // queued is in bytes
 | ||||
| 
 | ||||
| @ -107,7 +131,7 @@ void load_sample(Ampler_state *state, const char *file_name) { | ||||
| 	s16 *buffer = NULL; | ||||
| 	u32 bytes = 0; | ||||
| 
 | ||||
| 	SDL_LoadWAV(file_name, &spec, &buffer, &bytes); | ||||
| 	SDL_LoadWAV(file_name, &spec, (u8 **) &buffer, &bytes); | ||||
| 
 | ||||
| 	if spec.format != AUDIO_S16 do { | ||||
| 		puts("error: sample.wav is not s16"); | ||||
|  | ||||
							
								
								
									
										4
									
								
								draw.c
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								draw.c
									
									
									
									
									
								
							| @ -40,6 +40,10 @@ void draw_frame(SDL_Window *w, SDL_Renderer *r, Ampler_state *state) { | ||||
| 	for int x = 0; x < FRAME_SAMPLES - 1; x += 1 do { | ||||
| 		u8 cur = state->frame_mix[0][x] + 128; | ||||
| 		u8 next = state->frame_mix[0][x + 1] + 128; | ||||
| 
 | ||||
| 		cur = state->frame_rec[0][x] + 128; | ||||
| 		next = state->frame_rec[0][x + 1] + 128; | ||||
| 
 | ||||
| 		markov[cur][next] += 1; | ||||
| 	} | ||||
| 
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user