mirror of
https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
synced 2025-10-29 05:40:23 -04:00
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>
This commit is contained in:
parent
1250b5d735
commit
fe7b972487
1 changed files with 12 additions and 8 deletions
|
|
@ -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,19 +1361,20 @@ 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);
|
||||
if (!chunk) {
|
||||
handle_seek(s, windex_seek);
|
||||
return 0;
|
||||
}
|
||||
/* else fall through and write some data */
|
||||
}
|
||||
|
||||
case SINK_INPUT_MESSAGE_POST_DATA: {
|
||||
int64_t windex;
|
||||
|
|
@ -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,8 +4470,8 @@ 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_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);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue