pipewire: fix alsa virtual device to work again
[AGL/meta-agl.git] / meta-pipewire / recipes-multimedia / pipewire / pipewire / 0001-alsa-plugin-allow-specifying-a-media.role-on-the-vir.patch
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
5  device name
6
7 So that we can do:
8   aplay -D pipewire:ROLE=Music music.wav
9   aplay -D pipewire:ROLE=Notification notice.wav
10
11 Upstream-Status: Backport [from master/0.3.31]
12 ---
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(-)
16
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 {
22  
23         char *node_name;
24         char *target;
25 +       char *role;
26  
27         int fd;
28         int error;
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);
36  
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,
43 +                               const char *role,
44                                 snd_pcm_stream_t stream,
45                                 int mode,
46                                 uint32_t flags,
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;
49         }
50  
51 +       pw->role = (role && *role) ? strdup(role) : NULL;
52 +
53         pw->main_loop = pw_thread_loop_new("alsa-pipewire", NULL);
54         if (pw->main_loop == NULL) {
55                 err = -errno;
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;
62         int rate = 0;
63         int channels = 0;
64 @@ -1125,6 +1133,10 @@ SND_PCM_PLUGIN_DEFINE_FUNC(pipewire)
65                         snd_config_get_string(n, &capture_node);
66                         continue;
67                 }
68 +               if (spa_streq(id, "role")) {
69 +                       snd_config_get_string(n, &role);
70 +                       continue;
71 +               }
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)
76         }
77  
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);
82  
83         return err;
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
88 @@ -3,9 +3,10 @@
89  defaults.pipewire.server "pipewire-0"
90  defaults.pipewire.node "-1"
91  defaults.pipewire.exclusive false
92 +defaults.pipewire.role ""
93  
94  pcm.pipewire {
95 -       @args [ SERVER NODE EXCLUSIVE ]
96 +       @args [ SERVER NODE EXCLUSIVE ROLE ]
97         @args.SERVER {
98                 type string
99                 default {
100 @@ -27,6 +28,13 @@ pcm.pipewire {
101                         name defaults.pipewire.exclusive
102                 }
103         }
104 +       @args.ROLE {
105 +               type string
106 +               default {
107 +                       @func refer
108 +                       name defaults.pipewire.role
109 +               }
110 +       }
111  
112  
113         type pipewire
114 @@ -34,6 +42,7 @@ pcm.pipewire {
115         playback_node $NODE
116         capture_node $NODE
117         exclusive $EXCLUSIVE
118 +       role $ROLE
119         hint {
120                 show on
121                 description "PipeWire Sound Server"
122 -- 
123 2.30.2
124