Fix signed/unsigned data reads in sound decoders
git-svn-id: svn://svn.code.sf.net/p/sc2/code/trunk@3457 8092fc87-c524-0410-9efc-e669fe64eaf9
This commit is contained in:
@@ -78,7 +78,7 @@ typedef struct
|
||||
uint16 channels; /* number of channels */
|
||||
uint32 sampleFrames; /* number of sample frames */
|
||||
uint16 sampleSize; /* number of bits per sample */
|
||||
uint32 sampleRate; /* number of frames per second */
|
||||
sint32 sampleRate; /* number of frames per second */
|
||||
/* this is actually stored as IEEE-754 80bit in files */
|
||||
} aiff_CommonChunk;
|
||||
|
||||
@@ -89,7 +89,7 @@ typedef struct
|
||||
uint16 channels; /* number of channels */
|
||||
uint32 sampleFrames; /* number of sample frames */
|
||||
uint16 sampleSize; /* number of bits per sample */
|
||||
uint32 sampleRate; /* number of frames per second */
|
||||
sint32 sampleRate; /* number of frames per second */
|
||||
aiff_ID extTypeID; /* compression type ID */
|
||||
char extName[32]; /* compression type name */
|
||||
} aiff_ExtCommonChunk;
|
||||
@@ -595,7 +595,7 @@ aifa_DecodeSDX2 (TFB_AiffSoundDecoder* aifa, void* buf, sint32 bufsize)
|
||||
if (dec_pcm > aifa->max_pcm - aifa->cur_pcm)
|
||||
dec_pcm = aifa->max_pcm - aifa->cur_pcm;
|
||||
|
||||
src = (uint8*)buf + bufsize - (dec_pcm * aifa->file_block);
|
||||
src = (sint8*)buf + bufsize - (dec_pcm * aifa->file_block);
|
||||
dec_pcm = uio_fread (src, aifa->file_block, dec_pcm, aifa->fp);
|
||||
aifa->cur_pcm += dec_pcm;
|
||||
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
typedef struct
|
||||
{
|
||||
uint32 id;
|
||||
sint32 size;
|
||||
uint32 size;
|
||||
uint32 type;
|
||||
} wave_FileHeader;
|
||||
|
||||
@@ -225,6 +225,7 @@ wava_Open (THIS_PTR, uio_DirHandle *dir, const char *filename)
|
||||
TFB_WaveSoundDecoder* wava = (TFB_WaveSoundDecoder*) This;
|
||||
wave_FileHeader fileHdr;
|
||||
wave_ChunkHeader chunkHdr;
|
||||
long dataLeft;
|
||||
|
||||
wava->fp = uio_fopen (dir, filename, "rb");
|
||||
if (!wava->fp)
|
||||
@@ -252,8 +253,8 @@ wava_Open (THIS_PTR, uio_DirHandle *dir, const char *filename)
|
||||
return false;
|
||||
}
|
||||
|
||||
for (fileHdr.size = ((fileHdr.size + 1) & ~1) - 4; fileHdr.size != 0;
|
||||
fileHdr.size -= (((chunkHdr.size + 1) & ~1) + 8))
|
||||
for (dataLeft = ((fileHdr.size + 1) & ~1) - 4; dataLeft > 0;
|
||||
dataLeft -= (((chunkHdr.size + 1) & ~1) + 8))
|
||||
{
|
||||
if (!wava_readChunkHeader (wava, &chunkHdr))
|
||||
{
|
||||
@@ -309,6 +310,10 @@ wava_Open (THIS_PTR, uio_DirHandle *dir, const char *filename)
|
||||
return false;
|
||||
}
|
||||
|
||||
if (dataLeft != 0)
|
||||
log_add (log_Warning, "wava_Open(): bad or unsupported wave file, "
|
||||
"size in header does not match read chunks");
|
||||
|
||||
This->format = (wava->fmtHdr.channels == 1 ?
|
||||
(wava->fmtHdr.bitsPerSample == 8 ?
|
||||
wava_formats->mono8 : wava_formats->mono16)
|
||||
|
||||
Reference in New Issue
Block a user