output/openal: use alGetSourcei(AL_BUFFER) to force-unqueue buffers

The implementation of cancel() did not work well: you cannot use
alSourceUnqueueBuffers() to unqueue queued buffers, and our function
openal_unqueue_buffers() left the OpenAL library in a rather undefined
state; nothing was supposed to be queued, but the "filled" variable
was not reset.
This commit is contained in:
Max Kellermann 2011-12-13 21:45:26 +01:00
parent c0070b2f13
commit e735abe334
2 changed files with 5 additions and 14 deletions

1
NEWS
View File

@ -16,6 +16,7 @@ ver 0.17 (2011/??/??)
- dsdiff: new decoder plugin
* output:
- httpd: support for streaming to a DLNA client
- openal: improve buffer cancellation
- osx: allow user to specify other audio devices
- raop: new output plugin
- shout: add possibility to set url

View File

@ -109,19 +109,6 @@ openal_setup_context(struct openal_data *od,
return true;
}
static void
openal_unqueue_buffers(struct openal_data *od)
{
ALint num;
ALuint buffer;
alGetSourcei(od->source, AL_BUFFERS_QUEUED, &num);
while (num--) {
alSourceUnqueueBuffers(od->source, 1, &buffer);
}
}
static struct audio_output *
openal_init(const struct config_param *param, GError **error_r)
{
@ -256,7 +243,10 @@ openal_cancel(struct audio_output *ao)
od->filled = 0;
alcMakeContextCurrent(od->context);
alSourceStop(od->source);
openal_unqueue_buffers(od);
/* force-unqueue all buffers */
alSourcei(od->source, AL_BUFFER, 0);
od->filled = 0;
}
const struct audio_output_plugin openal_output_plugin = {