diff options
author | Max Kellermann <max@duempel.org> | 2011-12-13 21:45:26 +0100 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2011-12-13 21:59:10 +0100 |
commit | e735abe33481afb51b30be5561d3c5b8a090384a (patch) | |
tree | ae0a58e075096e4e591a1bf7f46ef0a7116d0339 /src/output/openal_output_plugin.c | |
parent | c0070b2f13b324cb56ef9ccfdb436c85245dd6a6 (diff) | |
download | mpd-e735abe33481afb51b30be5561d3c5b8a090384a.tar.gz mpd-e735abe33481afb51b30be5561d3c5b8a090384a.tar.xz mpd-e735abe33481afb51b30be5561d3c5b8a090384a.zip |
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.
Diffstat (limited to 'src/output/openal_output_plugin.c')
-rw-r--r-- | src/output/openal_output_plugin.c | 18 |
1 files changed, 4 insertions, 14 deletions
diff --git a/src/output/openal_output_plugin.c b/src/output/openal_output_plugin.c index 016189ae3..6f2c049b8 100644 --- a/src/output/openal_output_plugin.c +++ b/src/output/openal_output_plugin.c @@ -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 = { |