mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-10-29 05:40:27 -04:00
alsa: Move ctl sources to a main loop
It doesn't make sense to hang these on the data loop, so let's have these on the main loop instead. Also avoids a potential crash while removing them (since removal happens on the main loop and the data loop might be polling while we're doing the remove).
This commit is contained in:
parent
bb82ddb601
commit
dec1102574
4 changed files with 13 additions and 2 deletions
|
|
@ -873,7 +873,12 @@ impl_init(const struct spa_handle_factory *factory,
|
|||
|
||||
this->data_system = spa_support_find(support, n_support, SPA_TYPE_INTERFACE_DataSystem);
|
||||
this->data_loop = spa_support_find(support, n_support, SPA_TYPE_INTERFACE_DataLoop);
|
||||
this->main_loop = spa_support_find(support, n_support, SPA_TYPE_INTERFACE_Loop);
|
||||
|
||||
if (this->main_loop == NULL) {
|
||||
spa_log_error(this->log, "a main loop is needed");
|
||||
return -EINVAL;
|
||||
}
|
||||
if (this->data_loop == NULL) {
|
||||
spa_log_error(this->log, "a data loop is needed");
|
||||
return -EINVAL;
|
||||
|
|
|
|||
|
|
@ -829,7 +829,12 @@ impl_init(const struct spa_handle_factory *factory,
|
|||
|
||||
this->data_system = spa_support_find(support, n_support, SPA_TYPE_INTERFACE_DataSystem);
|
||||
this->data_loop = spa_support_find(support, n_support, SPA_TYPE_INTERFACE_DataLoop);
|
||||
this->main_loop = spa_support_find(support, n_support, SPA_TYPE_INTERFACE_Loop);
|
||||
|
||||
if (this->main_loop == NULL) {
|
||||
spa_log_error(this->log, "a main loop is needed");
|
||||
return -EINVAL;
|
||||
}
|
||||
if (this->data_loop == NULL) {
|
||||
spa_log_error(this->log, "%p: a data loop is needed", this);
|
||||
return -EINVAL;
|
||||
|
|
|
|||
|
|
@ -706,7 +706,7 @@ static void bind_ctls_for_params(struct state *state)
|
|||
state->ctl_sources[i].fd = pfds[i].fd;
|
||||
state->ctl_sources[i].mask = SPA_IO_IN;
|
||||
state->ctl_sources[i].rmask = 0;
|
||||
spa_loop_add_source(state->data_loop, &state->ctl_sources[i]);
|
||||
spa_loop_add_source(state->main_loop, &state->ctl_sources[i]);
|
||||
}
|
||||
|
||||
for (unsigned int i = 0; i < state->num_bind_ctls; i++) {
|
||||
|
|
@ -839,7 +839,7 @@ int spa_alsa_clear(struct state *state)
|
|||
|
||||
if (state->ctl) {
|
||||
for (int i = 0; i < state->ctl_n_fds; i++) {
|
||||
spa_loop_remove_source(state->data_loop, &state->ctl_sources[i]);
|
||||
spa_loop_remove_source(state->main_loop, &state->ctl_sources[i]);
|
||||
}
|
||||
|
||||
snd_ctl_close(state->ctl);
|
||||
|
|
|
|||
|
|
@ -105,6 +105,7 @@ struct state {
|
|||
struct spa_log *log;
|
||||
struct spa_system *data_system;
|
||||
struct spa_loop *data_loop;
|
||||
struct spa_loop *main_loop;
|
||||
|
||||
FILE *log_file;
|
||||
struct spa_ratelimit rate_limit;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue