/*
 *  Overreact - Mr. 4th Dimention
 *      Allen Webster
 *  03.21.2015 (mm.dd.yyyy)
 *
 * Audio Layer.
 */

internal void
wav_open_file(char *filename, Wav_File *wav_file){
	File file = system_load_file(filename);
	if (file.data && file.size > sizeof(Wav_File)){
		*wav_file = {};
		wav_file->file = file;
		wav_file->header = *(Wav_Header*)file.data;
		
		Assert(wav_file->header.chunk.id == WAV_CHUNK_RIFF);
		Assert(wav_file->header.wav_id == WAV_CHUNK_WAVE);
	}
}

internal i32
wav_data_requirement(Wav_File *wav_file){
	u8 *cursor = (u8*)wav_file->file.data + sizeof(Wav_Header);
	u64 size = wav_file->file.size;
	u8 *end = (u8*)wav_file->file.data + size;
	
	i32 requirement = 0;
	i32 channels = 0;
	
	while (1){
		Wav_Chunk chunk;
		chunk = *(Wav_Chunk*)cursor;
		
		if (chunk.id == WAV_CHUNK_data){
			Assert(requirement == 0);
			requirement = chunk.size;
			cursor += sizeof(Wav_Chunk) + chunk.size;
			if (chunk.size % 2 == 1){
				++cursor;
			}
		}
		else{
			if (chunk.id == WAV_CHUNK_fmt){
				Wav_Format_Chunk_16 fmt;
				fmt = *(Wav_Format_Chunk_16*)(cursor);
				channels = fmt.channels;
			}
			cursor += sizeof(Wav_Chunk) + chunk.size;
		}
		
		if (cursor >= end){
			break;
		}
	}
	
	return requirement*(2/channels) + 4;
}

internal bool32
wav_fill_sound(Wav_File *wav_file, Sound *sound,
			   i32 system_sample_per_second){
	u8 *cursor = (u8*)wav_file->file.data + sizeof(Wav_Header);
	u64 size = wav_file->file.size;
	u8 *end = (u8*)wav_file->file.data + size;
	
	bool32 found_data = 0;
	
	while (1){
		Wav_Chunk chunk;
		chunk = *(Wav_Chunk*)cursor;
		
		if (chunk.id == WAV_CHUNK_data){
			Assert(found_data == 0);
			found_data = 1;
			sound->memory_size = chunk.size*(2/sound->channels);
			sound->sample_count = (chunk.size/sound->channels)/sound->bytes_per_sample;
			
			i16 *sample_src = (i16*)(cursor + sizeof(Wav_Chunk));
			i16 *sample_dest = sound->samples;
			if (sound->channels == 1){
				for (i32 i = 0; i < sound->sample_count; ++i){
					*sample_dest++ = *sample_src;
					*sample_dest++ = *sample_src++;
				}
				*sample_dest++ = 0;
				*sample_dest++ = 0;
			}
			else{
				for (i32 i = 0; i < sound->sample_count; ++i){
					*sample_dest++ = *sample_src++;
					*sample_dest++ = *sample_src++;
				}
				*sample_dest++ = 0;
				*sample_dest++ = 0;
			}
			cursor += sizeof(Wav_Chunk) + chunk.size;
			if (chunk.size % 2 == 1){
				++cursor;
			}
		}
		
		else{
			if (chunk.id == WAV_CHUNK_fmt){
				Wav_Format_Chunk_16 fmt;
				fmt = *(Wav_Format_Chunk_16*)(cursor);
				
				Assert(fmt.channels == 1 || fmt.channels == 2);
				
				sound->channels = fmt.channels;
				sound->samples_per_second = fmt.samples_per_second;
				sound->bytes_per_sample = fmt.bits_per_sample >> 3;
				sound->scan_speed = ((real32)sound->samples_per_second/system_sample_per_second);
			}
			cursor += sizeof(Wav_Chunk) + chunk.size;
		}
		
		if (cursor >= end){
			break;
		}
	}

	return found_data;
}