From f22dd9d781770d052f07e336345d8d964384be62 Mon Sep 17 00:00:00 2001 From: Jonas Holmberg Date: Tue, 7 Sep 2021 16:04:04 +0200 Subject: [PATCH] pipewire-alsa: Make it MT safe Make pipewire-alsa MT safe so that multi threaded programs can use it without any extra locks. --- pipewire-alsa/alsa-plugins/pcm_pipewire.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/pipewire-alsa/alsa-plugins/pcm_pipewire.c b/pipewire-alsa/alsa-plugins/pcm_pipewire.c index 48583165c..13c8494c5 100644 --- a/pipewire-alsa/alsa-plugins/pcm_pipewire.c +++ b/pipewire-alsa/alsa-plugins/pcm_pipewire.c @@ -33,6 +33,8 @@ #include #include +#include + #include #include @@ -54,6 +56,8 @@ #define MIN_PERIOD 64 +static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; + typedef struct { snd_pcm_ioplug_t io; @@ -159,7 +163,9 @@ static int snd_pcm_pipewire_close(snd_pcm_ioplug_t *io) { snd_pcm_pipewire_t *pw = io->private_data; pw_log_debug(NAME" %p:", pw); + pthread_mutex_lock(&lock); snd_pcm_pipewire_free(pw); + pthread_mutex_unlock(&lock); return 0; } @@ -1112,10 +1118,6 @@ SND_PCM_PLUGIN_DEFINE_FUNC(pipewire) uint32_t flags = 0; int err; - pw_init(NULL, NULL); - if (strstr(pw_get_library_version(), "0.2") != NULL) - return -ENOTSUP; - snd_config_for_each(i, next, conf) { snd_config_t *n = snd_config_iterator_entry(i); const char *id; @@ -1191,9 +1193,17 @@ SND_PCM_PLUGIN_DEFINE_FUNC(pipewire) return -EINVAL; } + pthread_mutex_lock(&lock); + pw_init(NULL, NULL); + if (strstr(pw_get_library_version(), "0.2") != NULL) { + pthread_mutex_unlock(&lock); + return -ENOTSUP; + } + err = snd_pcm_pipewire_open(pcmp, name, node_name, server_name, playback_node, capture_node, role, stream, mode, flags, rate, format, channels, period_bytes); + pthread_mutex_unlock(&lock); return err; }