コード例 #1
0
ファイル: resources.c プロジェクト: foolsh/xrick
static bool loadResourceHighScores(file_t fp)
{
    size_t i;
    U16 u16Temp;
    U32 u32Temp;
    resource_hiscore_t dataTemp;

    if (sysfile_read(fp, &u16Temp, sizeof(u16Temp), 1) != 1)
    {
        return false;
    }
    screen_nbr_hiscores = letoh16(u16Temp);

    screen_highScores = sysmem_push(screen_nbr_hiscores * sizeof(*screen_highScores));
    if (!screen_highScores)
    {
        return false;
    }

    for (i = 0; i < screen_nbr_hiscores; ++i)
    {
        if (sysfile_read(fp, &dataTemp, sizeof(dataTemp), 1) != 1)
        {
            return false;
        }
        memcpy(&u32Temp, dataTemp.score, sizeof(U32));
        screen_highScores[i].score = letoh32(u32Temp);
        memcpy(screen_highScores[i].name, dataTemp.name, HISCORE_NAME_SIZE);
    }
    return true;
}
コード例 #2
0
ファイル: resources.c プロジェクト: foolsh/xrick
static bool loadResourceImapsteps(file_t fp)
{
    size_t i;
    U16 u16Temp;
    resource_imapsteps_t dataTemp;

    if (sysfile_read(fp, &u16Temp, sizeof(u16Temp), 1) != 1)
    {
        return false;
    }
    screen_nbr_imapstesps = letoh16(u16Temp);

    screen_imapsteps = sysmem_push(screen_nbr_imapstesps * sizeof(*screen_imapsteps));
    if (!screen_imapsteps)
    {
        return false;
    }

    for (i = 0; i < screen_nbr_imapstesps; ++i)
    {
        if (sysfile_read(fp, &dataTemp, sizeof(dataTemp), 1) != 1)
        {
            return false;
        }
        memcpy(&u16Temp, dataTemp.count, sizeof(U16));
        screen_imapsteps[i].count = letoh16(u16Temp);
        memcpy(&u16Temp, dataTemp.dx, sizeof(U16));
        screen_imapsteps[i].dx = letoh16(u16Temp);
        memcpy(&u16Temp, dataTemp.dy, sizeof(U16));
        screen_imapsteps[i].dy = letoh16(u16Temp);
        memcpy(&u16Temp, dataTemp.base, sizeof(U16));
        screen_imapsteps[i].base = letoh16(u16Temp);
    }
    return true;
}
コード例 #3
0
ファイル: resources.c プロジェクト: foolsh/xrick
static bool loadResourceSubmaps(file_t fp)
{
    size_t i;
    U16 u16Temp;
    resource_submap_t dataTemp;

    if (sysfile_read(fp, &u16Temp, sizeof(u16Temp), 1) != 1)
    {
        return false;
    }
    map_nbr_submaps = letoh16(u16Temp);

    map_submaps = sysmem_push(map_nbr_submaps * sizeof(*map_submaps));
    if (!map_submaps)
    {
        return false;
    }

    for (i = 0; i < map_nbr_submaps; ++i)
    {
        if (sysfile_read(fp, &dataTemp, sizeof(dataTemp), 1) != 1)
        {
            return false;
        }
        memcpy(&u16Temp, dataTemp.page, sizeof(U16));
        map_submaps[i].page = letoh16(u16Temp);
        memcpy(&u16Temp, dataTemp.bnum, sizeof(U16));
        map_submaps[i].bnum = letoh16(u16Temp);
        memcpy(&u16Temp, dataTemp.connect, sizeof(U16));
        map_submaps[i].connect = letoh16(u16Temp);
        memcpy(&u16Temp, dataTemp.mark, sizeof(U16));
        map_submaps[i].mark = letoh16(u16Temp);
    }
    return true;
}
コード例 #4
0
ファイル: resources.c プロジェクト: foolsh/xrick
/*
 * load 16b length + not-terminated string
 */
