Several virtual sources and sinks apart from module-echo-cancel also query the master sink or source to estimate the current latency. Those modules might potentially show the bug that is described for module-echo-cancel in bug 100277. This patch checks in the message handlers for the PA_{SINK,SOURCE}_MESSAGE_GET_LATENCY if the master sink or source is valid and returns 0 as latency if not. --- src/modules/module-ladspa-sink.c | 3 ++- src/modules/module-remap-sink.c | 3 ++- src/modules/module-remap-source.c | 3 ++- src/modules/module-virtual-sink.c | 3 ++- src/modules/module-virtual-source.c | 3 ++- src/modules/module-virtual-surround-sink.c | 3 ++- 6 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/modules/module-ladspa-sink.c b/src/modules/module-ladspa-sink.c index 7b2e651f..86ab4a6f 100644 --- a/src/modules/module-ladspa-sink.c +++ b/src/modules/module-ladspa-sink.c @@ -347,7 +347,8 @@ static int sink_process_msg_cb(pa_msgobject *o, int code, void *data, int64_t of * make sure we don't access it in that time. Also, the * sink input is first shut down, the sink second. */ if (!PA_SINK_IS_LINKED(u->sink->thread_info.state) || - !PA_SINK_INPUT_IS_LINKED(u->sink_input->thread_info.state)) { + !PA_SINK_INPUT_IS_LINKED(u->sink_input->thread_info.state) || + !u->sink_input->sink) { *((int64_t*) data) = 0; return 0; } diff --git a/src/modules/module-remap-sink.c b/src/modules/module-remap-sink.c index 37f4f56c..534874d7 100644 --- a/src/modules/module-remap-sink.c +++ b/src/modules/module-remap-sink.c @@ -83,7 +83,8 @@ static int sink_process_msg(pa_msgobject *o, int code, void *data, int64_t offse /* The sink is _put() before the sink input is, so let's * make sure we don't access it yet */ if (!PA_SINK_IS_LINKED(u->sink->thread_info.state) || - !PA_SINK_INPUT_IS_LINKED(u->sink_input->thread_info.state)) { + !PA_SINK_INPUT_IS_LINKED(u->sink_input->thread_info.state) || + !u->sink_input->sink) { *((int64_t*) data) = 0; return 0; } diff --git a/src/modules/module-remap-source.c b/src/modules/module-remap-source.c index 0bdeb381..25772ecd 100644 --- a/src/modules/module-remap-source.c +++ b/src/modules/module-remap-source.c @@ -91,7 +91,8 @@ static int source_process_msg_cb(pa_msgobject *o, int code, void *data, int64_t * make sure we don't access it in that time. Also, the * source output is first shut down, the source second. */ if (!PA_SOURCE_IS_LINKED(u->source->thread_info.state) || - !PA_SOURCE_OUTPUT_IS_LINKED(u->source_output->thread_info.state)) { + !PA_SOURCE_OUTPUT_IS_LINKED(u->source_output->thread_info.state) || + !u->source_output->source) { *((int64_t*) data) = 0; return 0; } diff --git a/src/modules/module-virtual-sink.c b/src/modules/module-virtual-sink.c index 4fa4a56e..6175ca8e 100644 --- a/src/modules/module-virtual-sink.c +++ b/src/modules/module-virtual-sink.c @@ -94,7 +94,8 @@ static int sink_process_msg_cb(pa_msgobject *o, int code, void *data, int64_t of * make sure we don't access it in that time. Also, the * sink input is first shut down, the sink second. */ if (!PA_SINK_IS_LINKED(u->sink->thread_info.state) || - !PA_SINK_INPUT_IS_LINKED(u->sink_input->thread_info.state)) { + !PA_SINK_INPUT_IS_LINKED(u->sink_input->thread_info.state) || + !u->sink_input->sink) { *((int64_t*) data) = 0; return 0; } diff --git a/src/modules/module-virtual-source.c b/src/modules/module-virtual-source.c index 42aefd05..dd0b40e1 100644 --- a/src/modules/module-virtual-source.c +++ b/src/modules/module-virtual-source.c @@ -175,7 +175,8 @@ static int source_process_msg_cb(pa_msgobject *o, int code, void *data, int64_t * make sure we don't access it in that time. Also, the * source output is first shut down, the source second. */ if (!PA_SOURCE_IS_LINKED(u->source->thread_info.state) || - !PA_SOURCE_OUTPUT_IS_LINKED(u->source_output->thread_info.state)) { + !PA_SOURCE_OUTPUT_IS_LINKED(u->source_output->thread_info.state) || + !u->source_output->source) { *((pa_usec_t*) data) = 0; return 0; } diff --git a/src/modules/module-virtual-surround-sink.c b/src/modules/module-virtual-surround-sink.c index 23c6bdc5..94ea9f4a 100644 --- a/src/modules/module-virtual-surround-sink.c +++ b/src/modules/module-virtual-surround-sink.c @@ -122,7 +122,8 @@ static int sink_process_msg_cb(pa_msgobject *o, int code, void *data, int64_t of * make sure we don't access it in that time. Also, the * sink input is first shut down, the sink second. */ if (!PA_SINK_IS_LINKED(u->sink->thread_info.state) || - !PA_SINK_INPUT_IS_LINKED(u->sink_input->thread_info.state)) { + !PA_SINK_INPUT_IS_LINKED(u->sink_input->thread_info.state) || + !u->sink_input->sink) { *((int64_t*) data) = 0; return 0; } -- 2.11.0