iOS: Fix Source:play+stop+play and Source:play+seek, for streaming sources. Resolves issue #1484.

This commit is contained in:
Alex Szpakowski
2019-04-24 00:10:22 -03:00
parent 14abf2c9e8
commit 9d4cb2a949
+16 -15
View File
@@ -876,31 +876,32 @@ void Source::teardownAtomic()
break; break;
case TYPE_STREAM: case TYPE_STREAM:
{ {
ALint queued; ALint queued = 0;
ALuint buffer; ALuint buffers[MAX_BUFFERS];
decoder->seek(0); decoder->seek(0);
// drain buffers
//since we only unqueue 1 buffer, it's OK to use singular variable pointer instead of array // Drain buffers.
// NOTE: The Apple implementation of OpenAL on iOS doesn't return
// correct buffer ids for single alSourceUnqueueBuffers calls past the
// first queued buffer, so we must unqueue them all at once.
alGetSourcei(source, AL_BUFFERS_QUEUED, &queued); alGetSourcei(source, AL_BUFFERS_QUEUED, &queued);
for (unsigned int i = 0; i < (unsigned int)queued; i++) alSourceUnqueueBuffers(source, queued, buffers);
{
alSourceUnqueueBuffers(source, 1, &buffer); for (int i = 0; i < queued; i++)
unusedBuffers.push(buffer); unusedBuffers.push(buffers[i]);
}
break; break;
} }
case TYPE_QUEUE: case TYPE_QUEUE:
{ {
ALint queued; ALint queued;
ALuint buffer; ALuint buffers[MAX_BUFFERS];
alGetSourcei(source, AL_BUFFERS_QUEUED, &queued); alGetSourcei(source, AL_BUFFERS_QUEUED, &queued);
for (unsigned int i = (unsigned int)queued; i > 0; i--) alSourceUnqueueBuffers(source, queued, buffers);
{
alSourceUnqueueBuffers(source, 1, &buffer); for (int i = 0; i < queued; i++)
unusedBuffers.push(buffer); unusedBuffers.push(buffers[i]);
}
break; break;
} }
case TYPE_MAX_ENUM: case TYPE_MAX_ENUM: