summaryrefslogtreecommitdiffstats
path: root/src/pulsecore/protocol-native.c
diff options
context:
space:
mode:
authorDavid Henningsson <david.henningsson@canonical.com>2010-12-06 16:25:25 +0100
committerColin Guthrie <cguthrie@mandriva.org>2011-01-31 11:38:17 +0000
commitfe7b972487bfc85940d2d427096fd9189af3bd7a (patch)
treeee5efb8c402970bd641fef9e2645947305837faa /src/pulsecore/protocol-native.c
parent1250b5d735129c3e04c45484f80f99cdb12f39a1 (diff)
Fighting rewinds: Seek and write data in the same message
Allow a message in the queue to perform both a seek and a post data. For clients that do not use PA_SEEK_RELATIVE (e g gstreamer), this cuts the message count - and sometimes even the rewinds - in half. Signed-off-by: David Henningsson <david.henningsson@canonical.com>
Diffstat (limited to 'src/pulsecore/protocol-native.c')
-rw-r--r--src/pulsecore/protocol-native.c20
1 files changed, 12 insertions, 8 deletions
diff --git a/src/pulsecore/protocol-native.c b/src/pulsecore/protocol-native.c
index 3943e83e..adadbff7 100644
--- a/src/pulsecore/protocol-native.c
+++ b/src/pulsecore/protocol-native.c
@@ -1352,6 +1352,7 @@ static void flush_write_no_account(pa_memblockq *q) {
static int sink_input_process_msg(pa_msgobject *o, int code, void *userdata, int64_t offset, pa_memchunk *chunk) {
pa_sink_input *i = PA_SINK_INPUT(o);
playback_stream *s;
+ int64_t windex_seek = 0;
pa_sink_input_assert_ref(i);
s = PLAYBACK_STREAM(i->userdata);
@@ -1360,18 +1361,19 @@ static int sink_input_process_msg(pa_msgobject *o, int code, void *userdata, int
switch (code) {
case SINK_INPUT_MESSAGE_SEEK: {
- int64_t windex;
- windex = pa_memblockq_get_write_index(s->memblockq);
+ windex_seek = pa_memblockq_get_write_index(s->memblockq);
/* The client side is incapable of accounting correctly
* for seeks of a type != PA_SEEK_RELATIVE. We need to be
* able to deal with that. */
pa_memblockq_seek(s->memblockq, offset, PA_PTR_TO_UINT(userdata), PA_PTR_TO_UINT(userdata) == PA_SEEK_RELATIVE);
-
- handle_seek(s, windex);
- return 0;
+ if (!chunk) {
+ handle_seek(s, windex_seek);
+ return 0;
+ }
+ /* else fall through and write some data */
}
case SINK_INPUT_MESSAGE_POST_DATA: {
@@ -1380,6 +1382,8 @@ static int sink_input_process_msg(pa_msgobject *o, int code, void *userdata, int
pa_assert(chunk);
windex = pa_memblockq_get_write_index(s->memblockq);
+ if (code == SINK_INPUT_MESSAGE_SEEK)
+ windex = PA_MIN(windex, windex_seek);
/* pa_log("sink input post: %lu %lli", (unsigned long) chunk->length, (long long) windex); */
@@ -4466,9 +4470,9 @@ static void pstream_memblock_callback(pa_pstream *p, uint32_t channel, int64_t o
if (chunk->memblock) {
if (seek != PA_SEEK_RELATIVE || offset != 0)
- pa_asyncmsgq_post(ps->sink_input->sink->asyncmsgq, PA_MSGOBJECT(ps->sink_input), SINK_INPUT_MESSAGE_SEEK, PA_UINT_TO_PTR(seek), offset, NULL, NULL);
-
- pa_asyncmsgq_post(ps->sink_input->sink->asyncmsgq, PA_MSGOBJECT(ps->sink_input), SINK_INPUT_MESSAGE_POST_DATA, NULL, 0, chunk, NULL);
+ pa_asyncmsgq_post(ps->sink_input->sink->asyncmsgq, PA_MSGOBJECT(ps->sink_input), SINK_INPUT_MESSAGE_SEEK, PA_UINT_TO_PTR(seek), offset, chunk, NULL);
+ else
+ pa_asyncmsgq_post(ps->sink_input->sink->asyncmsgq, PA_MSGOBJECT(ps->sink_input), SINK_INPUT_MESSAGE_POST_DATA, NULL, 0, chunk, NULL);
} else
pa_asyncmsgq_post(ps->sink_input->sink->asyncmsgq, PA_MSGOBJECT(ps->sink_input), SINK_INPUT_MESSAGE_SEEK, PA_UINT_TO_PTR(seek), offset+chunk->length, NULL, NULL);