[PATCH] gnu: home: Add support for home-pipewire-service

This adds a set of home shepherd services which will start the required

services for a functional pipewire setup.

* gnu/home/services/sound.scm (home-pipewire-shepherd-service),

(home-pipewire-pulse-shepherd-service), (home-wireplumber-shepherd-service),

(home-pipewire-shepherd-services), (generate-doc): new procedures.

(home-pipewire-service-type): new service type.

(home-pipewire-configuration): new struct.

* doc/guix.texi (Sound Home Services): document it.

doc/guix.texi | 34 +++++++++++++++++

gnu/home/services/sound.scm | 74 ++++++++++++++++++++++++++++++++++++-

2 files changed, 107 insertions(+), 1 deletion(-)

Toggle diff (157 lines)

diff –git a/doc/guix.texi b/doc/guix.texi

index 7f8d8d66e9..0b19c9301f 100644

— a/doc/guix.texi

+++ b/doc/guix.texi

@@ -116,6 +116,7 @@

Copyright @copyright{} 2023 Karl Hallsby@*

Copyright @copyright{} 2023 Nathaniel Nicandro@*

Copyright @copyright{} 2023 Tanguy Le Carrour@*

+Copyright @copyright{} 2023 Brian Cully@*

Permission is granted to copy, distribute and/or modify this document

under the terms of the GNU Free Documentation License, Version 1.3 or

@@ -43563,6 +43564,39 @@ Sound Home Services

This is the multicast address used by default by the two services above.

@end defvar

+@cindex PipeWire, home service

+

+@uref{https://pipewire.org, PipeWire} provides a low-latency,

+graph-based audio and video processing service. In addition to its

+native protocol, it can also be used as a replacement for both JACK and

+PulseAudio.

+

+@defvar home-pipewire-service-type

+This provides the service definition for @command{pipewire}, which will

+run on login. Its value is a @code{home-pipewire-configuration} object.

+

+To start the service, add it to the @code{service} field of your

+@code{home-environment}, such as:

+

+@lisp

+(service home-pipewire-service-type)

+@end lisp

+

+@deftp {Data Type} home-pipewire-configuration

+Available @code{home-pipewire-configuration} fields are:

+

+@table @asis

+@item @code{pipewire} (default: @code{pipewire}) (type: file-like)

+The PipeWire package to use.

+

+@item @code{wireplumber} (default: @code{wireplumber}) (type: file-like)

+The WirePlumber package to use.

+

+@item @code{enable-pulseaudio?} (default: @code{#t}) (type: boolean)

+Enable PulseAudio replacement.

+@end table

+@end deftp

+

@node Mail Home Services

@subsection Mail Home Services

diff –git a/gnu/home/services/sound.scm b/gnu/home/services/sound.scm

index 22c1a99250..94d8bc7482 100644

— a/gnu/home/services/sound.scm

+++ b/gnu/home/services/sound.scm

@@ -1,5 +1,6 @@

;;; GNU Guix — Functional package management for GNU

;;; Copyright © 2023 Ludovic Courtès <ludo@gnu.org>

+;;; Copyright © 2023 Brian Cully <bjc@spork.org>

;;;

;;; This file is part of GNU Guix.

;;;

@@ -19,13 +20,77 @@

(define-module (gnu home services sound)

#:use-module (gnu home services)

#:use-module (gnu home services shepherd)

+ #:use-module (gnu packages linux)

+ #:use-module (gnu services configuration)

#:use-module (guix records)

#:use-module (guix gexp)

#:use-module (srfi srfi-1)

+ #:use-module (srfi srfi-26)

#:use-module (ice-9 match)

#:export (home-pulseaudio-rtp-sink-service-type

home-pulseaudio-rtp-source-service-type

– %pulseaudio-rtp-multicast-address))

+ %pulseaudio-rtp-multicast-address

+

+ home-pipewire-configuration

+ home-pipewire-service-type))

+

+

+;;;

+;;; PipeWire support.

+;;;

+(define-configuration/no-serialization home-pipewire-configuration

+ (pipewire (file-like pipewire) “The PipeWire package to use.”)

+ (wireplumber (file-like wireplumber) “The WirePlumber package to use.”)

+ (enable-pulseaudio? (boolean #t) “Enable PulseAudio replacement.”))

+

+(define (home-pipewire-shepherd-service config)

+ (shepherd-service

+ (documentation “PipeWire screen and audio sharing.”)

+ (provision ‘(pipewire))

+ (requirement ‘(dbus))

+ (start #~(make-forkexec-constructor

+ (list #$(file-append

+ (home-pipewire-configuration-pipewire config)

+ “/bin/pipewire”))))))

+

+(define (home-pipewire-pulseaudio-shepherd-service config)

+ (shepherd-service

+ (documentation “Drop-in PulseAudio replacement service for PipeWire.”)

+ (provision ‘(pipewire-pulseaudio))

+ (requirement ‘(pipewire))

+ (start #~(make-forkexec-constructor

+ (list #$(file-append

+ (home-pipewire-configuration-pipewire config)

+ “/bin/pipewire-pulse”))))))

+

+(define (home-wireplumber-shepherd-service config)

+ (shepherd-service

+ (documentation “WirePlumber session management for PipeWire.”)

+ (provision ‘(wireplumber))

+ (requirement ‘(pipewire))

+ (start #~(make-forkexec-constructor

+ (list #$(file-append

+ (home-pipewire-configuration-wireplumber config)

+ “/bin/wireplumber”))))))

+

+(define (home-pipewire-shepherd-services config)

+ (define shepherd-services

+ (filter

+ identity

+ (list home-pipewire-shepherd-service home-wireplumber-shepherd-service

+ (and (home-pipewire-configuration-enable-pulseaudio? config)

+ home-pipewire-pulseaudio-shepherd-service))))

+ (map (cut <> config) shepherd-services))

+

+(define home-pipewire-service-type

+ (service-type

+ (name ‘pipewire)

+ (extensions

+ (list (service-extension home-shepherd-service-type

+ home-pipewire-shepherd-services)))

+ (description

+ “Start essential PipeWire services.”)

+ (default-value (home-pipewire-configuration))))

;;;

@@ -149,3 +214,10 @@ (define home-pulseaudio-rtp-source-service-type

“Define a PulseAudio source to receive audio broadcasted over RTP by

another PulseAudio instance.”)

(default-value %pulseaudio-rtp-multicast-address)))

+

+

+;;;

+;;; Generate documentation.

+;;;

+(define (generate-doc)

+ (configuration->documentation ‘home-pipewire-configuration))

base-commit: c11b92a8aae6fe7fad0da8257ec28f5009c37b35

2.40.1

Read more here: Source link