From a71136be527ad07e6305a562e6a22e33de8aab01 Mon Sep 17 00:00:00 2001 From: Tanu Kaskinen Date: Sat, 4 Jan 2020 11:39:08 +0200 Subject: [PATCH] virtual-source: Don't process the rewind during requesting it The request_rewind() callback of the uplink sink called pa_sink_process_rewind(), which is not allowed. Things are supposed to happen so that first a rewind is requested, and then during the next rtpoll loop the sink will process the request. Calling pa_sink_process_rewind() during the request phase caused a crash. Having a request_rewind() callback is completely unnecessary, because it's only useful for forwarding the request to a downstream sink. In this case there is no downstream sink. I also set max_rewind to 0, because the sink doesn't support rewinding. Fixes: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/issues/775 --- src/modules/module-virtual-source.c | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/src/modules/module-virtual-source.c b/src/modules/module-virtual-source.c index 0c9817813..7f035f6d6 100644 --- a/src/modules/module-virtual-source.c +++ b/src/modules/module-virtual-source.c @@ -151,18 +151,6 @@ static void sink_update_requested_latency_cb(pa_sink *s) { } -/* Called from I/O thread context */ -static void sink_request_rewind_cb(pa_sink *s) { - struct userdata *u; - - pa_sink_assert_ref(s); - pa_assert_se(u = s->userdata); - - /* Do nothing */ - pa_sink_process_rewind(u->sink, 0); - -} - /* Called from I/O thread context */ static int source_process_msg_cb(pa_msgobject *o, int code, void *data, int64_t offset, pa_memchunk *chunk) { struct userdata *u = PA_SOURCE(o)->userdata; @@ -675,7 +663,6 @@ int pa__init(pa_module*m) { u->sink->parent.process_msg = sink_process_msg_cb; u->sink->update_requested_latency = sink_update_requested_latency_cb; - u->sink->request_rewind = sink_request_rewind_cb; u->sink->set_state_in_main_thread = sink_set_state_in_main_thread_cb; u->sink->userdata = u; @@ -685,7 +672,7 @@ int pa__init(pa_module*m) { /* FIXME: no idea what I am doing here */ u->block_usec = BLOCK_USEC; nbytes = pa_usec_to_bytes(u->block_usec, &u->sink->sample_spec); - pa_sink_set_max_rewind(u->sink, nbytes); + pa_sink_set_max_rewind(u->sink, 0); pa_sink_set_max_request(u->sink, nbytes); pa_sink_put(u->sink);