Ejemplo n.º 1
0
static bool address_expansion_read(FILE *f, address_expansion_t *expansion) {
    if (f == NULL) return false;


    if (!file_read_uint32(f, (uint32_t *)&expansion->canonical_index)) {
        return false;
    }

    uint32_t language_len;

    if (!file_read_uint32(f, &language_len)) {
        return false;
    }

    if (!file_read_chars(f, expansion->language, language_len)) {
        return false;
    }

    if (!file_read_uint32(f, (uint32_t *)&expansion->num_dictionaries)) {
        return false;
    }

    for (size_t i = 0; i < expansion->num_dictionaries; i++) {
        if (!file_read_uint16(f, (uint16_t *)expansion->dictionary_ids + i)) {
            return false;
        }
    }

    if (!file_read_uint32(f, &expansion->address_components)) {
        return false;
    }

    if (!file_read_uint8(f, (uint8_t *)&expansion->separable)) {
        return false;
    }

    return true;
}
Ejemplo n.º 2
0
RawSound* wav_load(const char* filename) {
	assert(filename);

	FileHandle wav_file = file_open(filename);

	uint chunk_id = file_read_uint32(wav_file);
	if(chunk_id != ('R'+('I'<<8)+('F'<<16)+('F'<<24)))
		LOG_ERROR("Bad file type");
	file_read_uint32(wav_file);
	uint wave_id = file_read_uint32(wav_file);
	if(wave_id != ('W'+('A'<<8)+('V'<<16)+('E'<<24)))
		LOG_ERROR("Bad wave id");

	// Format chunk
	uint format_id = file_read_uint32(wav_file);
	if(format_id != ('f'+('m'<<8)+('t'<<16)+(' '<<24)))
		LOG_ERROR("Not format chunk");
	uint format_length __attribute__ ((unused)) = file_read_uint32(wav_file);
	assert(format_length == 0x10);
	format_length = 0; // To prevent unused warning
	uint16 format_code __attribute__((unused)) = file_read_uint16(wav_file);
	assert(format_code == 0x01);
	format_code = 0; // To prevent unused warning
	uint16 n_channels = file_read_uint16(wav_file);
	assert(n_channels == 1 || n_channels == 2);
	uint32 sample_rate = file_read_uint32(wav_file);
	file_read_uint32(wav_file);
	file_read_uint16(wav_file);
	uint16 bits_per_sample = file_read_uint16(wav_file);
	assert(bits_per_sample == 8 || bits_per_sample == 16);

	// Data chunk
	// https://projects.developer.nokia.com/svn/matchempoker/tags/v1.1.0/qt_build/src/GEAudioBuffer.cpp
	uint32 data_id = 1635017060;
    uint32 current_field = file_read_uint32(wav_file);
    while(current_field != data_id) // Skip till "data" is found
        current_field = file_read_uint32(wav_file);

    uint data_size = file_read_uint32(wav_file);

	if(data_size < 1)
        LOG_ERROR("Data id is not \'data\'");
	void* data = MEM_ALLOC(data_size);
	file_read(wav_file, data, data_size);

	// Fill sound struct
	RawSound* result = (RawSound*)MEM_ALLOC(sizeof(RawSound));
	result->frequency = sample_rate;
	result->bits = bits_per_sample;
	result->channels = n_channels;
	result->size = data_size;
	result->data = data;

	// If 16 bits per sample and we're on big-endian cpu, swap bytes
	uint16 endian_test = 0x0011;
	if(bits_per_sample == 16 && endian_test != endian_swap2(endian_test)) {
		size_t i; for(i = 0; i < data_size; i += 2) {
			uint16* sample = (uint16*)(result->data + i);
			*sample = endian_swap2(*sample);
		}
	}

	return result;
}