1*4882a593SmuzhiyunSUMMARY     = "Multimedia processing server for Linux"
2*4882a593SmuzhiyunDESCRIPTION = "Linux server for handling and routing audio and video streams between applications and multimedia I/O devices"
3*4882a593SmuzhiyunHOMEPAGE    = "https://pipewire.org/"
4*4882a593SmuzhiyunBUGTRACKER  = "https://gitlab.freedesktop.org/pipewire/pipewire/issues"
5*4882a593SmuzhiyunAUTHOR      = "Wim Taymans <wtaymans@redhat.com>"
6*4882a593SmuzhiyunSECTION     = "multimedia"
7*4882a593Smuzhiyun
8*4882a593SmuzhiyunLICENSE = "MIT & LGPL-2.1-or-later & GPL-2.0-only"
9*4882a593SmuzhiyunLIC_FILES_CHKSUM = " \
10*4882a593Smuzhiyun    file://LICENSE;md5=2158739e172e58dc9ab1bdd2d6ec9c72 \
11*4882a593Smuzhiyun    file://COPYING;md5=97be96ca4fab23e9657ffa590b931c1a \
12*4882a593Smuzhiyun"
13*4882a593Smuzhiyun
14*4882a593SmuzhiyunDEPENDS = "dbus ncurses"
15*4882a593Smuzhiyun
16*4882a593SmuzhiyunSRCREV = "64cf5e80e6240284e6b757907b900507fe56f1b5"
17*4882a593SmuzhiyunSRC_URI = "git://gitlab.freedesktop.org/pipewire/pipewire.git;branch=master;protocol=https"
18*4882a593Smuzhiyun
19*4882a593SmuzhiyunS = "${WORKDIR}/git"
20*4882a593Smuzhiyun
21*4882a593Smuzhiyuninherit meson pkgconfig systemd gettext useradd
22*4882a593Smuzhiyun
23*4882a593SmuzhiyunUSERADD_PACKAGES = "${PN}"
24*4882a593Smuzhiyun
25*4882a593SmuzhiyunGROUPADD_PARAM:${PN} = "--system pipewire"
26*4882a593Smuzhiyun
27*4882a593SmuzhiyunUSERADD_PARAM:${PN} = "--system --home / --no-create-home \
28*4882a593Smuzhiyun                       --comment 'PipeWire multimedia daemon' \
29*4882a593Smuzhiyun                       --gid pipewire --groups audio,video \
30*4882a593Smuzhiyun                       pipewire"
31*4882a593Smuzhiyun
32*4882a593SmuzhiyunSYSTEMD_PACKAGES = "${PN}"
33*4882a593Smuzhiyun
34*4882a593Smuzhiyun# For "EVL", look up https://evlproject.org/ . It involves
35*4882a593Smuzhiyun# a specially prepared kernel, and is currently unavailable
36*4882a593Smuzhiyun# in Yocto.
37*4882a593Smuzhiyun#
38*4882a593Smuzhiyun# Vulkan support is currently (as of version 0.3.44) not functional.
39*4882a593Smuzhiyun#
40*4882a593Smuzhiyun# manpage generation requires xmltoman, which is not available.
41*4882a593Smuzhiyun#
42*4882a593Smuzhiyun# The session-managers list specifies which session managers Meson
43*4882a593Smuzhiyun# shall download (via git clone) and build as subprojects. In OE,
44*4882a593Smuzhiyun# this is not how a session manager should be built. Instead, they
45*4882a593Smuzhiyun# should be integrated as separate OE recipes. To prevent PipeWire
46*4882a593Smuzhiyun# from using this Meson feature, set an empty list.
47*4882a593Smuzhiyun# This does not disable support or the need for session managers,
48*4882a593Smuzhiyun# it just prevents this subproject feature.
49*4882a593Smuzhiyun#
50*4882a593Smuzhiyun# AptX and LDAC are not available in OE. Currently, neither
51*4882a593Smuzhiyun# are lv2 and ROC.
52*4882a593Smuzhiyun#
53*4882a593Smuzhiyun# The RTKit module is deprecated in favor of the newer RT module.
54*4882a593Smuzhiyun# It still exists for legacy setups that still include it in
55*4882a593Smuzhiyun# their PipeWire configuration files.
56*4882a593SmuzhiyunEXTRA_OEMESON += " \
57*4882a593Smuzhiyun    -Devl=disabled \
58*4882a593Smuzhiyun    -Dtests=disabled \
59*4882a593Smuzhiyun    -Dudevrulesdir=${nonarch_base_libdir}/udev/rules.d/ \
60*4882a593Smuzhiyun    -Dsystemd-system-unit-dir=${systemd_system_unitdir} \
61*4882a593Smuzhiyun    -Dsystemd-user-unit-dir=${systemd_user_unitdir} \
62*4882a593Smuzhiyun    -Dvulkan=disabled \
63*4882a593Smuzhiyun    -Dman=disabled \
64*4882a593Smuzhiyun    -Dsession-managers='[]' \
65*4882a593Smuzhiyun    -Dlv2=disabled \
66*4882a593Smuzhiyun    -Droc=disabled \
67*4882a593Smuzhiyun    -Dbluez5-codec-aptx=disabled \
68*4882a593Smuzhiyun    -Dbluez5-codec-ldac=disabled \
69*4882a593Smuzhiyun    -Dlegacy-rtkit=false \
70*4882a593Smuzhiyun"
71*4882a593Smuzhiyun
72*4882a593SmuzhiyunPACKAGECONFIG ??= "\
73*4882a593Smuzhiyun    ${@bb.utils.contains('DISTRO_FEATURES', 'zeroconf', 'avahi', '', d)} \
74*4882a593Smuzhiyun    ${@bb.utils.contains('DISTRO_FEATURES', 'bluetooth', 'bluez', '', d)} \
75*4882a593Smuzhiyun    ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'systemd systemd-system-service', '', d)} \
76*4882a593Smuzhiyun    ${@bb.utils.filter('DISTRO_FEATURES', 'alsa', d)} \
77*4882a593Smuzhiyun    gstreamer jack libusb pw-cat raop sndfile v4l2 \
78*4882a593Smuzhiyun"
79*4882a593Smuzhiyun
80*4882a593Smuzhiyun# "jack" and "pipewire-jack" packageconfigs cannot be both enabled,
81*4882a593Smuzhiyun# since "jack" imports libjack, and "pipewire-jack" generates
82*4882a593Smuzhiyun# libjack.so* files, thus colliding with the libpack package. This
83*4882a593Smuzhiyun# is why these two are marked in their respective packageconfigs
84*4882a593Smuzhiyun# as being in conflict.
85*4882a593SmuzhiyunPACKAGECONFIG[alsa] = "-Dalsa=enabled,-Dalsa=disabled,alsa-lib udev"
86*4882a593SmuzhiyunPACKAGECONFIG[avahi] = "-Davahi=enabled,-Davahi=disabled,avahi"
87*4882a593SmuzhiyunPACKAGECONFIG[bluez] = "-Dbluez5=enabled,-Dbluez5=disabled,bluez5 sbc"
88*4882a593SmuzhiyunPACKAGECONFIG[bluez-aac] = "-Dbluez5-codec-aac=enabled,-Dbluez5-codec-aac=disabled,fdk-aac"
89*4882a593SmuzhiyunPACKAGECONFIG[docs] = "-Ddocs=enabled,-Ddocs=disabled,doxygen-native graphviz-native"
90*4882a593SmuzhiyunPACKAGECONFIG[ffmpeg] = "-Dffmpeg=enabled,-Dffmpeg=disabled,ffmpeg"
91*4882a593SmuzhiyunPACKAGECONFIG[gstreamer] = "-Dgstreamer=enabled,-Dgstreamer=disabled,glib-2.0 gstreamer1.0 gstreamer1.0-plugins-base"
92*4882a593SmuzhiyunPACKAGECONFIG[jack] = "-Djack=enabled,-Djack=disabled,jack,,,pipewire-jack"
93*4882a593SmuzhiyunPACKAGECONFIG[libcamera] = "-Dlibcamera=enabled,-Dlibcamera=disabled,libcamera"
94*4882a593SmuzhiyunPACKAGECONFIG[libcanberra] = "-Dlibcanberra=enabled,-Dlibcanberra=disabled,libcanberra"
95*4882a593SmuzhiyunPACKAGECONFIG[libusb] = "-Dlibusb=enabled,-Dlibusb=disabled,libusb"
96*4882a593SmuzhiyunPACKAGECONFIG[pipewire-alsa] = "-Dpipewire-alsa=enabled,-Dpipewire-alsa=disabled,alsa-lib"
97*4882a593SmuzhiyunPACKAGECONFIG[pipewire-jack] = "-Dpipewire-jack=enabled -Dlibjack-path=${libdir}/${PW_MODULE_SUBDIR}/jack,-Dpipewire-jack=disabled,jack,,,jack"
98*4882a593SmuzhiyunPACKAGECONFIG[pw-cat] = "-Dpw-cat=enabled,-Dpw-cat=disabled"
99*4882a593SmuzhiyunPACKAGECONFIG[raop] = "-Draop=enabled,-Draop=disabled,openssl"
100*4882a593SmuzhiyunPACKAGECONFIG[sdl2] = "-Dsdl2=enabled,-Dsdl2=disabled,virtual/libsdl2"
101*4882a593SmuzhiyunPACKAGECONFIG[sndfile] = "-Dsndfile=enabled,-Dsndfile=disabled,libsndfile1"
102*4882a593SmuzhiyunPACKAGECONFIG[systemd] = "-Dsystemd=enabled,-Dsystemd=disabled,systemd"
103*4882a593SmuzhiyunPACKAGECONFIG[systemd-system-service] = "-Dsystemd-system-service=enabled,-Dsystemd-system-service=disabled,systemd"
104*4882a593Smuzhiyun# "systemd-user-service" packageconfig will only install service
105*4882a593Smuzhiyun# files to rootfs but not enable them as systemd.bbclass
106*4882a593Smuzhiyun# currently lacks the feature of enabling user services.
107*4882a593SmuzhiyunPACKAGECONFIG[systemd-user-service] = "-Dsystemd-user-service=enabled,-Dsystemd-user-service=disabled,systemd"
108*4882a593Smuzhiyun# pw-cat needs sndfile packageconfig to be enabled
109*4882a593SmuzhiyunPACKAGECONFIG[v4l2] = "-Dv4l2=enabled,-Dv4l2=disabled,udev"
110*4882a593SmuzhiyunPACKAGECONFIG[webrtc-echo-cancelling] = "-Decho-cancel-webrtc=enabled,-Decho-cancel-webrtc=disabled,webrtc-audio-processing"
111*4882a593Smuzhiyun
112*4882a593SmuzhiyunPACKAGESPLITFUNCS:prepend = " split_dynamic_packages "
113*4882a593SmuzhiyunPACKAGESPLITFUNCS:append = " set_dynamic_metapkg_rdepends "
114*4882a593Smuzhiyun
115*4882a593SmuzhiyunSPA_SUBDIR = "spa-0.2"
116*4882a593SmuzhiyunPW_MODULE_SUBDIR = "pipewire-0.3"
117*4882a593Smuzhiyun
118*4882a593Smuzhiyunremove_unused_installed_files() {
119*4882a593Smuzhiyun    # jack.conf is used by pipewire-jack (not the JACK SPA plugin).
120*4882a593Smuzhiyun    # Remove it if pipewire-jack is not built to avoid creating the
121*4882a593Smuzhiyun    # pipewire-jack package.
122*4882a593Smuzhiyun    if ${@bb.utils.contains('PACKAGECONFIG', 'pipewire-jack', 'false', 'true', d)}; then
123*4882a593Smuzhiyun        rm -f "${D}${datadir}/pipewire/jack.conf"
124*4882a593Smuzhiyun    fi
125*4882a593Smuzhiyun
126*4882a593Smuzhiyun    # minimal.conf is an example of how to minimally configure the
127*4882a593Smuzhiyun    # daemon and is not meant to be used for production.
128*4882a593Smuzhiyun    rm -f "${D}${datadir}/pipewire/minimal.conf"
129*4882a593Smuzhiyun}
130*4882a593Smuzhiyun
131*4882a593Smuzhiyundo_install[postfuncs] += "remove_unused_installed_files"
132*4882a593Smuzhiyun
133*4882a593Smuzhiyunpython split_dynamic_packages () {
134*4882a593Smuzhiyun    # Create packages for each SPA plugin. These plugins are located
135*4882a593Smuzhiyun    # in individual subdirectories, so a recursive search is needed.
136*4882a593Smuzhiyun    spa_libdir = d.expand('${libdir}/${SPA_SUBDIR}')
137*4882a593Smuzhiyun    do_split_packages(d, spa_libdir, r'^libspa-(.*)\.so$', d.expand('${PN}-spa-plugins-%s'), 'PipeWire SPA plugin for %s', extra_depends='', recursive=True)
138*4882a593Smuzhiyun
139*4882a593Smuzhiyun    # Create packages for each PipeWire module.
140*4882a593Smuzhiyun    pw_module_libdir = d.expand('${libdir}/${PW_MODULE_SUBDIR}')
141*4882a593Smuzhiyun    do_split_packages(d, pw_module_libdir, r'^libpipewire-module-(.*)\.so$', d.expand('${PN}-modules-%s'), 'PipeWire %s module', extra_depends='', recursive=False)
142*4882a593Smuzhiyun}
143*4882a593Smuzhiyun
144*4882a593Smuzhiyunpython set_dynamic_metapkg_rdepends () {
145*4882a593Smuzhiyun    import os
146*4882a593Smuzhiyun    import oe.utils
147*4882a593Smuzhiyun
148*4882a593Smuzhiyun    # Go through all generated SPA plugin and PipeWire module packages
149*4882a593Smuzhiyun    # (excluding the main package and the -meta package itself) and
150*4882a593Smuzhiyun    # add them to the -meta package as RDEPENDS.
151*4882a593Smuzhiyun
152*4882a593Smuzhiyun    base_pn = d.getVar('PN')
153*4882a593Smuzhiyun
154*4882a593Smuzhiyun    spa_pn = base_pn + '-spa-plugins'
155*4882a593Smuzhiyun    spa_metapkg =  spa_pn + '-meta'
156*4882a593Smuzhiyun
157*4882a593Smuzhiyun    pw_module_pn = base_pn + '-modules'
158*4882a593Smuzhiyun    pw_module_metapkg =  pw_module_pn + '-meta'
159*4882a593Smuzhiyun
160*4882a593Smuzhiyun    d.setVar('ALLOW_EMPTY:' + spa_metapkg, "1")
161*4882a593Smuzhiyun    d.setVar('FILES:' + spa_metapkg, "")
162*4882a593Smuzhiyun
163*4882a593Smuzhiyun    d.setVar('ALLOW_EMPTY:' + pw_module_metapkg, "1")
164*4882a593Smuzhiyun    d.setVar('FILES:' + pw_module_metapkg, "")
165*4882a593Smuzhiyun
166*4882a593Smuzhiyun    blacklist = [ spa_pn, spa_metapkg, pw_module_pn, pw_module_metapkg ]
167*4882a593Smuzhiyun    spa_metapkg_rdepends = []
168*4882a593Smuzhiyun    pw_module_metapkg_rdepends = []
169*4882a593Smuzhiyun    pkgdest = d.getVar('PKGDEST')
170*4882a593Smuzhiyun
171*4882a593Smuzhiyun    for pkg in oe.utils.packages_filter_out_system(d):
172*4882a593Smuzhiyun        if pkg in blacklist:
173*4882a593Smuzhiyun            continue
174*4882a593Smuzhiyun
175*4882a593Smuzhiyun        is_spa_pkg = pkg.startswith(spa_pn)
176*4882a593Smuzhiyun        is_pw_module_pkg = pkg.startswith(pw_module_pn)
177*4882a593Smuzhiyun        if not is_spa_pkg and not is_pw_module_pkg:
178*4882a593Smuzhiyun            continue
179*4882a593Smuzhiyun
180*4882a593Smuzhiyun        if pkg in spa_metapkg_rdepends or pkg in pw_module_metapkg_rdepends:
181*4882a593Smuzhiyun            continue
182*4882a593Smuzhiyun
183*4882a593Smuzhiyun        # See if the package is empty by looking at the contents of its
184*4882a593Smuzhiyun        # PKGDEST subdirectory. If this subdirectory is empty, then then
185*4882a593Smuzhiyun        # package is empty as well. Empty packages do not get added to
186*4882a593Smuzhiyun        # the meta package's RDEPENDS.
187*4882a593Smuzhiyun        pkgdir = os.path.join(pkgdest, pkg)
188*4882a593Smuzhiyun        if os.path.exists(pkgdir):
189*4882a593Smuzhiyun            dir_contents = os.listdir(pkgdir) or []
190*4882a593Smuzhiyun        else:
191*4882a593Smuzhiyun            dir_contents = []
192*4882a593Smuzhiyun        is_empty = len(dir_contents) == 0
193*4882a593Smuzhiyun        if not is_empty:
194*4882a593Smuzhiyun            if is_spa_pkg:
195*4882a593Smuzhiyun                spa_metapkg_rdepends.append(pkg)
196*4882a593Smuzhiyun            if is_pw_module_pkg:
197*4882a593Smuzhiyun                pw_module_metapkg_rdepends.append(pkg)
198*4882a593Smuzhiyun
199*4882a593Smuzhiyun    d.setVar('RDEPENDS:' + spa_metapkg, ' '.join(spa_metapkg_rdepends))
200*4882a593Smuzhiyun    d.setVar('DESCRIPTION:' + spa_metapkg, spa_pn + ' meta package')
201*4882a593Smuzhiyun
202*4882a593Smuzhiyun    d.setVar('RDEPENDS:' + pw_module_metapkg, ' '.join(pw_module_metapkg_rdepends))
203*4882a593Smuzhiyun    d.setVar('DESCRIPTION:' + pw_module_metapkg, pw_module_pn + ' meta package')
204*4882a593Smuzhiyun}
205*4882a593Smuzhiyun
206*4882a593SmuzhiyunPACKAGES =+ "\
207*4882a593Smuzhiyun    libpipewire \
208*4882a593Smuzhiyun    ${PN}-tools \
209*4882a593Smuzhiyun    ${PN}-pulse \
210*4882a593Smuzhiyun    ${PN}-alsa \
211*4882a593Smuzhiyun    ${PN}-jack \
212*4882a593Smuzhiyun    ${PN}-spa-plugins \
213*4882a593Smuzhiyun    ${PN}-spa-plugins-meta \
214*4882a593Smuzhiyun    ${PN}-spa-tools \
215*4882a593Smuzhiyun    ${PN}-modules \
216*4882a593Smuzhiyun    ${PN}-modules-meta \
217*4882a593Smuzhiyun    ${PN}-alsa-card-profile \
218*4882a593Smuzhiyun    ${PN}-v4l2 \
219*4882a593Smuzhiyun    gstreamer1.0-pipewire \
220*4882a593Smuzhiyun"
221*4882a593Smuzhiyun
222*4882a593SmuzhiyunPACKAGES_DYNAMIC = "^${PN}-spa-plugins.* ^${PN}-modules.*"
223*4882a593Smuzhiyun
224*4882a593SmuzhiyunSYSTEMD_SERVICE:${PN} = "${@bb.utils.contains('PACKAGECONFIG', 'systemd-system-service', 'pipewire.service', '', d)}"
225*4882a593SmuzhiyunCONFFILES:${PN} += "${datadir}/pipewire/pipewire.conf"
226*4882a593SmuzhiyunFILES:${PN} = " \
227*4882a593Smuzhiyun    ${datadir}/pipewire/pipewire.conf \
228*4882a593Smuzhiyun    ${systemd_system_unitdir}/pipewire.* \
229*4882a593Smuzhiyun    ${systemd_user_unitdir}/pipewire.* \
230*4882a593Smuzhiyun    ${bindir}/pipewire \
231*4882a593Smuzhiyun"
232*4882a593Smuzhiyun
233*4882a593SmuzhiyunFILES:${PN}-dev += " \
234*4882a593Smuzhiyun    ${libdir}/${PW_MODULE_SUBDIR}/jack/libjack*.so \
235*4882a593Smuzhiyun"
236*4882a593Smuzhiyun
237*4882a593SmuzhiyunCONFFILES:libpipewire += "${datadir}/pipewire/client.conf"
238*4882a593SmuzhiyunFILES:libpipewire = " \
239*4882a593Smuzhiyun    ${datadir}/pipewire/client.conf \
240*4882a593Smuzhiyun    ${libdir}/libpipewire-*.so.* \
241*4882a593Smuzhiyun"
242*4882a593Smuzhiyun# Add the bare minimum modules and plugins required to be able
243*4882a593Smuzhiyun# to use libpipewire. Without these, it is essentially unusable.
244*4882a593SmuzhiyunRDEPENDS:libpipewire += " \
245*4882a593Smuzhiyun    ${PN}-modules-client-node \
246*4882a593Smuzhiyun    ${PN}-modules-protocol-native \
247*4882a593Smuzhiyun    ${PN}-spa-plugins-support \
248*4882a593Smuzhiyun"
249*4882a593Smuzhiyun
250*4882a593SmuzhiyunFILES:${PN}-tools = " \
251*4882a593Smuzhiyun    ${bindir}/pw-cat \
252*4882a593Smuzhiyun    ${bindir}/pw-cli \
253*4882a593Smuzhiyun    ${bindir}/pw-dot \
254*4882a593Smuzhiyun    ${bindir}/pw-dsdplay \
255*4882a593Smuzhiyun    ${bindir}/pw-dump \
256*4882a593Smuzhiyun    ${bindir}/pw-link \
257*4882a593Smuzhiyun    ${bindir}/pw-loopback \
258*4882a593Smuzhiyun    ${bindir}/pw-metadata \
259*4882a593Smuzhiyun    ${bindir}/pw-mididump \
260*4882a593Smuzhiyun    ${bindir}/pw-midiplay \
261*4882a593Smuzhiyun    ${bindir}/pw-midirecord \
262*4882a593Smuzhiyun    ${bindir}/pw-mon \
263*4882a593Smuzhiyun    ${bindir}/pw-play \
264*4882a593Smuzhiyun    ${bindir}/pw-profiler \
265*4882a593Smuzhiyun    ${bindir}/pw-record \
266*4882a593Smuzhiyun    ${bindir}/pw-reserve \
267*4882a593Smuzhiyun    ${bindir}/pw-top \
268*4882a593Smuzhiyun"
269*4882a593Smuzhiyun
270*4882a593Smuzhiyun# This is a shim daemon that is intended to be used as a
271*4882a593Smuzhiyun# drop-in PulseAudio replacement, providing a pulseaudio-compatible
272*4882a593Smuzhiyun# socket that can be used by applications that use libpulse.
273*4882a593SmuzhiyunCONFFILES:${PN}-pulse += "${datadir}/pipewire/pipewire-pulse.conf"
274*4882a593SmuzhiyunFILES:${PN}-pulse = " \
275*4882a593Smuzhiyun    ${datadir}/pipewire/pipewire-pulse.conf \
276*4882a593Smuzhiyun    ${systemd_system_unitdir}/pipewire-pulse.* \
277*4882a593Smuzhiyun    ${systemd_user_unitdir}/pipewire-pulse.* \
278*4882a593Smuzhiyun    ${bindir}/pipewire-pulse \
279*4882a593Smuzhiyun"
280*4882a593SmuzhiyunRDEPENDS:${PN}-pulse += " \
281*4882a593Smuzhiyun    ${PN}-modules-protocol-pulse \
282*4882a593Smuzhiyun"
283*4882a593Smuzhiyun
284*4882a593Smuzhiyun# ALSA plugin to redirect audio to pipewire.
285*4882a593SmuzhiyunFILES:${PN}-alsa = "\
286*4882a593Smuzhiyun    ${libdir}/alsa-lib/* \
287*4882a593Smuzhiyun    ${datadir}/alsa/alsa.conf.d/* \
288*4882a593Smuzhiyun"
289*4882a593Smuzhiyun
290*4882a593Smuzhiyun# JACK drop-in libraries to redirect audio to pipewire.
291*4882a593SmuzhiyunCONFFILES:${PN}-jack = "${datadir}/pipewire/jack.conf"
292*4882a593SmuzhiyunFILES:${PN}-jack = "\
293*4882a593Smuzhiyun    ${bindir}/pw-jack \
294*4882a593Smuzhiyun    ${datadir}/pipewire/jack.conf \
295*4882a593Smuzhiyun    ${libdir}/${PW_MODULE_SUBDIR}/jack/libjack*.so.* \
296*4882a593Smuzhiyun"
297*4882a593Smuzhiyun
298*4882a593Smuzhiyun# Dynamic SPA plugin packages (see set_dynamic_metapkg_rdepends).
299*4882a593SmuzhiyunFILES:${PN}-spa-plugins = ""
300*4882a593SmuzhiyunRRECOMMENDS:${PN}-spa-plugins += "${PN}-spa-plugins-meta"
301*4882a593Smuzhiyun
302*4882a593SmuzhiyunFILES:${PN}-spa-plugins-bluez5 += " \
303*4882a593Smuzhiyun    ${datadir}/${SPA_SUBDIR}/bluez5/* \
304*4882a593Smuzhiyun"
305*4882a593Smuzhiyun
306*4882a593SmuzhiyunFILES:${PN}-spa-tools = " \
307*4882a593Smuzhiyun    ${bindir}/spa-* \
308*4882a593Smuzhiyun"
309*4882a593Smuzhiyun
310*4882a593Smuzhiyun# Dynamic PipeWire module packages (see set_dynamic_metapkg_rdepends).
311*4882a593SmuzhiyunFILES:${PN}-modules = ""
312*4882a593SmuzhiyunRRECOMMENDS:${PN}-modules += "${PN}-modules-meta"
313*4882a593Smuzhiyun
314*4882a593SmuzhiyunCONFFILES:${PN}-modules-rt = "${datadir}/pipewire/client-rt.conf"
315*4882a593SmuzhiyunFILES:${PN}-modules-rt += " \
316*4882a593Smuzhiyun    ${datadir}/pipewire/client-rt.conf \
317*4882a593Smuzhiyun    "
318*4882a593Smuzhiyun
319*4882a593SmuzhiyunCONFFILES:${PN}-modules-filter-chain = "${datadir}/pipewire/filter-chain/*"
320*4882a593SmuzhiyunFILES:${PN}-modules-filter-chain += " \
321*4882a593Smuzhiyun    ${datadir}/pipewire/filter-chain/* \
322*4882a593Smuzhiyun"
323*4882a593Smuzhiyun
324*4882a593SmuzhiyunFILES:${PN}-alsa-card-profile = " \
325*4882a593Smuzhiyun    ${datadir}/alsa-card-profile/* \
326*4882a593Smuzhiyun    ${nonarch_base_libdir}/udev/rules.d/90-pipewire-alsa.rules \
327*4882a593Smuzhiyun"
328*4882a593Smuzhiyun
329*4882a593Smuzhiyun# V4L2 interface emulator for sending/receiving data between PipeWire and V4L2 applications.
330*4882a593SmuzhiyunFILES:${PN}-v4l2 += " \
331*4882a593Smuzhiyun    ${bindir}/pw-v4l2 \
332*4882a593Smuzhiyun    ${libdir}/${PW_MODULE_SUBDIR}/v4l2/libpw-v4l2.so \
333*4882a593Smuzhiyun"
334*4882a593Smuzhiyun
335*4882a593SmuzhiyunFILES:gstreamer1.0-pipewire = " \
336*4882a593Smuzhiyun    ${libdir}/gstreamer-1.0/* \
337*4882a593Smuzhiyun"
338