pipewire: fix alsa virtual device to work again 47/26447/2
authorGeorge Kiagiadakis <george.kiagiadakis@collabora.com>
Tue, 22 Jun 2021 15:08:25 +0000 (15:08 +0000)
committerJan-Simon Moeller <jsmoeller@linuxfoundation.org>
Wed, 23 Jun 2021 11:02:55 +0000 (11:02 +0000)
* Install symlinks to the configuration files in /etc/alsa/conf.d
* Add patch from pipewire master to support roles on the virtual
  alsa device

Bug-AGL: SPEC-3822
Signed-off-by: George Kiagiadakis <george.kiagiadakis@collabora.com>
Change-Id: Ie411df23390754e2cdc494657eb9881771b8c401
Reviewed-on: https://gerrit.automotivelinux.org/gerrit/c/AGL/meta-agl/+/26447
Tested-by: Jenkins Job builder account
ci-image-build: Jenkins Job builder account
ci-image-boot-test: Jenkins Job builder account
Reviewed-by: Jan-Simon Moeller <jsmoeller@linuxfoundation.org>
meta-pipewire/recipes-multimedia/pipewire/pipewire/0001-alsa-plugin-allow-specifying-a-media.role-on-the-vir.patch [new file with mode: 0644]
meta-pipewire/recipes-multimedia/pipewire/pipewire_0.3.30.bbappend

