diff options
author | Max Kellermann <max@duempel.org> | 2009-02-23 09:29:56 +0100 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2009-02-23 09:29:56 +0100 |
commit | 5a898c15e79ab87d2466e61549fcc20ce115c67e (patch) | |
tree | cb65b88718b0b8f3cf05221816b193833c41fe8a /src/output/ao_plugin.c | |
parent | d50a3d513eb0452e762f1e4eeb717318958cd83c (diff) | |
download | mpd-5a898c15e79ab87d2466e61549fcc20ce115c67e.tar.gz mpd-5a898c15e79ab87d2466e61549fcc20ce115c67e.tar.xz mpd-5a898c15e79ab87d2466e61549fcc20ce115c67e.zip |
output_api: play() returns a length
The old API required an output plugin to not return until all data
passed to the play() method is consumed. Some output plugins have to
loop to fulfill that requirement, and may block during that. Simplify
these, by letting them consume only part of the buffer: make play()
return the length of the consumed data.
Diffstat (limited to '')
-rw-r--r-- | src/output/ao_plugin.c | 20 |
1 files changed, 7 insertions, 13 deletions
diff --git a/src/output/ao_plugin.c b/src/output/ao_plugin.c index b0662d7a1..c9d10174e 100644 --- a/src/output/ao_plugin.c +++ b/src/output/ao_plugin.c @@ -208,29 +208,23 @@ static int ao_play_deconst(ao_device *device, const void *output_samples, return ao_play(device, u.out, num_bytes); } -static bool +static size_t audioOutputAo_play(void *data, const char *playChunk, size_t size) { AoData *ad = (AoData *)data; - size_t chunk_size; if (ad->device == NULL) return false; - while (size > 0) { - chunk_size = ad->writeSize > size - ? size : ad->writeSize; - - if (ao_play_deconst(ad->device, playChunk, chunk_size) == 0) { - audioOutputAo_error("Closing libao device due to play error"); - return false; - } + if (size > ad->writeSize) + size = ad->writeSize; - playChunk += chunk_size; - size -= chunk_size; + if (ao_play_deconst(ad->device, playChunk, size) == 0) { + audioOutputAo_error("Closing libao device due to play error"); + return 0; } - return true; + return size; } const struct audio_output_plugin aoPlugin = { |