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 */
|
uint16 channels; /* number of channels */
|
||||||
uint32 sampleFrames; /* number of sample frames */
|
uint32 sampleFrames; /* number of sample frames */
|
||||||
uint16 sampleSize; /* number of bits per sample */
|
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 */
|
/* this is actually stored as IEEE-754 80bit in files */
|
||||||
} aiff_CommonChunk;
|
} aiff_CommonChunk;
|
||||||
|
|
||||||
@@ -89,7 +89,7 @@ typedef struct
|
|||||||
uint16 channels; /* number of channels */
|
uint16 channels; /* number of channels */
|
||||||
uint32 sampleFrames; /* number of sample frames */
|
uint32 sampleFrames; /* number of sample frames */
|
||||||
uint16 sampleSize; /* number of bits per sample */
|
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 */
|
aiff_ID extTypeID; /* compression type ID */
|
||||||
char extName[32]; /* compression type name */
|
char extName[32]; /* compression type name */
|
||||||
} aiff_ExtCommonChunk;
|
} aiff_ExtCommonChunk;
|
||||||
@@ -595,7 +595,7 @@ aifa_DecodeSDX2 (TFB_AiffSoundDecoder* aifa, void* buf, sint32 bufsize)
|
|||||||
if (dec_pcm > aifa->max_pcm - aifa->cur_pcm)
|
if (dec_pcm > aifa->max_pcm - aifa->cur_pcm)
|
||||||
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);
|
dec_pcm = uio_fread (src, aifa->file_block, dec_pcm, aifa->fp);
|
||||||
aifa->cur_pcm += dec_pcm;
|
aifa->cur_pcm += dec_pcm;
|
||||||
|
|
||||||
|
|||||||
@@ -38,7 +38,7 @@
|
|||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
uint32 id;
|
uint32 id;
|
||||||
sint32 size;
|
uint32 size;
|
||||||
uint32 type;
|
uint32 type;
|
||||||
} wave_FileHeader;
|
} wave_FileHeader;
|
||||||
|
|
||||||
@@ -225,6 +225,7 @@ wava_Open (THIS_PTR, uio_DirHandle *dir, const char *filename)
|
|||||||
TFB_WaveSoundDecoder* wava = (TFB_WaveSoundDecoder*) This;
|
TFB_WaveSoundDecoder* wava = (TFB_WaveSoundDecoder*) This;
|
||||||
wave_FileHeader fileHdr;
|
wave_FileHeader fileHdr;
|
||||||
wave_ChunkHeader chunkHdr;
|
wave_ChunkHeader chunkHdr;
|
||||||
|
long dataLeft;
|
||||||
|
|
||||||
wava->fp = uio_fopen (dir, filename, "rb");
|
wava->fp = uio_fopen (dir, filename, "rb");
|
||||||
if (!wava->fp)
|
if (!wava->fp)
|
||||||
@@ -252,8 +253,8 @@ wava_Open (THIS_PTR, uio_DirHandle *dir, const char *filename)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (fileHdr.size = ((fileHdr.size + 1) & ~1) - 4; fileHdr.size != 0;
|
for (dataLeft = ((fileHdr.size + 1) & ~1) - 4; dataLeft > 0;
|
||||||
fileHdr.size -= (((chunkHdr.size + 1) & ~1) + 8))
|
dataLeft -= (((chunkHdr.size + 1) & ~1) + 8))
|
||||||
{
|
{
|
||||||
if (!wava_readChunkHeader (wava, &chunkHdr))
|
if (!wava_readChunkHeader (wava, &chunkHdr))
|
||||||
{
|
{
|
||||||
@@ -309,6 +310,10 @@ wava_Open (THIS_PTR, uio_DirHandle *dir, const char *filename)
|
|||||||
return false;
|
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 ?
|
This->format = (wava->fmtHdr.channels == 1 ?
|
||||||
(wava->fmtHdr.bitsPerSample == 8 ?
|
(wava->fmtHdr.bitsPerSample == 8 ?
|
||||||
wava_formats->mono8 : wava_formats->mono16)
|
wava_formats->mono8 : wava_formats->mono16)
|
||||||
|
|||||||
Reference in New Issue
Block a user