mirror of
https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
synced 2025-10-29 05:40:23 -04:00
echo-cancel: Don't allow streams to attach while unloading
When unloading, some module may end up trin to move a sink-input or source-output back onto our virtual sink/source, causing an infinite loop of us moving the stream away and having it moved back. We prevent this from happening by preventing any stream from being attached during unload.
This commit is contained in:
parent
fe52c351c3
commit
837ac4c225
1 changed files with 14 additions and 0 deletions
|
|
@ -156,6 +156,7 @@ struct userdata {
|
|||
pa_module *module;
|
||||
|
||||
pa_bool_t autoloaded;
|
||||
pa_bool_t dead;
|
||||
pa_bool_t save_aec;
|
||||
|
||||
pa_echo_canceller *ec;
|
||||
|
|
@ -1162,6 +1163,8 @@ static void source_output_kill_cb(pa_source_output *o) {
|
|||
pa_assert_ctl_context();
|
||||
pa_assert_se(u = o->userdata);
|
||||
|
||||
u->dead = TRUE;
|
||||
|
||||
/* The order here matters! We first kill the source output, followed
|
||||
* by the source. That means the source callbacks must be protected
|
||||
* against an unconnected source output! */
|
||||
|
|
@ -1186,6 +1189,8 @@ static void sink_input_kill_cb(pa_sink_input *i) {
|
|||
pa_sink_input_assert_ref(i);
|
||||
pa_assert_se(u = i->userdata);
|
||||
|
||||
u->dead = TRUE;
|
||||
|
||||
/* The order here matters! We first kill the sink input, followed
|
||||
* by the sink. That means the sink callbacks must be protected
|
||||
* against an unconnected sink input! */
|
||||
|
|
@ -1211,6 +1216,9 @@ static pa_bool_t source_output_may_move_to_cb(pa_source_output *o, pa_source *de
|
|||
pa_assert_ctl_context();
|
||||
pa_assert_se(u = o->userdata);
|
||||
|
||||
if (u->dead)
|
||||
return FALSE;
|
||||
|
||||
return (u->source != dest) && (u->sink != dest->monitor_of);
|
||||
}
|
||||
|
||||
|
|
@ -1221,6 +1229,9 @@ static pa_bool_t sink_input_may_move_to_cb(pa_sink_input *i, pa_sink *dest) {
|
|||
pa_sink_input_assert_ref(i);
|
||||
pa_assert_se(u = i->userdata);
|
||||
|
||||
if (u->dead)
|
||||
return FALSE;
|
||||
|
||||
return u->sink != dest;
|
||||
}
|
||||
|
||||
|
|
@ -1362,6 +1373,7 @@ int pa__init(pa_module*m) {
|
|||
u->core = m->core;
|
||||
u->module = m;
|
||||
m->userdata = u;
|
||||
u->dead = FALSE;
|
||||
|
||||
u->ec = pa_xnew0(pa_echo_canceller, 1);
|
||||
if (!u->ec) {
|
||||
|
|
@ -1649,6 +1661,8 @@ void pa__done(pa_module*m) {
|
|||
if (!(u = m->userdata))
|
||||
return;
|
||||
|
||||
u->dead = TRUE;
|
||||
|
||||
/* See comments in source_output_kill_cb() above regarding
|
||||
* destruction order! */
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue