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/osx_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 'src/output/osx_plugin.c')
-rw-r--r-- | src/output/osx_plugin.c | 45 |
1 files changed, 18 insertions, 27 deletions
diff --git a/src/output/osx_plugin.c b/src/output/osx_plugin.c index a97f56982..ffeb8cd5e 100644 --- a/src/output/osx_plugin.c +++ b/src/output/osx_plugin.c @@ -256,13 +256,11 @@ osx_openDevice(void *data, struct audio_format *audioFormat) return true; } -static bool +static size_t osx_play(void *data, const char *playChunk, size_t size) { OsxData *od = data; - size_t bytesToCopy; - size_t bytes; - size_t curpos; + size_t start, nbytes; if (!od->started) { int err; @@ -270,42 +268,35 @@ osx_play(void *data, const char *playChunk, size_t size) err = AudioOutputUnitStart(od->au); if (err) { g_warning("unable to start audio output: %i\n", err); - return false; + return 0; } } g_mutex_lock(od->mutex); - while (size) { - curpos = od->pos + od->len; - if (curpos >= od->bufferSize) - curpos -= od->bufferSize; + while (od->len >= od->bufferSize) + /* wait for some free space in the buffer */ + g_cond_wait(od->condition, od->mutex); - bytesToCopy = MIN(od->bufferSize, size); + start = od->pos + od->len; + if (start >= od->bufferSize) + start -= od->bufferSize; - while (od->len > od->bufferSize - bytesToCopy) { - g_cond_wait(od->condition, od->mutex); - } + nbytes = start < od->pos + ? od->pos - start + : od->bufferSize - start; - size -= bytesToCopy; - od->len += bytesToCopy; + assert(nbytes > 0); - bytes = od->bufferSize - curpos; - if (bytesToCopy > bytes) { - memcpy(od->buffer + curpos, playChunk, bytes); - curpos = 0; - playChunk += bytes; - bytesToCopy -= bytes; - } - - memcpy(od->buffer + curpos, playChunk, bytesToCopy); - playChunk += bytesToCopy; + if (nbytes > size) + nbytes = size; - } + memcpy(od->buffer + start, playChunk, nbytes); + od->len += nbytes; g_mutex_unlock(od->mutex); - return true; + return nbytes; } const struct audio_output_plugin osxPlugin = { |