diff options
author | George Kiagiadakis <george.kiagiadakis@collabora.com> | 2019-12-05 17:08:12 +0200 |
---|---|---|
committer | George Kiagiadakis <george.kiagiadakis@collabora.com> | 2019-12-05 18:42:36 +0200 |
commit | e4c7027b142672964fdbf788a7495a39a1f46d5f (patch) | |
tree | b5389d5c9b39d54304cc84f975365809cecd7917 /meta-pipewire | |
parent | ab9070a7b8cf2dcbfbf56ec4f24f77ea6e5f927c (diff) |
wireplumber: update to master as of Dec 5th 2019
This update introduces a new TOML configuration file based
policy engine, which behaves the same as the previous static
engine, except that we now can:
* link different apps to different devices
* finetune how the device is configured with a lot of properties
that we can match against
* force a specific role to a specific app, by overriding
it in the configuration file
* make a specific app remain linked to the output even if
another app comes in to play something; this is useful
for the bluez-alsa gstreamer helper at this moment
In addition, the code is cleaner and easier to work with, and
we can easily add more properties to force a specific behavior
per app.
Bug-AGL: SPEC-2837
Change-Id: If0ecd468592b78cb2f2a5a8c3db16f655e4927f9
Signed-off-by: George Kiagiadakis <george.kiagiadakis@collabora.com>
Diffstat (limited to 'meta-pipewire')
9 files changed, 176 insertions, 53 deletions
diff --git a/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-board-config-agl/bluealsa-input-audio.endpoint-link.in b/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-board-config-agl/bluealsa-input-audio.endpoint-link.in new file mode 100644 index 00000000..818ac6b4 --- /dev/null +++ b/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-board-config-agl/bluealsa-input-audio.endpoint-link.in @@ -0,0 +1,16 @@ +[match-endpoint] +priority = 75 +direction = "input" +name = "bluealsa*" +media_class = "Stream/Input/Audio" + +[target-endpoint] +media_class = "Audio/Source" +streams = "default.streams" +stream = "Multimedia" +properties = [ + CAPTURE_DEV_PROPERTIES +] + +[endpoint-link] +keep = true diff --git a/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-board-config-agl/bluealsa-output-audio.endpoint-link.in b/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-board-config-agl/bluealsa-output-audio.endpoint-link.in new file mode 100644 index 00000000..1ba7afed --- /dev/null +++ b/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-board-config-agl/bluealsa-output-audio.endpoint-link.in @@ -0,0 +1,16 @@ +[match-endpoint] +priority = 75 +direction = "output" +name = "bluealsa*" +media_class = "Stream/Output/Audio" + +[target-endpoint] +media_class = "Audio/Sink" +streams = "default.streams" +stream = "Multimedia" +properties = [ + PLAYBACK_DEV_PROPERTIES +] + +[endpoint-link] +keep = true diff --git a/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-board-config-agl/default-input-audio.endpoint-link.in b/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-board-config-agl/default-input-audio.endpoint-link.in new file mode 100644 index 00000000..adb142c1 --- /dev/null +++ b/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-board-config-agl/default-input-audio.endpoint-link.in @@ -0,0 +1,14 @@ +[match-endpoint] +priority = 50 +direction = "input" +media_class = "Stream/Input/Audio" + +[target-endpoint] +media_class = "Audio/Source" +streams = "default.streams" +properties = [ + CAPTURE_DEV_PROPERTIES +] + +[endpoint-link] +keep = false diff --git a/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-board-config-agl/default-output-audio.endpoint-link.in b/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-board-config-agl/default-output-audio.endpoint-link.in new file mode 100644 index 00000000..16af9155 --- /dev/null +++ b/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-board-config-agl/default-output-audio.endpoint-link.in @@ -0,0 +1,14 @@ +[match-endpoint] +priority = 50 +direction = "output" +media_class = "Stream/Output/Audio" + +[target-endpoint] +media_class = "Audio/Sink" +streams = "default.streams" +properties = [ + PLAYBACK_DEV_PROPERTIES +] + +[endpoint-link] +keep = false diff --git a/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-board-config-agl/default.streams b/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-board-config-agl/default.streams new file mode 100644 index 00000000..c645416a --- /dev/null +++ b/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-board-config-agl/default.streams @@ -0,0 +1,31 @@ +[[streams]] +name = "Multimedia" +priority = 25 + +[[streams]] +name = "Speech-Low" +priority = 30 + +[[streams]] +name = "Custom-Low" +priority = 35 + +[[streams]] +name = "Navigation" +priority = 50 + +[[streams]] +name = "Speech-High" +priority = 60 + +[[streams]] +name = "Custom-High" +priority = 65 + +[[streams]] +name = "Communication" +priority = 75 + +[[streams]] +name = "Emergency" +priority = 99 diff --git a/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-board-config-agl/wireplumber.conf.in b/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-board-config-agl/wireplumber.conf index 857c933f..27988197 100644 --- a/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-board-config-agl/wireplumber.conf.in +++ b/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-board-config-agl/wireplumber.conf @@ -33,24 +33,5 @@ load-module C libwireplumber-module-pw-alsa-udev { # and creates simple-endpoints for each one of them load-module C libwireplumber-module-pw-audio-client -# Implements linking clients to devices and maintains -# information about the devices to be used. -# Notes: -# - Devices must be specified in hw:X,Y format, where X and Y are integers. -# Things like hw:Intel,0 or paths are not understood. -# - Roles and priorities can be arbitrary strings and arbitrary numbers -# - Roles are matched against the stream names specified in the modules above. -load-module C libwireplumber-module-simple-policy { - "default-playback-device": <"PLAYBACK">, - "default-capture-device": <"CAPTURE">, - "role-priorities": <{ - "Multimedia": 1, - "Speech-Low": 2, - "Custom-Low": 3, - "Navigation": 5, - "Speech-High:": 7, - "Custom-High": 8, - "Communication": 9, - "Emergency": 10 - }> -} +# Implements linking clients to devices based on TOML configuration files +load-module C libwireplumber-module-config-policy diff --git a/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-board-config-agl_git.bb b/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-board-config-agl_git.bb index 7ed9ea1a..d569a230 100644 --- a/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-board-config-agl_git.bb +++ b/meta-pipewire/recipes-multimedia/wireplumber/wireplumber-board-config-agl_git.bb @@ -7,7 +7,14 @@ SECTION = "multimedia" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302" -SRC_URI = "file://wireplumber.conf.in" +SRC_URI = "\ + file://wireplumber.conf \ + file://default.streams \ + file://default-output-audio.endpoint-link.in \ + file://default-input-audio.endpoint-link.in \ + file://bluealsa-output-audio.endpoint-link.in \ + file://bluealsa-input-audio.endpoint-link.in \ +" PACKAGE_ARCH = "${MACHINE_ARCH}" @@ -15,48 +22,54 @@ do_configure[noexec] = "1" do_compile[noexec] = "1" # -# For device names, any unique substring of the "endpoint" name is valid. -# To list all endpoints: +# Device preferences are configured by listing a subset of the properties +# that the device node has on pipewire. +# +# Every property match needs to have a property name and an expected value. +# The values support shell-like pattern matching using the * and ? characters. +# The syntax adheres to the rules of TOML v0.5 table array. +# +# To list all device node properties, you can run (on the target): # export XDG_RUNTIME_DIR=/run/user/1001 -# pipewire-cli -# > connect pipewire-0 -# > list-objects -# ... and look for objects of type "PipeWire:Interface:Endpoint/0" +# wireplumber-cli # -# For instance: -# id 269, parent 40, type PipeWire:Interface:Endpoint/0 -# media.name = "USB Audio on WD15 Dock (hw:1,0 / node 5)" -# media.class = "Audio/Sink" -# id 270, parent 40, type PipeWire:Interface:Endpoint/0 -# media.name = "USB Audio on WD15 Dock (hw:1,0 / node 7)" -# media.class = "Audio/Source" +# Another way to figure out some of these properties is by parsing the +# aplay/arecord output. For example, this line is interpreted as follows: # -# Audio/Sink endpoints are valid for playback -# Audio/Source endpoints are valid for capture +# card 0: PCH [HDA Intel PCH], device 2: ALC3246 [ALC3246 Analog] # -# Wireplumber will first filter endpoints based on the media.class, depending -# on whether the client is doing playback or capture and then it will look -# for a sub-string match in the media.name +# api.alsa.path = "hw:0,2" +# api.alsa.card = "0" +# api.alsa.card.id = "PCH" +# api.alsa.card.name = "HDA Intel PCH" +# api.alsa.pcm.device = "2" +# api.alsa.pcm.id = "ALC3246" +# api.alsa.pcm.name = "ALC3246 Analog" # -DEV_PLAYBACK = "hw:0,0" -DEV_CAPTURE = "hw:0,0" +DEV_PLAYBACK = '{ name = \"api.alsa.path\", value = \"hw:0,0\" }' +DEV_CAPTURE = '{ name = \"api.alsa.path\", value = \"hw:0,0\" }' -DEV_PLAYBACK_dra7xx-evm = "DRA7xx-EVM" -DEV_CAPTURE_dra7xx-evm = "DRA7xx-EVM" +DEV_PLAYBACK_dra7xx-evm = '{ name = \"api.alsa.card.name\", value = \"DRA7xx-EVM\" }' +DEV_CAPTURE_dra7xx-evm = '{ name = \"api.alsa.card.name\", value = \"DRA7xx-EVM\" }' -DEV_PLAYBACK_m3ulcb = "ak4613" -DEV_CAPTURE_m3ulcb = "ak4613" +DEV_PLAYBACK_m3ulcb = '{ name = \"api.alsa.card.name\", value = \"ak4613\" }' +DEV_CAPTURE_m3ulcb = '{ name = \"api.alsa.card.name\", value = \"ak4613\" }' -DEV_PLAYBACK_h3ulcb = "ak4613" -DEV_CAPTURE_h3ulcb = "ak4613" +DEV_PLAYBACK_h3ulcb = '{ name = \"api.alsa.card.name\", value = \"ak4613\" }' +DEV_CAPTURE_h3ulcb = '{ name = \"api.alsa.card.name\", value = \"ak4613\" }' -DEV_PLAYBACK_raspberrypi3 = "bcm2835 ALSA on bcm2835 ALSA" -DEV_CAPTURE_raspberrypi3 = "hw:0,0" +DEV_PLAYBACK_raspberrypi3 = '{ name = \"api.alsa.pcm.name\", value = \"bcm2835 ALSA\" }, { name = \"api.alsa.card.name\", value = \"bcm2835 ALSA\" }' +DEV_CAPTURE_raspberrypi3 = '{ name = \"api.alsa.path\", value = \"hw:0,0\" }' do_install_append() { - sed -e "s/PLAYBACK/${DEV_PLAYBACK}/" -e "s/CAPTURE/${DEV_CAPTURE}/" ${WORKDIR}/wireplumber.conf.in > ${WORKDIR}/wireplumber.conf + sed -e "s/PLAYBACK_DEV_PROPERTIES/${DEV_PLAYBACK}/" -e "s/CAPTURE_DEV_PROPERTIES/${DEV_CAPTURE}/" ${WORKDIR}/default-output-audio.endpoint-link.in > ${WORKDIR}/default-output-audio.endpoint-link + sed -e "s/PLAYBACK_DEV_PROPERTIES/${DEV_PLAYBACK}/" -e "s/CAPTURE_DEV_PROPERTIES/${DEV_CAPTURE}/" ${WORKDIR}/default-input-audio.endpoint-link.in > ${WORKDIR}/default-input-audio.endpoint-link + sed -e "s/PLAYBACK_DEV_PROPERTIES/${DEV_PLAYBACK}/" -e "s/CAPTURE_DEV_PROPERTIES/${DEV_CAPTURE}/" ${WORKDIR}/bluealsa-output-audio.endpoint-link.in > ${WORKDIR}/bluealsa-output-audio.endpoint-link + sed -e "s/PLAYBACK_DEV_PROPERTIES/${DEV_PLAYBACK}/" -e "s/CAPTURE_DEV_PROPERTIES/${DEV_CAPTURE}/" ${WORKDIR}/bluealsa-input-audio.endpoint-link.in > ${WORKDIR}/bluealsa-input-audio.endpoint-link install -d ${D}/${sysconfdir}/wireplumber/ install -m 644 ${WORKDIR}/wireplumber.conf ${D}/${sysconfdir}/wireplumber/wireplumber.conf + install -m 644 ${WORKDIR}/default.streams ${D}/${sysconfdir}/wireplumber/default.streams + install -m 644 ${WORKDIR}/*.endpoint-link ${D}/${sysconfdir}/wireplumber/ } FILES_${PN} += "\ diff --git a/meta-pipewire/recipes-multimedia/wireplumber/wireplumber/0001-Build-cpptoml-without-a-cmake-subproject.patch b/meta-pipewire/recipes-multimedia/wireplumber/wireplumber/0001-Build-cpptoml-without-a-cmake-subproject.patch new file mode 100644 index 00000000..726b35e7 --- /dev/null +++ b/meta-pipewire/recipes-multimedia/wireplumber/wireplumber/0001-Build-cpptoml-without-a-cmake-subproject.patch @@ -0,0 +1,28 @@ +From e5efe3d4f0abc28251dac245ce0cf4124e7e2a12 Mon Sep 17 00:00:00 2001 +From: George Kiagiadakis <george.kiagiadakis@collabora.com> +Date: Thu, 5 Dec 2019 17:59:44 +0200 +Subject: [PATCH] Build cpptoml without a cmake subproject + +Upstream-Status: Inappropriate +--- + meson.build | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +diff --git a/meson.build b/meson.build +index 5a75d96..0b21377 100644 +--- a/meson.build ++++ b/meson.build +@@ -24,9 +24,7 @@ else + wireplumber_config_dir = join_paths(get_option('prefix'), get_option('sysconfdir'), 'wireplumber') + endif + +-cmake = import('cmake') +-cpptoml = cmake.subproject('cpptoml') +-cpptoml_dep = cpptoml.dependency('cpptoml') ++cpptoml_dep = declare_dependency(include_directories: include_directories('subprojects/cpptoml')) + + gobject_dep = dependency('gobject-2.0') + gmodule_dep = dependency('gmodule-2.0') +-- +2.24.0 + diff --git a/meta-pipewire/recipes-multimedia/wireplumber/wireplumber_git.bb b/meta-pipewire/recipes-multimedia/wireplumber/wireplumber_git.bb index 0ea29752..d89ca5cb 100644 --- a/meta-pipewire/recipes-multimedia/wireplumber/wireplumber_git.bb +++ b/meta-pipewire/recipes-multimedia/wireplumber/wireplumber_git.bb @@ -11,12 +11,22 @@ inherit meson pkgconfig gobject-introspection DEPENDS = "glib-2.0 glib-2.0-native pipewire" -SRC_URI = "git://gitlab.freedesktop.org/pipewire/wireplumber.git;protocol=https;branch=master" -SRCREV = "59ab08ff0c9ff8b80dba93b8928db99f1a222ac4" +SRC_URI = "\ + git://gitlab.freedesktop.org/pipewire/wireplumber.git;protocol=https;branch=master \ + https://raw.githubusercontent.com/skystrife/cpptoml/fededad7169e538ca47e11a9ee9251bc361a9a65/include/cpptoml.h \ + file://0001-Build-cpptoml-without-a-cmake-subproject.patch \ +" +SRCREV = "8bdadd5a71510afce3254976605a2860fedc2a0b" +SRC_URI[sha256sum] = "3e4e1d315fa1229921c7a4297ead08775b5bb1220c18a7eac62db9ca7e79df0d" PV = "0.1.90+git${SRCPV}" S = "${WORKDIR}/git" +do_configure_prepend() { + mkdir -p ${WORKDIR}/git/subprojects/cpptoml/include + cp -f ${WORKDIR}/cpptoml.h ${WORKDIR}/git/subprojects/cpptoml/include/ +} + PACKAGES =+ "${PN}-config" FILES_${PN} += "\ |