audio tracks are now stored in Sound_src
This commit is contained in:
		
							parent
							
								
									349051e4de
								
							
						
					
					
						commit
						4a5a3f1e3d
					
				
							
								
								
									
										3
									
								
								ampler.h
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								ampler.h
									
									
									
									
									
								
							| @ -29,7 +29,7 @@ typedef double f64; | |||||||
| 
 | 
 | ||||||
| typedef struct Sound_src Sound_src; | typedef struct Sound_src Sound_src; | ||||||
| struct Sound_src { | struct Sound_src { | ||||||
| 	s32 start; // in samples
 | 	s8 *tracks[CHANNELS]; | ||||||
| 	s32 len; // in samples
 | 	s32 len; // in samples
 | ||||||
| 	f32 pos; // position in samples
 | 	f32 pos; // position in samples
 | ||||||
| 	f32 speed; // in samples, per sample, can be negative
 | 	f32 speed; // in samples, per sample, can be negative
 | ||||||
| @ -40,7 +40,6 @@ typedef struct Ampler_state Ampler_state; | |||||||
| struct Ampler_state { | struct Ampler_state { | ||||||
| 	u32 size; // in bytes, off this struct
 | 	u32 size; // in bytes, off this struct
 | ||||||
| 	SDL_AudioDeviceID playdev; | 	SDL_AudioDeviceID playdev; | ||||||
| 	s8 tracks[CHANNELS][SAMPLE_RATE * 480]; // 8 minutes
 |  | ||||||
| 	Sound_src sounds[64]; | 	Sound_src sounds[64]; | ||||||
| 	s32 played_audio_last_frame; | 	s32 played_audio_last_frame; | ||||||
| }; | }; | ||||||
|  | |||||||
							
								
								
									
										41
									
								
								audio.c
									
									
									
									
									
								
							
							
						
						
									
										41
									
								
								audio.c
									
									
									
									
									
								
							| @ -1,15 +1,15 @@ | |||||||
| // audio.c
 | // audio.c
 | ||||||
| 
 | 
 | ||||||
| void sound_src_frame(Sound_src *s, s8 *tracks[], s8 *mix[]) { | void sound_src_frame(Sound_src *s, s8 *mix[]) { | ||||||
| 	if s -> state == LOOPING do | 	if s -> state == LOOPING do | ||||||
| 	for int i = 0; i < FRAME_SAMPLES; i += 1 do { | 	for int i = 0; i < FRAME_SAMPLES; i += 1 do { | ||||||
| 		for int c = 0; c < CHANNELS; c += 1 do | 		for int c = 0; c < CHANNELS; c += 1 do | ||||||
| 			mix[c][i] += tracks[c][(int) (s -> start + s -> pos)]; | 			mix[c][i] += s -> tracks[c][(int) s -> pos]; | ||||||
| 
 | 
 | ||||||
| 		s -> pos += s -> speed; | 		s -> pos += s -> speed; | ||||||
| 		while s -> pos < 0.0f do | 		while s -> pos < 0.0f do | ||||||
| 			s -> pos += s -> len; | 			s -> pos += s -> len; | ||||||
| 		while s -> pos > s -> len do | 		while s -> pos >= s -> len do | ||||||
| 			s -> pos -= s -> len; | 			s -> pos -= s -> len; | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| @ -21,14 +21,14 @@ int audio_frame(Ampler_state *state) { | |||||||
| 	if queued > FRAME_SAMPLES * CHANNELS * 2 do return 0; | 	if queued > FRAME_SAMPLES * CHANNELS * 2 do return 0; | ||||||
| 	// else puts("queued audio.");
 | 	// else puts("queued audio.");
 | ||||||
| 
 | 
 | ||||||
|  | 	// TODO: We should use CHANNELS here
 | ||||||
| 	static s8 mix_l[FRAME_SAMPLES] = { 0 }, mix_r[FRAME_SAMPLES] = { 0 }; | 	static s8 mix_l[FRAME_SAMPLES] = { 0 }, mix_r[FRAME_SAMPLES] = { 0 }; | ||||||
| 	SDL_memset(mix_l, 0, sizeof mix_l); | 	SDL_memset(mix_l, 0, sizeof mix_l); | ||||||
| 	SDL_memset(mix_r, 0, sizeof mix_r); | 	SDL_memset(mix_r, 0, sizeof mix_r); | ||||||
| 
 | 
 | ||||||
| 	s8 *mix[] = { mix_l, mix_r }; | 	s8 *mix[] = { mix_l, mix_r }; | ||||||
| 	s8 *tracks[] = { state -> tracks[0], state -> tracks[1] }; |  | ||||||
| 	for int s = 0; s < arraylen(state -> sounds); s += 1 do | 	for int s = 0; s < arraylen(state -> sounds); s += 1 do | ||||||
| 		sound_src_frame(&(state -> sounds[s]), tracks, mix); | 		sound_src_frame(&(state -> sounds[s]), mix); | ||||||
| 
 | 
 | ||||||
| 	const int vol = 100; | 	const int vol = 100; | ||||||
| 	static s16 frame[FRAME_SAMPLES * CHANNELS] = { 0 }; | 	static s16 frame[FRAME_SAMPLES * CHANNELS] = { 0 }; | ||||||
| @ -55,25 +55,30 @@ void load_track(Ampler_state *state) { | |||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	const int chans = spec.channels; | 	const int chans = spec.channels; | ||||||
| 	const int len = (bytes / sizeof s16) / chans; | 	const int length = (bytes / sizeof s16) / chans; | ||||||
| 
 | 
 | ||||||
| 	// TODO: VALIDATE LENGTH + TRACKS
 | 	// TODO: Actually find free sound_src
 | ||||||
|  | 	Sound_src *snd = &(state -> sounds[0]); | ||||||
|  | 	snd -> len = length; | ||||||
|  | 	snd -> speed = 1.0f; | ||||||
|  | 	snd -> pos = 0.0f; | ||||||
|  | 	snd -> state = LOOPING; // TOOD: Should be STOPPED
 | ||||||
| 
 | 
 | ||||||
| 	printf("loading sample.wav %f seconds.\n", | 	for int i = 0; i < CHANNELS; i += 1 do | ||||||
| 		((f32) len) / ((f32) SAMPLE_RATE)); | 		snd -> tracks[i] = malloc(snd -> len); | ||||||
| 
 | 
 | ||||||
| 	for int i = 0; i < len; i += 1 do | 	for int i = 0; i < CHANNELS; i += 1 do | ||||||
|  | 		if !snd -> tracks[i] do | ||||||
|  | 			puts("fffuuuck"); | ||||||
|  | 
 | ||||||
|  | 	for int i = 0; i < snd -> len; i += 1 do | ||||||
| 		for int t = 0; t < chans; t += 1 do | 		for int t = 0; t < chans; t += 1 do | ||||||
| 			state -> tracks[t][i] = (s8) (buffer[i * chans + t] >> 8); | 			snd -> tracks[t][i] = (s8) (buffer[i * chans + t] >> 8); | ||||||
| 
 |  | ||||||
| 	// TODO: Find actually free sound_src
 |  | ||||||
| 	state -> sounds[0].start = 0; |  | ||||||
| 	state -> sounds[0].len = len; |  | ||||||
| 	state -> sounds[0].speed = 1.0f; |  | ||||||
| 	state -> sounds[0].pos = 0.0f; |  | ||||||
| 	state -> sounds[0].state = LOOPING; |  | ||||||
| 
 | 
 | ||||||
| 	SDL_FreeWAV((void *) buffer); | 	SDL_FreeWAV((void *) buffer); | ||||||
|  | 
 | ||||||
|  | 	printf("loaded sample.wav %f seconds.\n", | ||||||
|  | 		((f32) length) / ((f32) SAMPLE_RATE)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void load_track_f32() { // idk if we're ever gonna be loading floats
 | void load_track_f32() { // idk if we're ever gonna be loading floats
 | ||||||
|  | |||||||
							
								
								
									
										14
									
								
								draw.c
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								draw.c
									
									
									
									
									
								
							| @ -2,22 +2,24 @@ | |||||||
| 
 | 
 | ||||||
| void draw_frame(SDL_Window *w, SDL_Renderer *r, Ampler_state *state) { | void draw_frame(SDL_Window *w, SDL_Renderer *r, Ampler_state *state) { | ||||||
| 	SDL_SetRenderDrawColor(r, 0x1D, 0x2B, 0x53, 255); | 	SDL_SetRenderDrawColor(r, 0x1D, 0x2B, 0x53, 255); | ||||||
|  | 	//SDL_SetRenderDrawColor(r, 10, 10, 10, 100);
 | ||||||
| 	SDL_RenderClear(r); | 	SDL_RenderClear(r); | ||||||
| 
 | 
 | ||||||
|  | 	// TODO: ACTUALLY DRAW ALL SOUNDS, BUT SMOLER
 | ||||||
| 	SDL_SetRenderDrawColor(r, 0xFF, 0x00, 0x4D, 255); | 	SDL_SetRenderDrawColor(r, 0xFF, 0x00, 0x4D, 255); | ||||||
| 	const space = (44100 * 8) / 512; | 	const space = (44100 * 8) / 512; | ||||||
| 	for int t = 0; t < arraylen(state -> tracks); t += 1 do | 	const int t = 0; | ||||||
| 		for int x = 0; x < 512; x += 1 do { | 		for int x = 0; x < 512; x += 1 do { | ||||||
| 			const int y = 128 + 256 * t; | 			const int y = 128 + 256 * t; | ||||||
| 			const int val = state -> tracks[t][x * space]; | 			const int val = state -> sounds[0].tracks[t][x * space]; | ||||||
| 			SDL_RenderDrawLine(r, y + val / 8, x, y + val, x); | 			SDL_RenderDrawLine(r, x, y + val / 8, x, y + val); | ||||||
| 			//SDL_RenderDrawPoint(r, y + val, x);
 | 			//SDL_RenderDrawPoint(r, x, y + val);
 | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 	if state -> played_audio_last_frame do | 	if state -> played_audio_last_frame do | ||||||
| 	for int i = 0; i < arraylen(state -> sounds); i += 1 do { | 	for int i = 0; i < arraylen(state -> sounds); i += 1 do { | ||||||
| 		const int x = (state -> sounds[i].start + state -> sounds[i].pos) / space; | 		const int x = state -> sounds[i].pos / space; | ||||||
| 		SDL_RenderDrawLine(r, 0, x, 512, x); | 		SDL_RenderDrawLine(r, x, 0, x, 512); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	SDL_RenderPresent(r); | 	SDL_RenderPresent(r); | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user