snd_mp3.c (mp3_startread): don't error upon a short read

as it may be a short but still a valid file.


git-svn-id: http://svn.code.sf.net/p/quakespasm/code/trunk/quakespasm@860 af15c1b1-3010-417e-b628-4374ebc0bcbd
This commit is contained in:
sezero 2013-07-23 17:01:20 +00:00
parent aad0ec327a
commit 6d340ff733

View file

@ -8,7 +8,7 @@
* functions were adapted from the GPL-licensed libid3tag library, see at * functions were adapted from the GPL-licensed libid3tag library, see at
* http://www.underbit.com/products/mad/. Adapted to Quake and Hexen II * http://www.underbit.com/products/mad/. Adapted to Quake and Hexen II
* game engines by O.Sezer : * game engines by O.Sezer :
* Copyright (C) 2010-2012 O.Sezer <sezero@users.sourceforge.net> * Copyright (C) 2010-2013 O.Sezer <sezero@users.sourceforge.net>
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -49,7 +49,7 @@ static mad_timer_t const mad_timer_zero_stub = {0, 0};
not certain that all of them are meaningful. Default to 16 bits to not certain that all of them are meaningful. Default to 16 bits to
align with most users expectation of output file should be 16 bits. */ align with most users expectation of output file should be 16 bits. */
#define MP3_MAD_SAMPLEBITS 16 #define MP3_MAD_SAMPLEBITS 16
#define MP3_MAD_SAMPLEWIDTH (MP3_MAD_SAMPLEBITS / 8) #define MP3_MAD_SAMPLEWIDTH 2
#define MP3_BUFFER_SIZE (5 * 8192) #define MP3_BUFFER_SIZE (5 * 8192)
/* Private data */ /* Private data */
@ -67,7 +67,7 @@ typedef struct _mp3_priv_t
/* This function merges the functions tagtype() and id3_tag_query() /* This function merges the functions tagtype() and id3_tag_query()
* from MAD's libid3tag, so we don't have to link to it * from MAD's libid3tag, so we don't have to link to it
* Returns 0 if the frame is not an ID3 tag, tag length if it is */ * Returns 0 if the frame is not an ID3 tag, tag length if it is */
static qboolean tag_is_id3v1(const unsigned char *data, size_t length) static inline qboolean tag_is_id3v1(const unsigned char *data, size_t length)
{ {
if (length >= 3 && if (length >= 3 &&
data[0] == 'T' && data[1] == 'A' && data[2] == 'G') data[0] == 'T' && data[1] == 'A' && data[2] == 'G')
@ -77,7 +77,7 @@ static qboolean tag_is_id3v1(const unsigned char *data, size_t length)
return false; return false;
} }
static qboolean tag_is_id3v2(const unsigned char *data, size_t length) static inline qboolean tag_is_id3v2(const unsigned char *data, size_t length)
{ {
if (length >= 10 && if (length >= 10 &&
(data[0] == 'I' && data[1] == 'D' && data[2] == '3') && (data[0] == 'I' && data[1] == 'D' && data[2] == '3') &&
@ -174,9 +174,7 @@ static int mp3_inputdata(snd_stream_t *stream)
bytes_read = FS_fread(p->mp3_buffer + remaining, 1, bytes_read = FS_fread(p->mp3_buffer + remaining, 1,
MP3_BUFFER_SIZE - remaining, &stream->fh); MP3_BUFFER_SIZE - remaining, &stream->fh);
if (bytes_read == 0) if (bytes_read == 0)
{
return -1; return -1;
}
mad_stream_buffer(&p->Stream, p->mp3_buffer, bytes_read+remaining); mad_stream_buffer(&p->Stream, p->mp3_buffer, bytes_read+remaining);
p->Stream.error = MAD_ERROR_NONE; p->Stream.error = MAD_ERROR_NONE;
@ -199,11 +197,8 @@ static int mp3_startread(snd_stream_t *stream)
* can be processed later. * can be processed later.
*/ */
ReadSize = FS_fread(p->mp3_buffer, 1, MP3_BUFFER_SIZE, &stream->fh); ReadSize = FS_fread(p->mp3_buffer, 1, MP3_BUFFER_SIZE, &stream->fh);
if (ReadSize != MP3_BUFFER_SIZE) if (!ReadSize || FS_ferror(&stream->fh))
{ return -1;
if (FS_feof(&stream->fh) || FS_ferror(&stream->fh))
return -1;
}
mad_stream_buffer(&p->Stream, p->mp3_buffer, ReadSize); mad_stream_buffer(&p->Stream, p->mp3_buffer, ReadSize);
@ -218,7 +213,7 @@ static int mp3_startread(snd_stream_t *stream)
if (p->Stream.error == MAD_ERROR_BUFLEN) if (p->Stream.error == MAD_ERROR_BUFLEN)
{ {
if (mp3_inputdata(stream) == -1) if (mp3_inputdata(stream) == -1)
return -1; return -1;/* EOF with no valid data */
continue; continue;
} }