1 From ff019936a70262c176a4bd950bc80ab84d2a71b0 Mon Sep 17 00:00:00 2001
2 From: George Kiagiadakis <george.kiagiadakis@collabora.com>
3 Date: Tue, 22 Jun 2021 13:23:22 +0300
4 Subject: [PATCH] alsa plugin: allow specifying a media.role on the virtual
8 aplay -D pipewire:ROLE=Music music.wav
9 aplay -D pipewire:ROLE=Notification notice.wav
11 Upstream-Status: Backport [from master/0.3.31]
13 pipewire-alsa/alsa-plugins/pcm_pipewire.c | 14 +++++++++++++-
14 pipewire-alsa/conf/50-pipewire.conf | 11 ++++++++++-
15 2 files changed, 23 insertions(+), 2 deletions(-)
17 diff --git a/pipewire-alsa/alsa-plugins/pcm_pipewire.c b/pipewire-alsa/alsa-plugins/pcm_pipewire.c
18 index 86792d2c7..6ace1b689 100644
19 --- a/pipewire-alsa/alsa-plugins/pcm_pipewire.c
20 +++ b/pipewire-alsa/alsa-plugins/pcm_pipewire.c
21 @@ -59,6 +59,7 @@ typedef struct {
29 @@ -509,6 +510,9 @@ static int snd_pcm_pipewire_prepare(snd_pcm_ioplug_t *io)
30 pw_properties_set(props, PW_KEY_MEDIA_CATEGORY,
31 io->stream == SND_PCM_STREAM_PLAYBACK ?
32 "Playback" : "Capture");
33 + if (pw->role != NULL &&
34 + pw_properties_get(props, PW_KEY_MEDIA_ROLE) == NULL)
35 + pw_properties_setf(props, PW_KEY_MEDIA_ROLE, "%s", pw->role);
37 pw->stream = pw_stream_new(pw->core, pw->node_name, props);
38 if (pw->stream == NULL)
39 @@ -958,6 +962,7 @@ static int snd_pcm_pipewire_open(snd_pcm_t **pcmp, const char *name,
40 const char *server_name,
41 const char *playback_node,
42 const char *capture_node,
44 snd_pcm_stream_t stream,
47 @@ -1013,6 +1018,8 @@ static int snd_pcm_pipewire_open(snd_pcm_t **pcmp, const char *name,
48 pw->target = capture_node ? strdup(capture_node) : NULL;
51 + pw->role = (role && *role) ? strdup(role) : NULL;
53 pw->main_loop = pw_thread_loop_new("alsa-pipewire", NULL);
54 if (pw->main_loop == NULL) {
56 @@ -1091,6 +1098,7 @@ SND_PCM_PLUGIN_DEFINE_FUNC(pipewire)
57 const char *server_name = NULL;
58 const char *playback_node = NULL;
59 const char *capture_node = NULL;
60 + const char *role = NULL;
61 snd_pcm_format_t format = SND_PCM_FORMAT_UNKNOWN;
64 @@ -1125,6 +1133,10 @@ SND_PCM_PLUGIN_DEFINE_FUNC(pipewire)
65 snd_config_get_string(n, &capture_node);
68 + if (spa_streq(id, "role")) {
69 + snd_config_get_string(n, &role);
72 if (spa_streq(id, "exclusive")) {
73 if (snd_config_get_bool(n))
74 flags |= PW_STREAM_FLAG_EXCLUSIVE;
75 @@ -1174,7 +1186,7 @@ SND_PCM_PLUGIN_DEFINE_FUNC(pipewire)
78 err = snd_pcm_pipewire_open(pcmp, name, node_name, server_name, playback_node,
79 - capture_node, stream, mode, flags, rate, format,
80 + capture_node, role, stream, mode, flags, rate, format,
81 channels, period_bytes);
84 diff --git a/pipewire-alsa/conf/50-pipewire.conf b/pipewire-alsa/conf/50-pipewire.conf
85 index 2c6f2d259..f7e58472b 100644
86 --- a/pipewire-alsa/conf/50-pipewire.conf
87 +++ b/pipewire-alsa/conf/50-pipewire.conf
89 defaults.pipewire.server "pipewire-0"
90 defaults.pipewire.node "-1"
91 defaults.pipewire.exclusive false
92 +defaults.pipewire.role ""
95 - @args [ SERVER NODE EXCLUSIVE ]
96 + @args [ SERVER NODE EXCLUSIVE ROLE ]
100 @@ -27,6 +28,13 @@ pcm.pipewire {
101 name defaults.pipewire.exclusive
108 + name defaults.pipewire.role
114 @@ -34,6 +42,7 @@ pcm.pipewire {
121 description "PipeWire Sound Server"