[sdlsound] Unclear on SDL_Sound SOUND_SAMPLEFLAG_EAGAIN
Ryan C. Gordon
icculus at icculus.org
Tue Jan 7 00:30:54 EST 2014
On 01/07/2014 12:01 AM, Greg Toombs wrote:
> Ok. So does that mean that, if a subsequent decode succeeds, it's safe
> to use the whole buffer? In other words, if I see EAGAIN, how do I
> interpret the returned byte count?
The returned byte count from Sound_Decode() is the number of decoded
samples you have to work with. It's never safe to work with the whole
buffer, it's only safe to work with the number of samples Sound_Decode()
reported are in the buffer (which will actually _be_ the whole buffer in
normal conditions).
If it returns less than sample->buffer_size, you're either at the end of
the data or there was a problem...the EOF, ERROR, and EAGAIN flags tell
you which happened: EOF for "no more data," ERROR for "no more data
because something went wrong" and EAGAIN for "no more data, but try
again and there might be."
EAGAIN isn't uncommon; most of the decoders will set it if they get a
short read, because they aren't sure if they're at the end of the buffer
or had a problem and the RWops is just handing over what it managed to
get before reporting a problem. Often times the next attempt to decode
will return zero bytes and an EOF flag.
It's worth noting that this is a lot of explaining for a flag you might
not need. Here's what the playsound_simple.c demo app does:
/* if there wasn't previously an error or EOF, read more. */
if ( ((sample->flags & SOUND_SAMPLEFLAG_ERROR) == 0) &&
((sample->flags & SOUND_SAMPLEFLAG_EOF) == 0) )
{
data->decoded_bytes = Sound_Decode(sample);
data->decoded_ptr = sample->buffer;
} /* if */
It doesn't check EAGAIN...it either got enough data or it didn't, or
there's definitely no more data coming or it needs to keep checking.
--ryan.
More information about the sdlsound
mailing list