static bool loadString(file_t fp, char ** buffer, const char terminator)
{
    size_t length;
    U16 u16Temp;
    char * bufferTemp;

    if (sysfile_read(fp, &u16Temp, sizeof(u16Temp), 1) != 1)
    {
        return false;
    }
    length = letoh16(u16Temp);

    bufferTemp = sysmem_push(length + 1);
    *buffer = bufferTemp;
    if (!bufferTemp)
    {
        return false;
    }

    if (length)
    {
        if (sysfile_read(fp, bufferTemp, length, 1) != 1)
        {
            return false;
        }
    }

    bufferTemp[length] = terminator;

    return true;
}
コード例 #5
0
ファイル: resources.c プロジェクト: foolsh/xrick
static bool loadResourceSpritesData(file_t fp)
{
    size_t i, j;
    U16 u16Temp;

    if (sysfile_read(fp, &u16Temp, sizeof(u16Temp), 1) != 1)
    {
        return false;
    }
    sprites_nbr_sprites = letoh16(u16Temp);

    sprites_data = sysmem_push(sprites_nbr_sprites * sizeof(*sprites_data));
    if (!sprites_data)
    {
        return false;
    }

#ifdef GFXST
    for (i = 0; i < sprites_nbr_sprites; ++i)
    {
        for (j = 0; j < SPRITES_NBR_DATA; ++j)
        {
            U32 u32Temp;
            if (sysfile_read(fp, &u32Temp, sizeof(u32Temp), 1) != 1)
            {
                return false;
            }
            sprites_data[i][j] = letoh32(u32Temp);
        }
    }
#endif /* GFXST */

#ifdef GFXPC
    for (i = 0; i < sprites_nbr_sprites; ++i)
    {
        for (j = 0; j < SPRITES_NBR_COLS; ++j)
        {
            size_t k;
            for (k = 0; k < SPRITES_NBR_ROWS; ++k)
            {
                resource_spriteX_t dataTemp;
                if (sysfile_read(fp, &dataTemp, sizeof(dataTemp), 1) != 1)
                {
                    return false;
                }
                memcpy(&u16Temp, dataTemp.mask, sizeof(U16));
                sprites_data[i][j][k].mask = letoh16(u16Temp);
                memcpy(&u16Temp, dataTemp.pict, sizeof(U16));
                sprites_data[i][j][k].pict = letoh16(u16Temp);
            }
        }
    }
#endif /* GFXPC */

    return true;
}
コード例 #6
0
ファイル: resources.c プロジェクト: foolsh/xrick
static bool loadImage(file_t fp, img_t ** image)
{
    U16 u16Temp;
    size_t pixelCount, colorCount;
    resource_pic_t dataTemp;
    img_t * imgTemp;
    void * vp;
    bool success;

    imgTemp = sysmem_push(sizeof(*imgTemp));
    *image = imgTemp;
    if (!imgTemp)
    {
        return false;
    }

    if (sysfile_read(fp, &dataTemp, sizeof(dataTemp), 1) != 1)
    {
        return false;
    }
    memcpy(&u16Temp, dataTemp.width, sizeof(U16));
    imgTemp->width = letoh16(u16Temp);
    memcpy(&u16Temp, dataTemp.height, sizeof(U16));
    imgTemp->height = letoh16(u16Temp);
    memcpy(&u16Temp, dataTemp.xPos, sizeof(U16));
    imgTemp->xPos = letoh16(u16Temp);
    memcpy(&u16Temp, dataTemp.yPos, sizeof(U16));
    imgTemp->yPos = letoh16(u16Temp);

    vp = imgTemp->colors;
    success = loadRawData(fp, &vp, sizeof(*imgTemp->colors), &colorCount);
    imgTemp->ncolors = colorCount;
    imgTemp->colors = vp;
    if (!success)
    {
        return false;
    }

    pixelCount = (imgTemp->width * imgTemp->height);  /*we use 8b per pixel*/

    imgTemp->pixels = sysmem_push(pixelCount * sizeof(U8));
    if (!imgTemp->pixels)
    {
        return false;
    }

    if (sysfile_read(fp, imgTemp->pixels, sizeof(U8), pixelCount) != (int)pixelCount)
    {
        return false;
    }
    return true;
}
コード例 #7
0
ファイル: resources.c プロジェクト: foolsh/xrick
static bool readHeader(file_t fp, const unsigned id)
{
    resource_header_t header;
    U16 u16Temp;

    if (sysfile_read(fp, &header, sizeof(header), 1) != 1)
    {
        sys_error("(resources) unable to read header from \"%s\"", resourceFiles[id]);
        return false;
    }

    if (memcmp(header.magic, resource_magic, sizeof(header.magic)) != 0)
    {
        sys_error("(resources) wrong header for \"%s\"", resourceFiles[id]);
        return false;
    }

    memcpy(&u16Temp, header.version, sizeof(u16Temp));
    u16Temp = htole16(u16Temp);
    if (u16Temp != DATA_VERSION)
    {
        sys_error("(resources) incompatible version for \"%s\"", resourceFiles[id]);
        return false;
    }

    memcpy(&u16Temp, header.resourceId, sizeof(u16Temp));
    u16Temp = htole16(u16Temp);
    if (u16Temp != id)
    {
        sys_error("(resources) mismatching ID for \"%s\"", resourceFiles[id]);
        return false;
    }
    return true;
}
コード例 #8
0
ファイル: resources.c プロジェクト: foolsh/xrick
static bool loadResourceImaptext(file_t fp)
{
    size_t i;
    U16 u16Temp;

    if (sysfile_read(fp, &u16Temp, sizeof(u16Temp), 1) != 1)
    {
        return false;
    }
    screen_nbr_imaptext = letoh16(u16Temp);

    screen_imaptext = sysmem_push(screen_nbr_imaptext * sizeof(*screen_imaptext));
    if (!screen_imapsteps)
    {
        return false;
    }

    for (i = 0; i < screen_nbr_imaptext; ++i)
    {
        if (!loadString(fp, (char **)(&(screen_imaptext[i])), 0xFE))
        {
            return false;
        }
    }
    return true;
}
コード例 #9
0
ファイル: filein.c プロジェクト: pukulsesuatu/max6-sdk
void filein_access(t_filein *x, t_symbol *s, short ac, t_atom *av)
{
	OSErr err;
	Byte data[8];
	long count;
	unsigned long dummy;
	
	if (s==ps_int)
		count = 1;
	else if (s==ps_in1)
		count = 2;
	else
		count = 4;
	err = sysfile_setpos(x->f_fh,SYSFILE_FROMSTART,av->a_w.w_long);
	if (err)
		object_error((t_object *)x, "seek err %d",err);
	else {
		err = sysfile_read(x->f_fh,&count,data);
		if (err)
			object_error((t_object *)x, "read err %d",err);
		else {
			if (count==1)
				dummy = data[0];
			else
				sysmem_copyptr(data,&dummy,count);
			outlet_int(x->f_out,dummy);
		}
	}
}
コード例 #10
0
ファイル: syscall.c プロジェクト: Aresthu/ucore_plus
static uint32_t sys_read(uint32_t arg[])
{
	int fd = (int)arg[0];
	void *base = (void *)arg[1];
	size_t len = (size_t) arg[2];
	return sysfile_read(fd, base, len);
}
コード例 #11
0
ファイル: resources.c プロジェクト: foolsh/xrick
static bool loadResourceMaps(file_t fp)
{
    size_t i;
    U16 u16Temp;
    resource_map_t dataTemp;

    if (sysfile_read(fp, &u16Temp, sizeof(u16Temp), 1) != 1)
    {
        return false;
    }
    map_nbr_maps = letoh16(u16Temp);

    map_maps = sysmem_push(map_nbr_maps * sizeof(*map_maps));
    if (!map_maps)
    {
        return false;
    }

    for (i = 0; i < map_nbr_maps; ++i)
    {
#ifdef ENABLE_SOUND
        sound_t **soundTemp;
#endif
        if (sysfile_read(fp, &dataTemp, sizeof(dataTemp), 1) != 1)
        {
            return false;
        }
        memcpy(&u16Temp, dataTemp.x, sizeof(U16));
        map_maps[i].x = letoh16(u16Temp);
        memcpy(&u16Temp, dataTemp.y, sizeof(U16));
        map_maps[i].y = letoh16(u16Temp);
        memcpy(&u16Temp, dataTemp.row, sizeof(U16));
        map_maps[i].row = letoh16(u16Temp);
        memcpy(&u16Temp, dataTemp.submap, sizeof(U16));
        map_maps[i].submap = letoh16(u16Temp);
#ifdef ENABLE_SOUND
        memcpy(&u16Temp, dataTemp.tuneId, sizeof(U16));
        if (!fromResourceIdToSound(letoh16(u16Temp), &soundTemp))
        {
            return false;
        }
        map_maps[i].tune = *soundTemp;
#endif /* ENABLE_SOUND */
    }
    return true;
}
コード例 #12
0
ファイル: resources.c プロジェクト: foolsh/xrick
static bool loadPicture(file_t fp, pic_t ** picture)
{
    U16 u16Temp;
    size_t i, pixelWords32b;
    resource_pic_t dataTemp;
    pic_t * picTemp;

    picTemp = sysmem_push(sizeof(*picTemp));
    *picture = picTemp;
    if (!picTemp)
    {
        return false;
    }

    if (sysfile_read(fp, &dataTemp, sizeof(dataTemp), 1) != 1)
    {
        return false;
    }
    memcpy(&u16Temp, dataTemp.width, sizeof(U16));
    picTemp->width = letoh16(u16Temp);
    memcpy(&u16Temp, dataTemp.height, sizeof(U16));
    picTemp->height = letoh16(u16Temp);
    memcpy(&u16Temp, dataTemp.xPos, sizeof(U16));
    picTemp->xPos = letoh16(u16Temp);
    memcpy(&u16Temp, dataTemp.yPos, sizeof(U16));
    picTemp->yPos = letoh16(u16Temp);

    pixelWords32b = (picTemp->width * picTemp->height) / 8;  /*we use 4b per pixel*/

    picTemp->pixels = sysmem_push(pixelWords32b * sizeof(U32));
    if (!picTemp->pixels)
    {
        return false;
    }

    for (i = 0; i < pixelWords32b; ++i)
    {
        U32 u32Temp;
        if (sysfile_read(fp, &u32Temp, sizeof(u32Temp), 1) != 1)
        {
            return false;
        }
        picTemp->pixels[i] = letoh32(u32Temp);
    }
    return true;
}
コード例 #13
0
ファイル: resources.c プロジェクト: foolsh/xrick
static bool loadResourceTilesData(file_t fp)
{
    size_t i, j, k;
    U16 u16Temp;

    if (sysfile_read(fp, &u16Temp, sizeof(u16Temp), 1) != 1)
    {
        return false;
    }
    tiles_nbr_banks = letoh16(u16Temp);

    tiles_data = sysmem_push(tiles_nbr_banks * TILES_NBR_TILES * sizeof(*tiles_data));
    if (!tiles_data)
    {
        return false;
    }

    for (i = 0; i < tiles_nbr_banks ; ++i)
    {
        for (j = 0; j < TILES_NBR_TILES; ++j)
        {
            for (k = 0; k < TILES_NBR_LINES ; ++k)
            {
#ifdef GFXPC
                if (sysfile_read(fp, &u16Temp, sizeof(u16Temp), 1) != 1)
                {
                    return false;
                }
                tiles_data[i * TILES_NBR_TILES + j][k] = letoh16(u16Temp);
#endif /* GFXPC */
#ifdef GFXST
                U32 u32Temp;
                if (sysfile_read(fp, &u32Temp, sizeof(u32Temp), 1) != 1)
                {
                    return false;
                }
                tiles_data[i * TILES_NBR_TILES + j][k] = letoh32(u32Temp);
#endif /* GFXST */
            }
        }
    }
    return true;
}
コード例 #14
0
ファイル: proc.c プロジェクト: chyyuu/ucore-arch-arm
static int
load_icode_read(int fd, void *buf, size_t len, off_t offset) {
    int ret;
    if ((ret = sysfile_seek(fd, offset, LSEEK_SET)) != 0) {
        return ret;
    }
    if ((ret = sysfile_read(fd, buf, len)) != len) {
        return (ret < 0) ? ret : -1;
    }
    return 0;
}
コード例 #15
0
ファイル: stdio-sysfile.c プロジェクト: CNMAT/CNMAT-Externs
int fread(void *ptr, size_t size, size_t nmemb, FILE *f) {
	long count = size * nmemb;
	long errorCode;
	
	errorCode = sysfile_read(f, &count, ptr);
	
	if (errorCode != 0) {
		post("sysfile_read error %d - aren't you glad you asked?", errorCode);
	}
	
	return count/size;
}
コード例 #16
0
ファイル: resources.c プロジェクト: foolsh/xrick
static bool loadRawData(file_t fp, void ** buffer, const size_t size, size_t * count)
{
    U16 u16Temp;
    if (sysfile_read(fp, &u16Temp, sizeof(u16Temp), 1) != 1)
    {
        return false;
    }
    *count = letoh16(u16Temp);

    *buffer = sysmem_push((*count) * size);
    if (!(*buffer))
    {
        return false;
    }

    if (sysfile_read(fp, *buffer, size, *count) != (int)(*count))
    {
        return false;
    }
    return true;
}
コード例 #17
0
ファイル: resources.c プロジェクト: foolsh/xrick
static bool checkCrc32(const unsigned id)
{
    int bytesRead;
    U8 tempBuffer[1024];
    U32 expectedCrc32, calculatedCrc32 = MZ_CRC32_INIT;

    file_t fp = sysfile_open(resourceFiles[id]);
    if (fp == NULL)
    {
        sys_error("(resources) unable to open \"%s\"", resourceFiles[id]);
        return false;
    }

    bytesRead = sysfile_read(fp, tempBuffer, sizeof(U32), 1); /* prepare beginning of buffer for the following loop */
    if (bytesRead != 1)
    {
        sys_error("(resources) not enough data for \"%s\"", resourceFiles[id]);
        sysfile_close(fp);
        return false;
    }
    do
    {
        bytesRead = sysfile_read(fp, tempBuffer + sizeof(U32), sizeof(U8), sizeof(tempBuffer) - sizeof(U32));

        calculatedCrc32 = mz_crc32(calculatedCrc32, tempBuffer, bytesRead);

        memcpy(tempBuffer, tempBuffer + bytesRead, sizeof(U32));
    } while (bytesRead == sizeof(tempBuffer) - sizeof(U32));

    sysfile_close(fp);

    memcpy(&expectedCrc32, tempBuffer, sizeof(U32));
    expectedCrc32 = letoh32(expectedCrc32);
    if (expectedCrc32 != calculatedCrc32)
    {
        sys_error("(resources) crc check failed for \"%s\"", resourceFiles[id]);
        return false;
    }
    return true;
}
コード例 #18
0
ファイル: resources.c プロジェクト: foolsh/xrick
static bool loadResourceEntdata(file_t fp)
{
    size_t i;
    U16 u16Temp;
    resource_entdata_t dataTemp;

    if (sysfile_read(fp, &u16Temp, sizeof(u16Temp), 1) != 1)
    {
        return false;
    }
    ent_nbr_entdata = letoh16(u16Temp);

    ent_entdata = sysmem_push(ent_nbr_entdata * sizeof(*ent_entdata));
    if (!ent_entdata)
    {
        return false;
    }

    for (i = 0; i < ent_nbr_entdata; ++i)
    {
        if (sysfile_read(fp, &dataTemp, sizeof(dataTemp), 1) != 1)
        {
            return false;
        }
        ent_entdata[i].w = dataTemp.w;
        ent_entdata[i].h = dataTemp.h;
        memcpy(&u16Temp, dataTemp.spr, sizeof(U16));
        ent_entdata[i].spr = letoh16(u16Temp);
        memcpy(&u16Temp, dataTemp.sni, sizeof(U16));
        ent_entdata[i].sni = letoh16(u16Temp);
        ent_entdata[i].trig_w = dataTemp.trig_w;
        ent_entdata[i].trig_h = dataTemp.trig_h;
        ent_entdata[i].snd = dataTemp.snd;
    }
    return true;
}
コード例 #19
0
ファイル: filein.c プロジェクト: pukulsesuatu/max6-sdk
void filein_open(t_filein *x, char *name)
{
	long size;
	
	if (x->f_spool)
		x->f_open = TRUE;
	else {
		sysfile_geteof(x->f_fh,&size);
		if (!(x->f_data = (Byte **)sysmem_newhandle(size)))
			object_error((t_object *)x, "%s too big to read",name);
		else {
			sysmem_lockhandle((t_handle)x->f_data,1);
			sysfile_read(x->f_fh,&size,*x->f_data);
			x->f_size = size;
		}
		sysfile_close(x->f_fh);
	}
	x->f_spool = FALSE;
}
コード例 #20
0
ファイル: filein.c プロジェクト: pukulsesuatu/max6-sdk
void filein_in2(t_filein *x, long n)		/* long access */
{
	t_atom info;
	unsigned long data[4];
	long count;
	OSErr err;
	
	if (x->f_open) {
		if (isr()) {
			atom_setlong(&info,n);
			defer(x,(method)filein_access,ps_in2,1,&info);
		} else {
			err = sysfile_setpos(x->f_fh,SYSFILE_FROMSTART,n);
			if (err)
				object_error((t_object *)x, "seek err %d",err);
			else {
				count = 4;
				err = sysfile_read(x->f_fh,&count,data);
				if (err)
					object_error((t_object *)x, "read err %d",err);
				else {
					count = data[0];
					outlet_int(x->f_out,count);
				}
			}
		}
	} else if (x->f_data) {
		if (n < 0)
			object_error((t_object *)x, "access out of range");
		else if (n >= x->f_size)
			outlet_bang(x->f_eof);
		else {
		 	sysmem_copyptr(*(x->f_data)+n,data,4L);
		 	outlet_int(x->f_out,data[0]);
		}
	}
}
コード例 #21
0
ファイル: filein.c プロジェクト: pukulsesuatu/max6-sdk
void filein_int(t_filein *x, long n)		/* byte access */
{
	t_atom info;
	Byte data[16];
	long count;
	OSErr err;
	
	if (x->f_open) {
		if (isr()) {
			atom_setlong(&info,n);
			defer(x,(method)filein_access,ps_int,1,&info);
		} else {
			err = sysfile_setpos(x->f_fh,SYSFILE_FROMSTART,n);
			if (err)
				object_error((t_object *)x, "seek err %d",err);
			else {
				count = 1;
				err = sysfile_read(x->f_fh,&count,data);
				if (err)
					object_error((t_object *)x, "read err %d",err);
				else {
					count = data[0];
					outlet_int(x->f_out,count);
				}
			}
		}
	} else if (x->f_data) {
		if (n < 0)
			object_error((t_object *)x, "access out of range");
		else if (n >= x->f_size)
			outlet_bang(x->f_eof);
		else {
		 	count = *((*(x->f_data))+n);
		 	outlet_int(x->f_out,count);
		}
	}
}
コード例 #22
0
ファイル: resources.c プロジェクト: foolsh/xrick
static bool loadSound(const unsigned id)
{
    sound_t ** sound;
    file_t fp;
    wave_header_t header;
    U16 u16Temp;
    U32 u32Temp;
    int bytesRead;
    bool isHeaderValid;

    if (!fromResourceIdToSound(id, &sound))
    {
        return false;
    }

    *sound = sysmem_push(sizeof(**sound));
    if (!*sound)
    {
        return false;
    }

    (*sound)->buf = NULL;
    (*sound)->dispose = true; /* sounds are "fire and forget" by default */

    (*sound)->name = u_strdup(resourceFiles[id]);
    if (!(*sound)->name)
    {
        return false;
    }

    fp = sysfile_open(resourceFiles[id]);
    if (!fp)
    {
        sys_error("(resources) unable to open \"%s\"", resourceFiles[id]);
        return false;
    }

    bytesRead = sysfile_read(fp, &header, sizeof(header), 1);
    sysfile_close(fp);
    if (bytesRead != 1)
    {
        sys_error("(resources) unable to read WAVE header from \"%s\"", resourceFiles[id]);
        return false;
    }

    isHeaderValid = false;
    for (;;)
    {
        if (memcmp(header.riffChunkId, "RIFF", 4) ||
            memcmp(header.riffType, "WAVE", 4) ||
            memcmp(header.formatChunkId, "fmt ", 4) ||
            memcmp(header.dataChunkId, "data", 4))
        {
            break;
        }
        memcpy(&u16Temp, header.audioFormat, sizeof(u16Temp));
        if (letoh16(u16Temp) != Wave_AUDIO_FORMAT)
        {
            break;
        }
        memcpy(&u16Temp, header.channelCount, sizeof(u16Temp));
        if (letoh16(u16Temp) != Wave_CHANNEL_COUNT)
        {
            break;
        }
        memcpy(&u32Temp, header.sampleRate, sizeof(u32Temp));
        if (letoh32(u32Temp) != Wave_SAMPLE_RATE)
        {
            isHeaderValid = false;
            break;
        }
        memcpy(&u16Temp, header.bitsPerSample, sizeof(u16Temp));
        if (letoh16(u16Temp) != Wave_BITS_PER_SAMPLE)
        {
            isHeaderValid = false;
            break;
        }

        memcpy(&u32Temp, header.dataChunkSize, sizeof(u32Temp));
        (*sound)->len = letoh32(u32Temp);

        isHeaderValid = true;
        break;
    }
    if (!isHeaderValid)
    {
        sys_error("(resources) incompatible WAVE header for \"%s\"", resourceFiles[id]);
        return false;
    }
    return true;
}