diff options
author | Lennart Poettering <lennart@poettering.net> | 2010-02-18 01:54:51 +0100 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2010-02-18 01:54:51 +0100 |
commit | 19fa81bf1375032cb1a27c7715a28a52b238d4cb (patch) | |
tree | 4a8fccbb63df94cfbfbdf37ce0b296ba2ebeaef9 | |
parent | 5e2af2d3f3dea473d46b33a5e90a993ac5da3f35 (diff) |
pacat: always fully fulfill write requests
Make sure we always fulfill write requests from the server. If we don't
the server won't ask us again and playback will stay stuck.
https://tango.0pointer.de/pipermail/pulseaudio-discuss/2010-February/006611.html
-rw-r--r-- | src/utils/pacat.c | 47 |
1 files changed, 30 insertions, 17 deletions
diff --git a/src/utils/pacat.c b/src/utils/pacat.c index a5d2e9a6..d136f6b3 100644 --- a/src/utils/pacat.c +++ b/src/utils/pacat.c @@ -195,28 +195,41 @@ static void stream_write_callback(pa_stream *s, size_t length, void *userdata) { pa_assert(sndfile); - if (pa_stream_begin_write(s, &data, &length) < 0) { - pa_log(_("pa_stream_begin_write() failed: %s"), pa_strerror(pa_context_errno(context))); - quit(1); - return; - } + for (;;) { + size_t data_length = length; - if (readf_function) { - size_t k = pa_frame_size(&sample_spec); + if (pa_stream_begin_write(s, &data, &data_length) < 0) { + pa_log(_("pa_stream_begin_write() failed: %s"), pa_strerror(pa_context_errno(context))); + quit(1); + return; + } - if ((bytes = readf_function(sndfile, data, (sf_count_t) (length/k))) > 0) - bytes *= (sf_count_t) k; + if (readf_function) { + size_t k = pa_frame_size(&sample_spec); - } else - bytes = sf_read_raw(sndfile, data, (sf_count_t) length); + if ((bytes = readf_function(sndfile, data, (sf_count_t) (data_length/k))) > 0) + bytes *= (sf_count_t) k; - if (bytes > 0) - pa_stream_write(s, data, (size_t) bytes, NULL, 0, PA_SEEK_RELATIVE); - else - pa_stream_cancel_write(s); + } else + bytes = sf_read_raw(sndfile, data, (sf_count_t) data_length); - if (bytes < (sf_count_t) length) - start_drain(); + if (bytes > 0) + pa_stream_write(s, data, (size_t) bytes, NULL, 0, PA_SEEK_RELATIVE); + else + pa_stream_cancel_write(s); + + /* EOF? */ + if (bytes < (sf_count_t) data_length) { + start_drain(); + break; + } + + /* Request fulfilled */ + if ((size_t) bytes >= length) + break; + + length -= bytes; + } } } |