diff --git a/meta-pipewire/recipes-multimedia/pipewire/pipewire/0001-alsa-plugin-allow-specifying-a-media.role-on-the-vir.patch b/meta-pipewire/recipes-multimedia/pipewire/pipewire/0001-alsa-plugin-allow-specifying-a-media.role-on-the-vir.patch
new file mode 100644 (file)
index 0000000..c6cf373
--- /dev/null
@@ -0,0 +1,124 @@
+From ff019936a70262c176a4bd950bc80ab84d2a71b0 Mon Sep 17 00:00:00 2001
+From: George Kiagiadakis <george.kiagiadakis@collabora.com>
+Date: Tue, 22 Jun 2021 13:23:22 +0300
+Subject: [PATCH] alsa plugin: allow specifying a media.role on the virtual
+ device name
+
+So that we can do:
+  aplay -D pipewire:ROLE=Music music.wav
+  aplay -D pipewire:ROLE=Notification notice.wav
+
+Upstream-Status: Backport [from master/0.3.31]
+---
+ pipewire-alsa/alsa-plugins/pcm_pipewire.c | 14 +++++++++++++-
+ pipewire-alsa/conf/50-pipewire.conf       | 11 ++++++++++-
+ 2 files changed, 23 insertions(+), 2 deletions(-)
+
+diff --git a/pipewire-alsa/alsa-plugins/pcm_pipewire.c b/pipewire-alsa/alsa-plugins/pcm_pipewire.c
+index 86792d2c7..6ace1b689 100644
+--- a/pipewire-alsa/alsa-plugins/pcm_pipewire.c
++++ b/pipewire-alsa/alsa-plugins/pcm_pipewire.c
+@@ -59,6 +59,7 @@ typedef struct {
+       char *node_name;
+       char *target;
++      char *role;
+       int fd;
+       int error;
+@@ -509,6 +510,9 @@ static int snd_pcm_pipewire_prepare(snd_pcm_ioplug_t *io)
+               pw_properties_set(props, PW_KEY_MEDIA_CATEGORY,
+                               io->stream == SND_PCM_STREAM_PLAYBACK ?
+                               "Playback" : "Capture");
++      if (pw->role != NULL &&
++              pw_properties_get(props, PW_KEY_MEDIA_ROLE) == NULL)
++              pw_properties_setf(props, PW_KEY_MEDIA_ROLE, "%s", pw->role);
+       pw->stream = pw_stream_new(pw->core, pw->node_name, props);
+       if (pw->stream == NULL)
+@@ -958,6 +962,7 @@ static int snd_pcm_pipewire_open(snd_pcm_t **pcmp, const char *name,
+                               const char *server_name,
+                               const char *playback_node,
+                               const char *capture_node,
++                              const char *role,
+                               snd_pcm_stream_t stream,
+                               int mode,
+                               uint32_t flags,
+@@ -1013,6 +1018,8 @@ static int snd_pcm_pipewire_open(snd_pcm_t **pcmp, const char *name,
+                       pw->target = capture_node ? strdup(capture_node) : NULL;
+       }
++      pw->role = (role && *role) ? strdup(role) : NULL;
++
+       pw->main_loop = pw_thread_loop_new("alsa-pipewire", NULL);
+       if (pw->main_loop == NULL) {
+               err = -errno;
+@@ -1091,6 +1098,7 @@ SND_PCM_PLUGIN_DEFINE_FUNC(pipewire)
+       const char *server_name = NULL;
+       const char *playback_node = NULL;
+       const char *capture_node = NULL;
++      const char *role = NULL;
+       snd_pcm_format_t format = SND_PCM_FORMAT_UNKNOWN;
+       int rate = 0;
+       int channels = 0;
+@@ -1125,6 +1133,10 @@ SND_PCM_PLUGIN_DEFINE_FUNC(pipewire)
+                       snd_config_get_string(n, &capture_node);
+                       continue;
+               }
++              if (spa_streq(id, "role")) {
++                      snd_config_get_string(n, &role);
++                      continue;
++              }
+               if (spa_streq(id, "exclusive")) {
+                       if (snd_config_get_bool(n))
+                               flags |= PW_STREAM_FLAG_EXCLUSIVE;
+@@ -1174,7 +1186,7 @@ SND_PCM_PLUGIN_DEFINE_FUNC(pipewire)
+       }
+       err = snd_pcm_pipewire_open(pcmp, name, node_name, server_name, playback_node,
+-                      capture_node, stream, mode, flags, rate, format,
++                      capture_node, role, stream, mode, flags, rate, format,
+                       channels, period_bytes);
+       return err;
+diff --git a/pipewire-alsa/conf/50-pipewire.conf b/pipewire-alsa/conf/50-pipewire.conf
+index 2c6f2d259..f7e58472b 100644
+--- a/pipewire-alsa/conf/50-pipewire.conf
++++ b/pipewire-alsa/conf/50-pipewire.conf
+@@ -3,9 +3,10 @@
+ defaults.pipewire.server "pipewire-0"
+ defaults.pipewire.node "-1"
+ defaults.pipewire.exclusive false
++defaults.pipewire.role ""
+ pcm.pipewire {
+-      @args [ SERVER NODE EXCLUSIVE ]
++      @args [ SERVER NODE EXCLUSIVE ROLE ]
+       @args.SERVER {
+               type string
+               default {
+@@ -27,6 +28,13 @@ pcm.pipewire {
+                       name defaults.pipewire.exclusive
+               }
+       }
++      @args.ROLE {
++              type string
++              default {
++                      @func refer
++                      name defaults.pipewire.role
++              }
++      }
+       type pipewire
+@@ -34,6 +42,7 @@ pcm.pipewire {
+       playback_node $NODE
+       capture_node $NODE
+       exclusive $EXCLUSIVE
++      role $ROLE
+       hint {
+               show on
+               description "PipeWire Sound Server"
+-- 
+2.30.2
+
index cc2308e..d45e053 100644 (file)
@@ -5,3 +5,21 @@ PACKAGECONFIG = "\
     ${@bb.utils.filter('DISTRO_FEATURES', 'systemd', d)} \
     gstreamer v4l2 \
 "
+
+SRC_URI += "\
+    file://0001-alsa-plugin-allow-specifying-a-media.role-on-the-vir.patch \
+"
+
+do_install_append() {
+    # install symlinks to alsalib configuration files
+    for i in 50-pipewire.conf 99-pipewire-default.conf; do
+        if [ -f ${D}${datadir}/alsa/alsa.conf.d/${i} ]; then
+            mkdir -p ${D}${sysconfdir}/alsa/conf.d
+            ln -s ${datadir}/alsa/alsa.conf.d/${i} ${D}${sysconfdir}/alsa/conf.d/${i}
+        fi
+    done
+}
+
+FILES_${PN}-alsa_append = "\
+    ${sysconfdir}/alsa/conf.d/* \
+"