aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2011-12-13 21:45:26 +0100
committerMax Kellermann <max@duempel.org>2011-12-13 21:59:10 +0100
commite735abe33481afb51b30be5561d3c5b8a090384a (patch)
treeae0a58e075096e4e591a1bf7f46ef0a7116d0339
parentc0070b2f13b324cb56ef9ccfdb436c85245dd6a6 (diff)
downloadmpd-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.
-rw-r--r--NEWS1
-rw-r--r--src/output/openal_output_plugin.c18
2 files changed, 5 insertions, 14 deletions
diff --git a/NEWS b/NEWS
index 6cb3018fa..4dea05c48 100644
--- a/NEWS
+++ b/NEWS
@@ -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
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 = {