GNU bug report logs - #63863
[PATCH] gnu: home: Add support for home-pipewire-service

Previous Next

Package: guix-patches;

Reported by: Brian Cully <bjc <at> spork.org>

Date: Fri, 2 Jun 2023 23:06:02 UTC

Severity: normal

Tags: patch

Done: Oleg Pykhalov <go.wigust <at> gmail.com>

Bug is archived. No further changes may be made.

To add a comment to this bug, you must first unarchive it, by sending
a message to control AT debbugs.gnu.org, with unarchive 63863 in the body.
You can then email your comments to 63863 AT debbugs.gnu.org in the normal way.

Toggle the display of automated, internal messages from the tracker.

View this report as an mbox folder, status mbox, maintainer mbox


Report forwarded to , guix-patches <at> gnu.org:
bug#63863; Package guix-patches. (Fri, 02 Jun 2023 23:06:02 GMT) Full text and rfc822 format available.

Acknowledgement sent to Brian Cully <bjc <at> spork.org>:
New bug report received and forwarded. Copy sent to , guix-patches <at> gnu.org. (Fri, 02 Jun 2023 23:06:02 GMT) Full text and rfc822 format available.

Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):

From: Brian Cully <bjc <at> spork.org>
To: guix-patches <at> gnu.org
Cc: Brian Cully <bjc <at> spork.org>
Subject: [PATCH] gnu: home: Add support for home-pipewire-service
Date: Fri,  2 Jun 2023 19:04:27 -0400
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(-)

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 <at> gnu.org>
+;;; Copyright © 2023 Brian Cully <bjc <at> 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





Information forwarded to guix-patches <at> gnu.org:
bug#63863; Package guix-patches. (Fri, 09 Jun 2023 20:23:02 GMT) Full text and rfc822 format available.

Message #8 received at 63863 <at> debbugs.gnu.org (full text, mbox):

From: Ludovic Courtès <ludo <at> gnu.org>
To: Brian Cully <bjc <at> spork.org>
Cc: , 63863 <at> debbugs.gnu.org
Subject: Re: bug#63863: [PATCH] gnu: home: Add support for
 home-pipewire-service
Date: Fri, 09 Jun 2023 22:22:12 +0200
Hi,

Brian Cully <bjc <at> spork.org> skribis:

> 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.

[...]

> +@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.

Could you explain why a Home service is necessary (I’d expect it to be
started on-demand via D-Bus or similar, like PulseAudio)?

Also, please leave two spaces after end-of-sentence periods (this eases
navigation in Emacs).

> +@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.

Could you add a few words saying what each of these packages does,
especially the second one.

> +@item @code{enable-pulseaudio?} (default: @code{#t}) (type: boolean)
> +Enable PulseAudio replacement.

Maybe add: “When true, PulseAudio applications will talk to PipeWire,
which will handle them as if they were ``native'' PipeWire
applications.” (I’m making it up, but you get the idea.)

> +;;; PipeWire support.
> +;;;
> +(define-configuration/no-serialization home-pipewire-configuration

Please leave an empty line after the comment.

> +(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"))))))

Please add the ‘stop’ method or the process will never be stopped.  :-)

> +   (start #~(make-forkexec-constructor
> +             (list #$(file-append
> +                      (home-pipewire-configuration-pipewire config)
> +                      "/bin/pipewire-pulse"))))))

Same here…

> +   (start #~(make-forkexec-constructor
> +             (list #$(file-append
> +                      (home-pipewire-configuration-wireplumber config)
> +                      "/bin/wireplumber"))))))

… and here.


> +(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))

Rather:

  (cons* (home-pipewire-shepherd-service config)
         (home-wireplumber-shepherd-service config)
         (if …
             (list (home-pipewire-pulseaudio-shepherd-service config))
             '()))

> +   (description
> +    "Start essential PipeWire services.")

Can you add a couple of sentences?  That’s useful when running ‘guix
home search’ or similar.

> +
> +
> +;;;
> +;;; Generate documentation.
> +;;;
> +(define (generate-doc)
> +  (configuration->documentation 'home-pipewire-configuration))

This is unused, please remove it.

Could you send a v2?

Thanks!

Ludo’.




Information forwarded to guix-patches <at> gnu.org:
bug#63863; Package guix-patches. (Mon, 12 Jun 2023 05:51:01 GMT) Full text and rfc822 format available.

Message #11 received at 63863 <at> debbugs.gnu.org (full text, mbox):

From: Andrew Tropin <andrew <at> trop.in>
To: Brian Cully <bjc <at> spork.org>, 63863 <at> debbugs.gnu.org
Subject: Re: [bug#63863] [PATCH] gnu: home: Add support for
 home-pipewire-service
Date: Mon, 12 Jun 2023 09:50:31 +0400
[Message part 1 (text/plain, inline)]
On 2023-06-02 19:04, Brian Cully via Guix-patches via wrote:

> 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(-)
>
> 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 <at> gnu.org>
> +;;; Copyright © 2023 Brian Cully <bjc <at> 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.")

The description seems a little bit missleading, while PipeWire can do
screensharing, it's not only or even primary role.

> +   (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

Hi Brian,

Thank you for the patch!  You may also want to add pipewire backend for
alsa:
https://git.sr.ht/~abcdw/rde/tree/525f8c7f25783c6b8fa55f21c8e62237bc0d4a04/src/rde/features/linux.scm#L100

-- 
Best regards,
Andrew Tropin
[signature.asc (application/pgp-signature, inline)]

Information forwarded to guix-patches <at> gnu.org:
bug#63863; Package guix-patches. (Mon, 12 Jun 2023 16:16:01 GMT) Full text and rfc822 format available.

Message #14 received at 63863 <at> debbugs.gnu.org (full text, mbox):

From: Brian Cully <bjc <at> spork.org>
To: Andrew Tropin <andrew <at> trop.in>
Cc: 63863 <at> debbugs.gnu.org
Subject: Re: [bug#63863] [PATCH] gnu: home: Add support for
 home-pipewire-service
Date: Mon, 12 Jun 2023 11:56:20 -0400
Andrew Tropin <andrew <at> trop.in> writes:
>> +(define (home-pipewire-shepherd-service config)
>> +  (shepherd-service
>> +   (documentation "PipeWire screen and audio sharing.")
>
> The description seems a little bit missleading, while PipeWire 
> can do
> screensharing, it's not only or even primary role.

I'm not sure I understand the objection. Would you rather I 
mention its audio capabilities before screen sharing? Or would 
something like "PipeWire media processing" seem to suit it better 
for you?

Truth be told, I find succinctly describing PipeWire for this 
context to be pretty difficult. It does a lot, and it's all pretty 
abstract. PipeWire is just plumbing for services people actually 
care about, and I don't think "PipeWire make media worky" is going 
to fly 😉.

> Thank you for the patch!  You may also want to add pipewire 
> backend for
> alsa:
> https://git.sr.ht/~abcdw/rde/tree/525f8c7f25783c6b8fa55f21c8e62237bc0d4a04/src/rde/features/linux.scm#L100

Thanks for the pointer. I'll try to dig through the documentation 
to see what I can do. I find the Linux sound ecosystem to be 
pretty confusing. For instance: I thought ALSA was the backend 
that PipeWire used on Linux already, so I don't understand how 
ALSA can also use PipeWire as a backend.

My use for this patch was Wayland-motivated, and everything 
outside of basic functionality (screen sharing and playing audio 
from Firefox and MPD) wasn't something I spent much time on — 
since I really don't know much about it — in the hopes that we 
could provide a minimum level of service for people and add better 
support as people needed it as time went on.

-bjc




Information forwarded to guix-patches <at> gnu.org:
bug#63863; Package guix-patches. (Tue, 13 Jun 2023 04:40:02 GMT) Full text and rfc822 format available.

Message #17 received at 63863 <at> debbugs.gnu.org (full text, mbox):

From: Andrew Tropin <andrew <at> trop.in>
To: Brian Cully <bjc <at> spork.org>
Cc: 63863 <at> debbugs.gnu.org
Subject: Re: [bug#63863] [PATCH] gnu: home: Add support for
 home-pipewire-service
Date: Tue, 13 Jun 2023 08:39:16 +0400
[Message part 1 (text/plain, inline)]
On 2023-06-12 11:56, Brian Cully wrote:

> Andrew Tropin <andrew <at> trop.in> writes:
>>> +(define (home-pipewire-shepherd-service config)
>>> +  (shepherd-service
>>> +   (documentation "PipeWire screen and audio sharing.")
>>
>> The description seems a little bit missleading, while PipeWire 
>> can do
>> screensharing, it's not only or even primary role.
>
> I'm not sure I understand the objection. Would you rather I 
> mention its audio capabilities before screen sharing?

Nope.

> Or would something like "PipeWire media processing" seem to suit it
> better for you?

Yep.

> Truth be told, I find succinctly describing PipeWire for this 
> context to be pretty difficult. It does a lot, and it's all pretty 
> abstract. PipeWire is just plumbing for services people actually 
> care about, and I don't think "PipeWire make media worky" is going 
> to fly 😉.
>

"PipeWire make media worky" would work great! :D jk

Real-time multimedia capturing, processing and playback or low-latency,
graph-based audio and video processing engine or something like that.

>> Thank you for the patch!  You may also want to add pipewire 
>> backend for
>> alsa:
>> https://git.sr.ht/~abcdw/rde/tree/525f8c7f25783c6b8fa55f21c8e62237bc0d4a04/src/rde/features/linux.scm#L100
>
> Thanks for the pointer. I'll try to dig through the documentation 
> to see what I can do. I find the Linux sound ecosystem to be 
> pretty confusing. For instance: I thought ALSA was the backend 
> that PipeWire used on Linux already, so I don't understand how 
> ALSA can also use PipeWire as a backend.
>
> My use for this patch was Wayland-motivated, and everything 
> outside of basic functionality (screen sharing and playing audio 
> from Firefox and MPD) wasn't something I spent much time on — 
> since I really don't know much about it — in the hopes that we 
> could provide a minimum level of service for people and add better 
> support as people needed it as time went on.

Yep, we have similiar use cases in rde and configuration mentioned
earlier serves them quite well.  According to Alsa: I don't have deep
knowledge in this area too, but according to my knowledge pipewire can
be loaded as a shared library and injected into alsa user-facing API to
process requests, so maybe a backend for ALSA-based applications or
middleend for ALSA will be more apropriate name for the pipewire role
here :)

Anyway, without the config above alsamixer doesn't work on my system,
probably with some configuration it's possible to make it work, but
bypassing pipewire, however I think it would be nice to go full
pipewire.

-- 
Best regards,
Andrew Tropin
[signature.asc (application/pgp-signature, inline)]

Information forwarded to guix-patches <at> gnu.org:
bug#63863; Package guix-patches. (Tue, 13 Jun 2023 14:02:02 GMT) Full text and rfc822 format available.

Message #20 received at 63863 <at> debbugs.gnu.org (full text, mbox):

From: Brian Cully <bjc <at> spork.org>
To: Andrew Tropin <andrew <at> trop.in>
Cc: 63863 <at> debbugs.gnu.org
Subject: Re: [bug#63863] [PATCH] gnu: home: Add support for
 home-pipewire-service
Date: Tue, 13 Jun 2023 08:20:47 -0400
Andrew Tropin <andrew <at> trop.in> writes:
>> Or would something like "PipeWire media processing" seem to 
>> suit it
>> better for you?
>
> Yep.

Works for me.

> Anyway, without the config above alsamixer doesn't work on my 
> system,
> probably with some configuration it's possible to make it work, 
> but
> bypassing pipewire, however I think it would be nice to go full
> pipewire.

I've just tried using ‘alsamixer’ from the ‘alsa-utils’ package 
this morning, and it works for me without any additional 
configuration. It shows both ‘Card’ and ‘Chip’ to be ‘PulseAudio’, 
and volume control works. Although, that is with PulseAudio 
emulation enabled. Should the ALSA configuration always be added? 
Or just if it's enabled in configuration (possibly defaulting #t)?

-bjc




Information forwarded to guix-patches <at> gnu.org:
bug#63863; Package guix-patches. (Wed, 14 Jun 2023 09:09:01 GMT) Full text and rfc822 format available.

Message #23 received at 63863 <at> debbugs.gnu.org (full text, mbox):

From: Andrew Tropin <andrew <at> trop.in>
To: Brian Cully <bjc <at> spork.org>
Cc: 63863 <at> debbugs.gnu.org
Subject: Re: [bug#63863] [PATCH] gnu: home: Add support for
 home-pipewire-service
Date: Wed, 14 Jun 2023 13:08:36 +0400
[Message part 1 (text/plain, inline)]
On 2023-06-13 08:20, Brian Cully wrote:

> Andrew Tropin <andrew <at> trop.in> writes:
>>> Or would something like "PipeWire media processing" seem to 
>>> suit it
>>> better for you?
>>
>> Yep.
>
> Works for me.
>
>> Anyway, without the config above alsamixer doesn't work on my 
>> system,
>> probably with some configuration it's possible to make it work, 
>> but
>> bypassing pipewire, however I think it would be nice to go full
>> pipewire.
>
> I've just tried using ‘alsamixer’ from the ‘alsa-utils’ package 
> this morning, and it works for me without any additional 
> configuration. It shows both ‘Card’ and ‘Chip’ to be ‘PulseAudio’, 
> and volume control works. Although, that is with PulseAudio 
> emulation enabled.

With config mentioned earlier it shows PipeWire in Card and Chip.

> Should the ALSA configuration always be added?  Or just if it's
> enabled in configuration (possibly defaulting #t)?

Yep, I think it should be always added by default.

Also, it make sense to disable autospawn of pulseaudio to prevent
accidential interference.

Like this:
https://git.sr.ht/~abcdw/rde/tree/4365d81c0775beb0f623b756423e17275dbb2d00/src/rde/features/linux.scm#L128

-- 
Best regards,
Andrew Tropin
[signature.asc (application/pgp-signature, inline)]

Information forwarded to , guix-patches <at> gnu.org:
bug#63863; Package guix-patches. (Thu, 15 Jun 2023 13:18:01 GMT) Full text and rfc822 format available.

Message #26 received at 63863 <at> debbugs.gnu.org (full text, mbox):

From: Brian Cully <bjc <at> spork.org>
To: 63863 <at> debbugs.gnu.org
Cc: Brian Cully <bjc <at> spork.org>
Subject: [PATCH v2] gnu: home: Add support for home-pipewire-service
Date: Thu, 15 Jun 2023 09:16:34 -0400
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)
(home-pipewire-asoundrc), (home-pipewire-xdg-configuration): new procedures.
(home-pipewire-service-type): new service type.
(home-pipewire-configuration): new struct.
(home-pipewire-disable-pulseaudio-auto-start): new variable.
* doc/guix.texi (Sound Home Services): document it.
---
 doc/guix.texi               |  47 +++++++++++++++
 gnu/home/services/sound.scm | 115 +++++++++++++++++++++++++++++++++++-
 2 files changed, 161 insertions(+), 1 deletion(-)

diff --git a/doc/guix.texi b/doc/guix.texi
index 9232c82b4b..ee50d7a324 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
@@ -43635,6 +43636,52 @@ 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.
+
+While PipeWire provides the media processing and API, it does not,
+directly, know about devices such as sound cards, nor how you might want
+to connect applications, hardware, and media processing
+filters. Instead, PipeWire relies on a @dfn{session manager} to specify
+all these relationships. While you may use any session manager you wish,
+for most people the
+@url{https://pipewire.pages.freedesktop.org/wireplumber/, WirePlumber}
+session manager, a reference implementation provided by the PipeWire
+project itself, suffices, and that is the one
+@code{home-pipewire-service-type} uses.
+
+@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
+@end defvar
+
+@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)
+When true, enable PipeWire's PulseAudio emulation support, allowing
+PulseAudio clients to use PipeWire transparently.
+@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..5463255e8c 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 <at> gnu.org>
+;;; Copyright © 2023 Brian Cully <bjc <at> spork.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -19,13 +20,125 @@
 (define-module (gnu home services sound)
   #:use-module (gnu home services)
   #:use-module (gnu home services shepherd)
+  #:use-module (gnu home services xdg)
+  #: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 (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)
+   "When true, enable PipeWire's PulseAudio emulation support, allowing
+PulseAudio clients to use PipeWire transparently."))
+
+(define (home-pipewire-shepherd-service config)
+  (shepherd-service
+   (documentation "PipeWire media processing.")
+   (provision '(pipewire))
+   (requirement '(dbus))
+   (start #~(make-forkexec-constructor
+             (list #$(file-append
+                      (home-pipewire-configuration-pipewire config)
+                      "/bin/pipewire"))))
+   (stop #~(make-kill-destructor))))
+
+(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"))))
+   (stop #~(make-kill-destructor))))
+
+(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"))))
+   (stop #~(make-kill-destructor))))
+
+(define (home-pipewire-shepherd-services config)
+  (cons* (home-pipewire-shepherd-service config)
+         (home-wireplumber-shepherd-service config)
+         (if (home-pipewire-configuration-enable-pulseaudio? config)
+             (list (home-pipewire-pulseaudio-shepherd-service config))
+             '())))
+
+(define (home-pipewire-asoundrc config)
+  (mixed-text-file
+   "asoundrc"
+   #~(string-append
+      "<"
+      #$(file-append
+         (home-pipewire-configuration-pipewire config)
+         "/share/alsa/alsa.conf.d/50-pipewire.conf")
+      ">\n"
+      "<"
+      #$(file-append
+         (home-pipewire-configuration-pipewire config)
+         "/share/alsa/alsa.conf.d/99-pipewire-default.conf")
+      ">\n"
+      "pcm_type.pipewire {\n"
+      "  lib \""
+      #$(file-append
+         (home-pipewire-configuration-pipewire config)
+         "/lib/alsa-lib/libasound_module_pcm_pipewire.so")
+      "\"\n}\n"
+      "ctl_type.pipewire {\n"
+      "  lib \""
+      #$(file-append
+         (home-pipewire-configuration-pipewire config)
+         "/lib/alsa-lib/libasound_module_ctl_pipewire.so")
+      "\"\n}\n")))
+
+(define home-pipewire-disable-pulseaudio-auto-start
+  (plain-file "client.conf" "autospawn = no"))
+
+(define (home-pipewire-xdg-configuration config)
+  (cons* `("alsa/asoundrc" ,(home-pipewire-asoundrc config))
+         (if (home-pipewire-configuration-enable-pulseaudio? config)
+             `(("pulse/client.conf"
+                ,home-pipewire-disable-pulseaudio-auto-start))
+             '())))
+
+(define home-pipewire-service-type
+  (service-type
+   (name 'pipewire)
+   (extensions
+    (list (service-extension home-shepherd-service-type
+                             home-pipewire-shepherd-services)
+          (service-extension home-xdg-configuration-files-service-type
+                             home-pipewire-xdg-configuration)))
+   (description
+    "Start essential PipeWire services.")
+   (default-value (home-pipewire-configuration))))
 
 
 ;;;

base-commit: f74df2ab879fc5457982bbc85b7455a90e82317d
-- 
2.40.1





Information forwarded to guix-patches <at> gnu.org:
bug#63863; Package guix-patches. (Thu, 15 Jun 2023 13:24:02 GMT) Full text and rfc822 format available.

Message #29 received at 63863 <at> debbugs.gnu.org (full text, mbox):

From: Brian Cully <bjc <at> spork.org>
To: Brian Cully <bjc <at> spork.org>
Cc: 63863 <at> debbugs.gnu.org
Subject: Re: [PATCH v2] gnu: home: Add support for home-pipewire-service
Date: Thu, 15 Jun 2023 09:19:53 -0400
This address most of the issues, I hope.

* I've added a config for ALSA.
* I'm disabling autospawn for PulseAudio when ‘enable-pulseaudio?’ 
 is #t
* I've added a paragraph to the documentation explaining 
 WireGuard.
* The missing Shepherd ‘stop’ fields are no longer missing.
* I've changed the wording for the Shepherd ‘pipewire’ service 
 documentation.
* The documentation generation function has been removed.
* I've reworded the ‘enable-pulseaudio?’ configuration field of 
 ‘home-pipewire-configuration’.

-bjc




Information forwarded to , guix-patches <at> gnu.org:
bug#63863; Package guix-patches. (Thu, 15 Jun 2023 13:28:01 GMT) Full text and rfc822 format available.

Message #32 received at 63863 <at> debbugs.gnu.org (full text, mbox):

From: Brian Cully <bjc <at> spork.org>
To: 63863 <at> debbugs.gnu.org
Cc: Brian Cully <bjc <at> spork.org>
Subject: [PATCH v3] gnu: home: Add support for home-pipewire-service
Date: Thu, 15 Jun 2023 09:26:59 -0400
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)
(home-pipewire-asoundrc), (home-pipewire-xdg-configuration): new procedures.
(home-pipewire-service-type): new service type.
(home-pipewire-configuration): new struct.
(home-pipewire-disable-pulseaudio-auto-start): new variable.
* doc/guix.texi (Sound Home Services): document it.
---
 doc/guix.texi               |  46 +++++++++++++++
 gnu/home/services/sound.scm | 115 +++++++++++++++++++++++++++++++++++-
 2 files changed, 160 insertions(+), 1 deletion(-)

diff --git a/doc/guix.texi b/doc/guix.texi
index 9232c82b4b..c5e7066a4c 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
@@ -43635,6 +43636,51 @@ 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.
+
+While PipeWire provides the media processing and API, it does not,
+directly, know about devices such as sound cards, nor how you might want
+to connect applications, hardware, and media processing filters.
+Instead, PipeWire relies on a @dfn{session manager} to specify all these
+relationships.  While you may use any session manager you wish, for most
+people the @url{https://pipewire.pages.freedesktop.org/wireplumber/,
+WirePlumber} session manager, a reference implementation provided by the
+PipeWire project itself, suffices, and that is the one
+@code{home-pipewire-service-type} uses.
+
+@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
+@end defvar
+
+@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)
+When true, enable PipeWire's PulseAudio emulation support, allowing
+PulseAudio clients to use PipeWire transparently.
+@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..5463255e8c 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 <at> gnu.org>
+;;; Copyright © 2023 Brian Cully <bjc <at> spork.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -19,13 +20,125 @@
 (define-module (gnu home services sound)
   #:use-module (gnu home services)
   #:use-module (gnu home services shepherd)
+  #:use-module (gnu home services xdg)
+  #: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 (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)
+   "When true, enable PipeWire's PulseAudio emulation support, allowing
+PulseAudio clients to use PipeWire transparently."))
+
+(define (home-pipewire-shepherd-service config)
+  (shepherd-service
+   (documentation "PipeWire media processing.")
+   (provision '(pipewire))
+   (requirement '(dbus))
+   (start #~(make-forkexec-constructor
+             (list #$(file-append
+                      (home-pipewire-configuration-pipewire config)
+                      "/bin/pipewire"))))
+   (stop #~(make-kill-destructor))))
+
+(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"))))
+   (stop #~(make-kill-destructor))))
+
+(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"))))
+   (stop #~(make-kill-destructor))))
+
+(define (home-pipewire-shepherd-services config)
+  (cons* (home-pipewire-shepherd-service config)
+         (home-wireplumber-shepherd-service config)
+         (if (home-pipewire-configuration-enable-pulseaudio? config)
+             (list (home-pipewire-pulseaudio-shepherd-service config))
+             '())))
+
+(define (home-pipewire-asoundrc config)
+  (mixed-text-file
+   "asoundrc"
+   #~(string-append
+      "<"
+      #$(file-append
+         (home-pipewire-configuration-pipewire config)
+         "/share/alsa/alsa.conf.d/50-pipewire.conf")
+      ">\n"
+      "<"
+      #$(file-append
+         (home-pipewire-configuration-pipewire config)
+         "/share/alsa/alsa.conf.d/99-pipewire-default.conf")
+      ">\n"
+      "pcm_type.pipewire {\n"
+      "  lib \""
+      #$(file-append
+         (home-pipewire-configuration-pipewire config)
+         "/lib/alsa-lib/libasound_module_pcm_pipewire.so")
+      "\"\n}\n"
+      "ctl_type.pipewire {\n"
+      "  lib \""
+      #$(file-append
+         (home-pipewire-configuration-pipewire config)
+         "/lib/alsa-lib/libasound_module_ctl_pipewire.so")
+      "\"\n}\n")))
+
+(define home-pipewire-disable-pulseaudio-auto-start
+  (plain-file "client.conf" "autospawn = no"))
+
+(define (home-pipewire-xdg-configuration config)
+  (cons* `("alsa/asoundrc" ,(home-pipewire-asoundrc config))
+         (if (home-pipewire-configuration-enable-pulseaudio? config)
+             `(("pulse/client.conf"
+                ,home-pipewire-disable-pulseaudio-auto-start))
+             '())))
+
+(define home-pipewire-service-type
+  (service-type
+   (name 'pipewire)
+   (extensions
+    (list (service-extension home-shepherd-service-type
+                             home-pipewire-shepherd-services)
+          (service-extension home-xdg-configuration-files-service-type
+                             home-pipewire-xdg-configuration)))
+   (description
+    "Start essential PipeWire services.")
+   (default-value (home-pipewire-configuration))))
 
 
 ;;;

base-commit: f74df2ab879fc5457982bbc85b7455a90e82317d
-- 
2.40.1





Information forwarded to guix-patches <at> gnu.org:
bug#63863; Package guix-patches. (Thu, 15 Jun 2023 13:28:02 GMT) Full text and rfc822 format available.

Message #35 received at 63863 <at> debbugs.gnu.org (full text, mbox):

From: Brian Cully <bjc <at> spork.org>
To: Brian Cully <bjc <at> spork.org>
Cc: 63863 <at> debbugs.gnu.org
Subject: Re: [PATCH v3] gnu: home: Add support for home-pipewire-service
Date: Thu, 15 Jun 2023 09:27:19 -0400
The only changes in this version are two spaces after a period.

-bjc




Information forwarded to , guix-patches <at> gnu.org:
bug#63863; Package guix-patches. (Tue, 20 Jun 2023 12:42:02 GMT) Full text and rfc822 format available.

Message #38 received at 63863 <at> debbugs.gnu.org (full text, mbox):

From: Brian Cully <bjc <at> spork.org>
To: 63863 <at> debbugs.gnu.org
Cc: Brian Cully <bjc <at> spork.org>
Subject: [PATCH v4 0/1] gnu: home: Add support for home-pipewire-service
Date: Tue, 20 Jun 2023 08:41:11 -0400
This patch iteration adds some more documentation. Specifically:

1) Explain why we need the Shepherd to start services,
2) document the Shepherd services started,
3) flesh out the JACK and PulseAudio emulation bits, and,
4) use @subsubheading to separate the PulseAudio RTP stuff from the
PipeWire stuff.

Regarding point 3, I looked at existing home-service documentation,
and used the style found in the shells section of the manual, rather
than trying to group everything under the @defvar for the
service-type, as is done in other parts (such as desktop services).

I did this because the sections in the sound services are more
verbose, so I felt it read better with @subsubheading where more
disparate topics could be synthesized into a more cohesive narrative
structure, leaving @defvar to explain the variables themselves. Also,
it meant I wouldn't have to make any major changes to the existing
PulseAudio RTP section, which I didn't write, and have only lightly
used.

Brian Cully (1):
  gnu: home: Add support for home-pipewire-service

 doc/guix.texi               |  73 +++++++++++++++++++++++
 gnu/home/services/sound.scm | 115 +++++++++++++++++++++++++++++++++++-
 2 files changed, 187 insertions(+), 1 deletion(-)


base-commit: bb09f3ac002a4f34177d42fd3ea0332f4b7fe7a6
-- 
2.40.1





Information forwarded to , guix-patches <at> gnu.org:
bug#63863; Package guix-patches. (Tue, 20 Jun 2023 12:42:02 GMT) Full text and rfc822 format available.

Message #41 received at 63863 <at> debbugs.gnu.org (full text, mbox):

From: Brian Cully <bjc <at> spork.org>
To: 63863 <at> debbugs.gnu.org
Cc: Brian Cully <bjc <at> spork.org>
Subject: [PATCH v4 1/1] gnu: home: Add support for home-pipewire-service
Date: Tue, 20 Jun 2023 08:41:12 -0400
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)
(home-pipewire-asoundrc), (home-pipewire-xdg-configuration): new procedures.
(home-pipewire-service-type): new service type.
(home-pipewire-configuration): new struct.
(home-pipewire-disable-pulseaudio-auto-start): new variable.
* doc/guix.texi (Sound Home Services): document it.
---
 doc/guix.texi               |  73 +++++++++++++++++++++++
 gnu/home/services/sound.scm | 115 +++++++++++++++++++++++++++++++++++-
 2 files changed, 187 insertions(+), 1 deletion(-)

diff --git a/doc/guix.texi b/doc/guix.texi
index c961f706ec..97c3c85d79 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
@@ -43678,6 +43679,7 @@ Sound Home Services
 
 @cindex PulseAudio, home service
 @cindex RTP, for PulseAudio
+@subsubheading PulseAudio RTP Streaming Services
 
 The following services dynamically reconfigure the
 @uref{https://pulseaudio.org,PulseAudio sound server}: they let you
@@ -43765,6 +43767,77 @@ Sound Home Services
 This is the multicast address used by default by the two services above.
 @end defvar
 
+@cindex PipeWire, home service
+@subsubheading 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.
+
+While PipeWire provides the media processing and API, it does not,
+directly, know about devices such as sound cards, nor how you might want
+to connect applications, hardware, and media processing filters.
+Instead, PipeWire relies on a @dfn{session manager} to specify all these
+relationships.  While you may use any session manager you wish, for most
+people the @url{https://pipewire.pages.freedesktop.org/wireplumber/,
+WirePlumber} session manager, a reference implementation provided by the
+PipeWire project itself, suffices, and that is the one
+@code{home-pipewire-service-type} uses.
+
+PipeWire can be used as a replacement for PulseAudio by setting
+@code{enable-pulseaudio?} to @code{#t} in
+@code{home-pipewire-configuration}, so that existing PulseAudio clients
+may use it without any further configuration.
+
+In addition, JACK clients may connect to PipeWire by using the
+@command{pw-jack} program, which comes with PipeWire. Simply prefix the
+command with @command{pw-jack} when you run it, and audio data should go
+through PipeWire:
+
+@example
+pw-jack mpv -ao=jack sound-file.wav
+@end example
+
+For more information on PulseAudio emulation, see
+@uref{https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/Config-PulseAudio},
+for JACK, see
+@uref{https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/Config-JACK}.
+
+As PipeWire does not use @code{dbus} to start its services on demand
+(as PulseAudio does), @code{home-pipewire-service-type} uses Shepherd
+to start services when logged in, provisioning the @code{pipewire},
+@code{wireplumber}, and, if configured, @code{pipewire-pulseaudio}
+services. @xref{Shepherd Home Service}.
+
+@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
+@end defvar
+
+@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)
+When true, enable PipeWire's PulseAudio emulation support, allowing
+PulseAudio clients to use PipeWire transparently.
+@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..5463255e8c 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 <at> gnu.org>
+;;; Copyright © 2023 Brian Cully <bjc <at> spork.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -19,13 +20,125 @@
 (define-module (gnu home services sound)
   #:use-module (gnu home services)
   #:use-module (gnu home services shepherd)
+  #:use-module (gnu home services xdg)
+  #: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 (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)
+   "When true, enable PipeWire's PulseAudio emulation support, allowing
+PulseAudio clients to use PipeWire transparently."))
+
+(define (home-pipewire-shepherd-service config)
+  (shepherd-service
+   (documentation "PipeWire media processing.")
+   (provision '(pipewire))
+   (requirement '(dbus))
+   (start #~(make-forkexec-constructor
+             (list #$(file-append
+                      (home-pipewire-configuration-pipewire config)
+                      "/bin/pipewire"))))
+   (stop #~(make-kill-destructor))))
+
+(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"))))
+   (stop #~(make-kill-destructor))))
+
+(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"))))
+   (stop #~(make-kill-destructor))))
+
+(define (home-pipewire-shepherd-services config)
+  (cons* (home-pipewire-shepherd-service config)
+         (home-wireplumber-shepherd-service config)
+         (if (home-pipewire-configuration-enable-pulseaudio? config)
+             (list (home-pipewire-pulseaudio-shepherd-service config))
+             '())))
+
+(define (home-pipewire-asoundrc config)
+  (mixed-text-file
+   "asoundrc"
+   #~(string-append
+      "<"
+      #$(file-append
+         (home-pipewire-configuration-pipewire config)
+         "/share/alsa/alsa.conf.d/50-pipewire.conf")
+      ">\n"
+      "<"
+      #$(file-append
+         (home-pipewire-configuration-pipewire config)
+         "/share/alsa/alsa.conf.d/99-pipewire-default.conf")
+      ">\n"
+      "pcm_type.pipewire {\n"
+      "  lib \""
+      #$(file-append
+         (home-pipewire-configuration-pipewire config)
+         "/lib/alsa-lib/libasound_module_pcm_pipewire.so")
+      "\"\n}\n"
+      "ctl_type.pipewire {\n"
+      "  lib \""
+      #$(file-append
+         (home-pipewire-configuration-pipewire config)
+         "/lib/alsa-lib/libasound_module_ctl_pipewire.so")
+      "\"\n}\n")))
+
+(define home-pipewire-disable-pulseaudio-auto-start
+  (plain-file "client.conf" "autospawn = no"))
+
+(define (home-pipewire-xdg-configuration config)
+  (cons* `("alsa/asoundrc" ,(home-pipewire-asoundrc config))
+         (if (home-pipewire-configuration-enable-pulseaudio? config)
+             `(("pulse/client.conf"
+                ,home-pipewire-disable-pulseaudio-auto-start))
+             '())))
+
+(define home-pipewire-service-type
+  (service-type
+   (name 'pipewire)
+   (extensions
+    (list (service-extension home-shepherd-service-type
+                             home-pipewire-shepherd-services)
+          (service-extension home-xdg-configuration-files-service-type
+                             home-pipewire-xdg-configuration)))
+   (description
+    "Start essential PipeWire services.")
+   (default-value (home-pipewire-configuration))))
 
 
 ;;;
-- 
2.40.1





Information forwarded to , guix-patches <at> gnu.org:
bug#63863; Package guix-patches. (Sun, 02 Jul 2023 12:40:01 GMT) Full text and rfc822 format available.

Message #44 received at 63863 <at> debbugs.gnu.org (full text, mbox):

From: Brian Cully <bjc <at> spork.org>
To: 63863 <at> debbugs.gnu.org
Cc: Brian Cully <bjc <at> spork.org>
Subject: [PATCH v5 0/1] gnu: home: Add support for home-pipewire-service
Date: Sun,  2 Jul 2023 08:39:40 -0400
Two sentences were missing a double space after a period. Otherwise
this is unchanged from v4.

Are there any remaining issues to be addressed, or can this finally be
merged?

Brian Cully (1):
  gnu: home: Add support for home-pipewire-service

 doc/guix.texi               |  73 +++++++++++++++++++++++
 gnu/home/services/sound.scm | 115 +++++++++++++++++++++++++++++++++++-
 2 files changed, 187 insertions(+), 1 deletion(-)


base-commit: a919a16898e7219fdd26bdfe33a9959e7156d59d
-- 
2.40.1





Information forwarded to , guix-patches <at> gnu.org:
bug#63863; Package guix-patches. (Sun, 02 Jul 2023 12:40:02 GMT) Full text and rfc822 format available.

Message #47 received at 63863 <at> debbugs.gnu.org (full text, mbox):

From: Brian Cully <bjc <at> spork.org>
To: 63863 <at> debbugs.gnu.org
Cc: Brian Cully <bjc <at> spork.org>
Subject: [PATCH v5 1/1] gnu: home: Add support for home-pipewire-service
Date: Sun,  2 Jul 2023 08:39:41 -0400
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)
(home-pipewire-asoundrc), (home-pipewire-xdg-configuration): new procedures.
(home-pipewire-service-type): new service type.
(home-pipewire-configuration): new struct.
(home-pipewire-disable-pulseaudio-auto-start): new variable.
* doc/guix.texi (Sound Home Services): document it.
---
 doc/guix.texi               |  73 +++++++++++++++++++++++
 gnu/home/services/sound.scm | 115 +++++++++++++++++++++++++++++++++++-
 2 files changed, 187 insertions(+), 1 deletion(-)

diff --git a/doc/guix.texi b/doc/guix.texi
index 853396f776..7a6b7ebc3a 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
@@ -43742,6 +43743,7 @@ Sound Home Services
 
 @cindex PulseAudio, home service
 @cindex RTP, for PulseAudio
+@subsubheading PulseAudio RTP Streaming Services
 
 The following services dynamically reconfigure the
 @uref{https://pulseaudio.org,PulseAudio sound server}: they let you
@@ -43829,6 +43831,77 @@ Sound Home Services
 This is the multicast address used by default by the two services above.
 @end defvar
 
+@cindex PipeWire, home service
+@subsubheading 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.
+
+While PipeWire provides the media processing and API, it does not,
+directly, know about devices such as sound cards, nor how you might want
+to connect applications, hardware, and media processing filters.
+Instead, PipeWire relies on a @dfn{session manager} to specify all these
+relationships.  While you may use any session manager you wish, for most
+people the @url{https://pipewire.pages.freedesktop.org/wireplumber/,
+WirePlumber} session manager, a reference implementation provided by the
+PipeWire project itself, suffices, and that is the one
+@code{home-pipewire-service-type} uses.
+
+PipeWire can be used as a replacement for PulseAudio by setting
+@code{enable-pulseaudio?} to @code{#t} in
+@code{home-pipewire-configuration}, so that existing PulseAudio clients
+may use it without any further configuration.
+
+In addition, JACK clients may connect to PipeWire by using the
+@command{pw-jack} program, which comes with PipeWire.  Simply prefix the
+command with @command{pw-jack} when you run it, and audio data should go
+through PipeWire:
+
+@example
+pw-jack mpv -ao=jack sound-file.wav
+@end example
+
+For more information on PulseAudio emulation, see
+@uref{https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/Config-PulseAudio},
+for JACK, see
+@uref{https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/Config-JACK}.
+
+As PipeWire does not use @code{dbus} to start its services on demand
+(as PulseAudio does), @code{home-pipewire-service-type} uses Shepherd
+to start services when logged in, provisioning the @code{pipewire},
+@code{wireplumber}, and, if configured, @code{pipewire-pulseaudio}
+services.  @xref{Shepherd Home Service}.
+
+@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
+@end defvar
+
+@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)
+When true, enable PipeWire's PulseAudio emulation support, allowing
+PulseAudio clients to use PipeWire transparently.
+@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..5463255e8c 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 <at> gnu.org>
+;;; Copyright © 2023 Brian Cully <bjc <at> spork.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -19,13 +20,125 @@
 (define-module (gnu home services sound)
   #:use-module (gnu home services)
   #:use-module (gnu home services shepherd)
+  #:use-module (gnu home services xdg)
+  #: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 (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)
+   "When true, enable PipeWire's PulseAudio emulation support, allowing
+PulseAudio clients to use PipeWire transparently."))
+
+(define (home-pipewire-shepherd-service config)
+  (shepherd-service
+   (documentation "PipeWire media processing.")
+   (provision '(pipewire))
+   (requirement '(dbus))
+   (start #~(make-forkexec-constructor
+             (list #$(file-append
+                      (home-pipewire-configuration-pipewire config)
+                      "/bin/pipewire"))))
+   (stop #~(make-kill-destructor))))
+
+(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"))))
+   (stop #~(make-kill-destructor))))
+
+(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"))))
+   (stop #~(make-kill-destructor))))
+
+(define (home-pipewire-shepherd-services config)
+  (cons* (home-pipewire-shepherd-service config)
+         (home-wireplumber-shepherd-service config)
+         (if (home-pipewire-configuration-enable-pulseaudio? config)
+             (list (home-pipewire-pulseaudio-shepherd-service config))
+             '())))
+
+(define (home-pipewire-asoundrc config)
+  (mixed-text-file
+   "asoundrc"
+   #~(string-append
+      "<"
+      #$(file-append
+         (home-pipewire-configuration-pipewire config)
+         "/share/alsa/alsa.conf.d/50-pipewire.conf")
+      ">\n"
+      "<"
+      #$(file-append
+         (home-pipewire-configuration-pipewire config)
+         "/share/alsa/alsa.conf.d/99-pipewire-default.conf")
+      ">\n"
+      "pcm_type.pipewire {\n"
+      "  lib \""
+      #$(file-append
+         (home-pipewire-configuration-pipewire config)
+         "/lib/alsa-lib/libasound_module_pcm_pipewire.so")
+      "\"\n}\n"
+      "ctl_type.pipewire {\n"
+      "  lib \""
+      #$(file-append
+         (home-pipewire-configuration-pipewire config)
+         "/lib/alsa-lib/libasound_module_ctl_pipewire.so")
+      "\"\n}\n")))
+
+(define home-pipewire-disable-pulseaudio-auto-start
+  (plain-file "client.conf" "autospawn = no"))
+
+(define (home-pipewire-xdg-configuration config)
+  (cons* `("alsa/asoundrc" ,(home-pipewire-asoundrc config))
+         (if (home-pipewire-configuration-enable-pulseaudio? config)
+             `(("pulse/client.conf"
+                ,home-pipewire-disable-pulseaudio-auto-start))
+             '())))
+
+(define home-pipewire-service-type
+  (service-type
+   (name 'pipewire)
+   (extensions
+    (list (service-extension home-shepherd-service-type
+                             home-pipewire-shepherd-services)
+          (service-extension home-xdg-configuration-files-service-type
+                             home-pipewire-xdg-configuration)))
+   (description
+    "Start essential PipeWire services.")
+   (default-value (home-pipewire-configuration))))
 
 
 ;;;
-- 
2.40.1





Information forwarded to guix-patches <at> gnu.org:
bug#63863; Package guix-patches. (Wed, 23 Aug 2023 08:26:02 GMT) Full text and rfc822 format available.

Message #50 received at 63863 <at> debbugs.gnu.org (full text, mbox):

From: Tanguy LE CARROUR <tanguy <at> bioneland.org>
To: Brian Cully <bjc <at> spork.org>
Cc: 63863 <at> debbugs.gnu.org
Subject: [PATCH v5 1/1] gnu: home: Add support for home-pipewire-service
Date: Wed, 23 Aug 2023 10:25:29 +0200
Hi Brian,

I came across you patch by chance and, as I had been waiting for a
PipeWire home service for a long time, I couldn't resist trying it out!

I copied it to my channel, added it to my home configuration,
reconfigured and… go this message:

```
guix home: error: service 'pipewire' requires 'dbus', which is not provided by any service
```

I was a little confused, because in the documentation, you wrote
"As PipeWire does not use @code{dbus} to start its services on demand".

I added it anyway, reconfigured and after rebooting (I currently have a
problem with shepherd not being properly reloaded! 😞) I can see
the new services as being "stopped" in `herd status` output.
Are they stopped on purpose? Who is supposed to start them?
Sorry, I'm not sure I understand how it's supposed to work.
I've tried joining a JitsiMeet conference. The video seems to be
working, but my mic‘ is marked as "broken".

I've had to roll back my home configuration for the time being,
but if there are more things I can try to make it work and help your
patch being merged, I would be more than happy to try them!

Anyway, thanks for you work on this patch! Can't wait for it to be
merged.

-- 
Tanguy




Information forwarded to guix-patches <at> gnu.org:
bug#63863; Package guix-patches. (Wed, 23 Aug 2023 18:46:02 GMT) Full text and rfc822 format available.

Message #53 received at 63863 <at> debbugs.gnu.org (full text, mbox):

From: brian <bjc <at> spork.org>
To: Tanguy LE CARROUR <tanguy <at> bioneland.org>
Cc: 63863 <at> debbugs.gnu.org
Subject: Re: [bug#63863] [PATCH v5 1/1] gnu: home: Add support for
 home-pipewire-service
Date: Wed, 23 Aug 2023 14:44:55 -0400
Tanguy LE CARROUR <tanguy <at> bioneland.org> writes:

> I came across you patch by chance and, as I had been waiting for a
> PipeWire home service for a long time, I couldn't resist trying it out!

Thanks for helping test it!

> I copied it to my channel, added it to my home configuration,
> reconfigured and… go this message:
>
> ```
> guix home: error: service 'pipewire' requires 'dbus', which is not provided by any service
> ```
>
> I was a little confused, because in the documentation, you wrote
> "As PipeWire does not use @code{dbus} to start its services on demand".

Pipewire does not use dbus to start its services on demand, but it does
use it for communication between the pipewire daemon itself and the
session manager (typically wireplumber).

I guess this is confusing. I'll see if I can explain this
better. Although part of me wants to drop the dbus verbiage from the
documentation entirely, since it only exists right now to explain things
to people who might be migrating from Pulseaudio and used to not needing
a Shepherd service. I don't want to write a deep explainer on how DBus
is used. It's not the place for that, nor do I even know that much about
it.

> I added it anyway, reconfigured and after rebooting (I currently have a
> problem with shepherd not being properly reloaded! 😞) I can see
> the new services as being "stopped" in `herd status` output.
> Are they stopped on purpose? Who is supposed to start them?

The services should all start automatically, but they do all depend on
a user-session level dbus daemon running. I see you're using dbus, but
are you using it from ‘home-dbus-service-type’?

> Sorry, I'm not sure I understand how it's supposed to work.
> I've tried joining a JitsiMeet conference. The video seems to be
> working, but my mic‘ is marked as "broken".

If video sharing under Wayland is working, then I'd say that means
Pipewire+Wireguard are working. The mic doesn't work, but can you hear
audio through your speakers or headphones? Are your audio devices
visible? Are you using Pulseaudio emulation (which I recommend you do)?

> Anyway, thanks for you work on this patch! Can't wait for it to be
> merged.

/me pokes Ludo 😉

-bjc




Information forwarded to guix-patches <at> gnu.org:
bug#63863; Package guix-patches. (Fri, 25 Aug 2023 06:45:03 GMT) Full text and rfc822 format available.

Message #56 received at 63863 <at> debbugs.gnu.org (full text, mbox):

From: Tanguy LE CARROUR <tanguy <at> bioneland.org>
To: brian <bjc <at> spork.org>
Cc: 63863 <at> debbugs.gnu.org
Subject: Re: [bug#63863] [PATCH v5 1/1] gnu: home: Add support for
 home-pipewire-service
Date: Fri, 25 Aug 2023 08:44:06 +0200
Hi Brian,


Quoting brian (2023-08-23 20:44:55)
> Tanguy LE CARROUR <tanguy <at> bioneland.org> writes:
> > I copied it to my channel, added it to my home configuration,
> > reconfigured and… go this message:
> >
> > ```
> > guix home: error: service 'pipewire' requires 'dbus', which is not provided by any service
> > ```
> >
> > I was a little confused, because in the documentation, you wrote
> > "As PipeWire does not use @code{dbus} to start its services on demand".
> 
> Pipewire does not use dbus to start its services on demand, but it does
> use it for communication between the pipewire daemon itself and the
> session manager (typically wireplumber).
> 
> I guess this is confusing. I'll see if I can explain this
> better. Although part of me wants to drop the dbus verbiage from the
> documentation entirely, since it only exists right now to explain things
> to people who might be migrating from Pulseaudio and used to not needing
> a Shepherd service. I don't want to write a deep explainer on how DBus
> is used. It's not the place for that, nor do I even know that much about
> it.

It's a bit confusing, indeed! … but I'm easily confused! 😅
What would be great would a mechanism to "pull/manage" service dependencies.


> > I added it anyway, reconfigured and after rebooting (I currently have a
> > problem with shepherd not being properly reloaded! 😞) I can see
> > the new services as being "stopped" in `herd status` output.
> > Are they stopped on purpose? Who is supposed to start them?
> 
> The services should all start automatically, but they do all depend on
> a user-session level dbus daemon running. I see you're using dbus, but
> are you using it from ‘home-dbus-service-type’?

Yes, I added it in my home configuration.


> > Sorry, I'm not sure I understand how it's supposed to work.
> > I've tried joining a JitsiMeet conference. The video seems to be
> > working, but my mic‘ is marked as "broken".
> 
> If video sharing under Wayland is working, then I'd say that means
> Pipewire+Wireguard are working. The mic doesn't work, but can you hear
> audio through your speakers or headphones? Are your audio devices
> visible? Are you using Pulseaudio emulation (which I recommend you do)?

I'll give it another try at the week-end! 🤞


> > Anyway, thanks for you work on this patch! Can't wait for it to be
> > merged.
> 
> /me pokes Ludo 😉

Poke poke 👉


-- 
Tanguy




Information forwarded to guix-patches <at> gnu.org:
bug#63863; Package guix-patches. (Wed, 11 Oct 2023 14:25:02 GMT) Full text and rfc822 format available.

Message #59 received at 63863 <at> debbugs.gnu.org (full text, mbox):

From: taosabella <at> riseup.net
To: 63863 <at> debbugs.gnu.org
Subject: Re: [bug#63863] [PATCH v5 1/1] gnu: home: Add support for 
 home-pipewire-service
Date: Wed, 11 Oct 2023 11:34:44 +0000
I've tested this patch and it works perfectly, with all Shepherd
services starting after activation and a reboot. Ludovic, are there any
other blockers to getting this into Guix proper?




Information forwarded to guix-patches <at> gnu.org:
bug#63863; Package guix-patches. (Sun, 05 Nov 2023 15:11:01 GMT) Full text and rfc822 format available.

Message #62 received at 63863 <at> debbugs.gnu.org (full text, mbox):

From: Jakob Honal <jakob.honal <at> gmx.de>
To: 63863 <at> debbugs.gnu.org
Date: Sun, 5 Nov 2023 16:09:48 +0100
[Message part 1 (text/html, inline)]

Information forwarded to ludo <at> gnu.org, andrew <at> trop.in, guix-patches <at> gnu.org:
bug#63863; Package guix-patches. (Sun, 12 Nov 2023 14:17:01 GMT) Full text and rfc822 format available.

Message #65 received at 63863 <at> debbugs.gnu.org (full text, mbox):

From: Hilton Chain <hako <at> ultrarare.space>
To: Brian Cully <bjc <at> spork.org>
Cc: 63863 <at> debbugs.gnu.org
Subject: Re: [bug#63863] [PATCH v5 1/1] gnu: home: Add support for
 home-pipewire-service
Date: Sun, 12 Nov 2023 22:14:20 +0800
Hi Brian,

Tested the patch in my setup, it works well :)

(Some comments are in and after the quote.)

On Sun, 02 Jul 2023 20:39:41 +0800,
Brian Cully via Guix-patches via wrote:
>
> 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)
> (home-pipewire-asoundrc), (home-pipewire-xdg-configuration): new procedures.
> (home-pipewire-service-type): new service type.
> (home-pipewire-configuration): new struct.
> (home-pipewire-disable-pulseaudio-auto-start): new variable.
> * doc/guix.texi (Sound Home Services): document it.
> ---
>  doc/guix.texi               |  73 +++++++++++++++++++++++
>  gnu/home/services/sound.scm | 115 +++++++++++++++++++++++++++++++++++-
>  2 files changed, 187 insertions(+), 1 deletion(-)
>
> diff --git a/doc/guix.texi b/doc/guix.texi
> index 853396f776..7a6b7ebc3a 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
> @@ -43742,6 +43743,7 @@ Sound Home Services
>
>  @cindex PulseAudio, home service
>  @cindex RTP, for PulseAudio
> +@subsubheading PulseAudio RTP Streaming Services
>
>  The following services dynamically reconfigure the
>  @uref{https://pulseaudio.org,PulseAudio sound server}: they let you
> @@ -43829,6 +43831,77 @@ Sound Home Services
>  This is the multicast address used by default by the two services above.
>  @end defvar
>
> +@cindex PipeWire, home service
> +@subsubheading 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.
> +
> +While PipeWire provides the media processing and API, it does not,
> +directly, know about devices such as sound cards, nor how you might want
> +to connect applications, hardware, and media processing filters.
> +Instead, PipeWire relies on a @dfn{session manager} to specify all these
> +relationships.  While you may use any session manager you wish, for most
> +people the @url{https://pipewire.pages.freedesktop.org/wireplumber/,
> +WirePlumber} session manager, a reference implementation provided by the
> +PipeWire project itself, suffices, and that is the one
> +@code{home-pipewire-service-type} uses.
> +
> +PipeWire can be used as a replacement for PulseAudio by setting
> +@code{enable-pulseaudio?} to @code{#t} in
> +@code{home-pipewire-configuration}, so that existing PulseAudio clients
> +may use it without any further configuration.
> +
> +In addition, JACK clients may connect to PipeWire by using the
> +@command{pw-jack} program, which comes with PipeWire.  Simply prefix the
> +command with @command{pw-jack} when you run it, and audio data should go
> +through PipeWire:
> +
> +@example
> +pw-jack mpv -ao=jack sound-file.wav
> +@end example
> +
> +For more information on PulseAudio emulation, see
> +@uref{https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/Config-PulseAudio},
> +for JACK, see
> +@uref{https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/Config-JACK}.
> +
> +As PipeWire does not use @code{dbus} to start its services on demand
> +(as PulseAudio does), @code{home-pipewire-service-type} uses Shepherd
> +to start services when logged in, provisioning the @code{pipewire},
> +@code{wireplumber}, and, if configured, @code{pipewire-pulseaudio}
> +services.  @xref{Shepherd Home Service}.
> +
> +@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
> +@end defvar
> +
> +@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)
> +When true, enable PipeWire's PulseAudio emulation support, allowing
> +PulseAudio clients to use PipeWire transparently.
> +@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..5463255e8c 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 <at> gnu.org>
> +;;; Copyright © 2023 Brian Cully <bjc <at> spork.org>
>  ;;;
>  ;;; This file is part of GNU Guix.
>  ;;;
> @@ -19,13 +20,125 @@
>  (define-module (gnu home services sound)
>    #:use-module (gnu home services)
>    #:use-module (gnu home services shepherd)
> +  #:use-module (gnu home services xdg)
> +  #: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 (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)
> +   "When true, enable PipeWire's PulseAudio emulation support, allowing
> +PulseAudio clients to use PipeWire transparently."))
> +
> +(define (home-pipewire-shepherd-service config)
> +  (shepherd-service
> +   (documentation "PipeWire media processing.")
> +   (provision '(pipewire))
> +   (requirement '(dbus))
> +   (start #~(make-forkexec-constructor
> +             (list #$(file-append
> +                      (home-pipewire-configuration-pipewire config)
> +                      "/bin/pipewire"))))
> +   (stop #~(make-kill-destructor))))
> +
> +(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"))))
> +   (stop #~(make-kill-destructor))))
> +
> +(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"))))
> +   (stop #~(make-kill-destructor))))
> +
> +(define (home-pipewire-shepherd-services config)
> +  (cons* (home-pipewire-shepherd-service config)
> +         (home-wireplumber-shepherd-service config)
> +         (if (home-pipewire-configuration-enable-pulseaudio? config)
> +             (list (home-pipewire-pulseaudio-shepherd-service config))
> +             '())))
> +
> +(define (home-pipewire-asoundrc config)
> +  (mixed-text-file
> +   "asoundrc"
> +   #~(string-append
> +      "<"
> +      #$(file-append
> +         (home-pipewire-configuration-pipewire config)
> +         "/share/alsa/alsa.conf.d/50-pipewire.conf")
> +      ">\n"
> +      "<"
> +      #$(file-append
> +         (home-pipewire-configuration-pipewire config)
> +         "/share/alsa/alsa.conf.d/99-pipewire-default.conf")
> +      ">\n"
> +      "pcm_type.pipewire {\n"
> +      "  lib \""
> +      #$(file-append
> +         (home-pipewire-configuration-pipewire config)
> +         "/lib/alsa-lib/libasound_module_pcm_pipewire.so")
> +      "\"\n}\n"
> +      "ctl_type.pipewire {\n"
> +      "  lib \""
> +      #$(file-append
> +         (home-pipewire-configuration-pipewire config)
> +         "/lib/alsa-lib/libasound_module_ctl_pipewire.so")
> +      "\"\n}\n")))


I'd prefer the following:
--8<---------------cut here---------------start------------->8---
(define (home-pipewire-asoundrc config)
  (match-record config <home-pipewire-configuration>
    (pipewire)
    (mixed-text-file
     "asoundrc"
     "<" pipewire "/share/alsa/alsa.conf.d/50-pipewire.conf>\n"
     "<" pipewire "/share/alsa/alsa.conf.d/99-pipewire-default.conf>\n"
     "pcm_type.pipewire {\n"
     "  lib \"" pipewire "/lib/alsa-lib/libasound_module_pcm_pipewire.so\"\n"
     "}\n"
     "ctl_type.pipewire {\n"
     "  lib \"" pipewire "/lib/alsa-lib/libasound_module_ctl_pipewire.so\"\n"
     "}\n")))
--8<---------------cut here---------------end--------------->8---

or:
--8<---------------cut here---------------start------------->8---
(define (home-pipewire-asoundrc config)
  (match-record config <home-pipewire-configuration>
    (pipewire)
    (mixed-text-file
     "asoundrc"
     #~(begin
         (use-modules (ice-9 format))
         (format #f "~
<~a/share/alsa/alsa.conf.d/50-pipewire.conf>
<~@*~a/share/alsa/alsa.conf.d/99-pipewire-default.conf>
pcm_type.pipewire {
  lib \"~@*~a/lib/alsa-lib/libasound_module_pcm_pipewire.so\"
}
ctl_type.pipewire {
  lib \"~@*~a/lib/alsa-lib/libasound_module_ctl_pipewire.so\"
}~%" #$pipewire)))))
--8<---------------cut here---------------end--------------->8---


> +
> +(define home-pipewire-disable-pulseaudio-auto-start
> +  (plain-file "client.conf" "autospawn = no"))
> +
> +(define (home-pipewire-xdg-configuration config)
> +  (cons* `("alsa/asoundrc" ,(home-pipewire-asoundrc config))
> +         (if (home-pipewire-configuration-enable-pulseaudio? config)
> +             `(("pulse/client.conf"
> +                ,home-pipewire-disable-pulseaudio-auto-start))
> +             '())))
> +
> +(define home-pipewire-service-type
> +  (service-type
> +   (name 'pipewire)
> +   (extensions
> +    (list (service-extension home-shepherd-service-type
> +                             home-pipewire-shepherd-services)
> +          (service-extension home-xdg-configuration-files-service-type
> +                             home-pipewire-xdg-configuration)))
> +   (description
> +    "Start essential PipeWire services.")
> +   (default-value (home-pipewire-configuration))))
>
>  
>  ;;;
> --
> 2.40.1


One thing to note: the wireplumber package is built with elogind integration, so
it fails to start when elogind is not present:
--8<---------------cut here---------------start------------->8---
[wireplumber] failed to start systemd logind monitor: -2 (No such file or directory)
--8<---------------cut here---------------end--------------->8---

I think we can add a wireplumber variant built with "-Delogind=disabled" and
maybe mention it in the documentation.

Thanks




Information forwarded to guix-patches <at> gnu.org:
bug#63863; Package guix-patches. (Sat, 16 Dec 2023 15:18:02 GMT) Full text and rfc822 format available.

Message #68 received at 63863 <at> debbugs.gnu.org (full text, mbox):

From: Brian Cully <bjc <at> spork.org>
To: Hilton Chain <hako <at> ultrarare.space>
Cc: 63863 <at> debbugs.gnu.org
Subject: Re: [bug#63863] [PATCH v5 1/1] gnu: home: Add support for
 home-pipewire-service
Date: Sat, 16 Dec 2023 10:17:21 -0500

Hilton Chain <hako <at> ultrarare.space> writes:

> I'd prefer the following:
> 
> (define (home-pipewire-asoundrc config)
>  (match-record config <home-pipewire-configuration>
>    (pipewire)
>    (mixed-text-file
>     "asoundrc"
>     "<" pipewire "/share/alsa/alsa.conf.d/50-pipewire.conf>\n"
>     "<" pipewire "/share/alsa/alsa.conf.d/99-pipewire-default.conf>\n"
>     "pcm_type.pipewire {\n"
>     "  lib \"" pipewire "/lib/alsa-lib/libasound_module_pcm_pipewire.so\"\n"
>     "}\n"
>     "ctl_type.pipewire {\n"
>     "  lib \"" pipewire "/lib/alsa-lib/libasound_module_ctl_pipewire.so\"\n"
>     "}\n")))
> 
> 
> or:
> 
> (define (home-pipewire-asoundrc config)
>  (match-record config <home-pipewire-configuration>
>    (pipewire)
>    (mixed-text-file
>     "asoundrc"
>     #~(begin
>         (use-modules (ice-9 format))
>         (format #f "~
> <~a/share/alsa/alsa.conf.d/50-pipewire.conf>
> <~@*~a/share/alsa/alsa.conf.d/99-pipewire-default.conf>
> pcm_type.pipewire {
>  lib \"~@*~a/lib/alsa-lib/libasound_module_pcm_pipewire.so\"
> }
> ctl_type.pipewire {
>  lib \"~@*~a/lib/alsa-lib/libasound_module_ctl_pipewire.so\"
> }~%" #$pipewire)))))

I prefer the former to the latter; I often find ‘format’ strings to be pretty confusing, and the documentation doesn't tend to help much. I know I'm not alone in this, and since this is fairly simple, I'll use the straight concatenation, which has the additional benefit of preserving indentation.

> One thing to note: the wireplumber package is built with elogind integration, so
> it fails to start when elogind is not present:
> 
> [wireplumber] failed to start systemd logind monitor: -2 (No such file or directory)
> 
> I think we can add a wireplumber variant built with "-Delogind=disabled" and
> maybe mention it in the documentation.

Sounds reasonable. I don't know how long wireplumber has been able to be built without systemd stuff, just that I tried running it with seatd/greetd and it failed. Have you got it working without elogind?

I'm not sure when I'll be able to have a look at it, so I'd rather the current patch go in, and we can add elogind-less variants afterwards.

--
-bjc




Information forwarded to , guix-patches <at> gnu.org:
bug#63863; Package guix-patches. (Sat, 16 Dec 2023 15:24:01 GMT) Full text and rfc822 format available.

Message #71 received at 63863 <at> debbugs.gnu.org (full text, mbox):

From: Brian Cully <bjc <at> spork.org>
To: 63863 <at> debbugs.gnu.org
Cc: Brian Cully <bjc <at> spork.org>
Subject: [PATCH v6] gnu: home: Add support for home-pipewire-service
Date: Sat, 16 Dec 2023 10:23:37 -0500
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)
(home-pipewire-asoundrc), (home-pipewire-xdg-configuration): new procedures.
(home-pipewire-service-type): new service type.
(home-pipewire-configuration): new struct.
(home-pipewire-disable-pulseaudio-auto-start): new variable.
* doc/guix.texi (Sound Home Services): document it.

Change-Id: I99e0ae860de91d459c3c554ec5503bf35f785a2a
---
 doc/guix.texi               |  72 +++++++++++++++++++++++++
 gnu/home/services/sound.scm | 102 +++++++++++++++++++++++++++++++++++-
 2 files changed, 173 insertions(+), 1 deletion(-)

diff --git a/doc/guix.texi b/doc/guix.texi
index e61a893af9..90888a514f 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -45050,6 +45050,7 @@ Sound Home Services
 
 @cindex PulseAudio, home service
 @cindex RTP, for PulseAudio
+@subsubheading PulseAudio RTP Streaming Services
 
 The following services dynamically reconfigure the
 @uref{https://pulseaudio.org,PulseAudio sound server}: they let you
@@ -45137,6 +45138,77 @@ Sound Home Services
 This is the multicast address used by default by the two services above.
 @end defvar
 
+@cindex PipeWire, home service
+@subsubheading 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.
+
+While PipeWire provides the media processing and API, it does not,
+directly, know about devices such as sound cards, nor how you might want
+to connect applications, hardware, and media processing filters.
+Instead, PipeWire relies on a @dfn{session manager} to specify all these
+relationships.  While you may use any session manager you wish, for most
+people the @url{https://pipewire.pages.freedesktop.org/wireplumber/,
+WirePlumber} session manager, a reference implementation provided by the
+PipeWire project itself, suffices, and that is the one
+@code{home-pipewire-service-type} uses.
+
+PipeWire can be used as a replacement for PulseAudio by setting
+@code{enable-pulseaudio?} to @code{#t} in
+@code{home-pipewire-configuration}, so that existing PulseAudio clients
+may use it without any further configuration.
+
+In addition, JACK clients may connect to PipeWire by using the
+@command{pw-jack} program, which comes with PipeWire.  Simply prefix the
+command with @command{pw-jack} when you run it, and audio data should go
+through PipeWire:
+
+@example
+pw-jack mpv -ao=jack sound-file.wav
+@end example
+
+For more information on PulseAudio emulation, see
+@uref{https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/Config-PulseAudio},
+for JACK, see
+@uref{https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/Config-JACK}.
+
+As PipeWire does not use @code{dbus} to start its services on demand
+(as PulseAudio does), @code{home-pipewire-service-type} uses Shepherd
+to start services when logged in, provisioning the @code{pipewire},
+@code{wireplumber}, and, if configured, @code{pipewire-pulseaudio}
+services.  @xref{Shepherd Home Service}.
+
+@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
+@end defvar
+
+@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)
+When true, enable PipeWire's PulseAudio emulation support, allowing
+PulseAudio clients to use PipeWire transparently.
+@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..313a57305b 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 <at> gnu.org>
+;;; Copyright © 2023 Brian Cully <bjc <at> spork.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -19,13 +20,112 @@
 (define-module (gnu home services sound)
   #:use-module (gnu home services)
   #:use-module (gnu home services shepherd)
+  #:use-module (gnu home services xdg)
+  #: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 (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)
+   "When true, enable PipeWire's PulseAudio emulation support, allowing
+PulseAudio clients to use PipeWire transparently."))
+
+(define (home-pipewire-shepherd-service config)
+  (shepherd-service
+   (documentation "PipeWire media processing.")
+   (provision '(pipewire))
+   (requirement '(dbus))
+   (start #~(make-forkexec-constructor
+             (list #$(file-append
+                      (home-pipewire-configuration-pipewire config)
+                      "/bin/pipewire"))))
+   (stop #~(make-kill-destructor))))
+
+(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"))))
+   (stop #~(make-kill-destructor))))
+
+(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"))))
+   (stop #~(make-kill-destructor))))
+
+(define (home-pipewire-shepherd-services config)
+  (cons* (home-pipewire-shepherd-service config)
+         (home-wireplumber-shepherd-service config)
+         (if (home-pipewire-configuration-enable-pulseaudio? config)
+             (list (home-pipewire-pulseaudio-shepherd-service config))
+             '())))
+
+(define (home-pipewire-asoundrc config)
+  (match-record config <home-pipewire-configuration>
+                (pipewire)
+    (mixed-text-file
+     "asoundrc"
+     "<" pipewire "/share/alsa/alsa.conf.d/50-pipewire.conf>\n"
+     "<" pipewire "/share/alsa/alsa.conf.d/99-pipewire-default.conf>\n"
+     "pcm_type.pipewire {\n"
+     "  lib \"" pipewire "/lib/alsa-lib/libasound_module_pcm_pipewire.so\"\n"
+     "}\n"
+     "ctl_type.pipewire {\n"
+     "  lib \"" pipewire "/lib/alsa-lib/libasound_module_ctl_pipewire.so\"\n"
+     "}\n")))
+
+(define home-pipewire-disable-pulseaudio-auto-start
+  (plain-file "client.conf" "autospawn = no"))
+
+(define (home-pipewire-xdg-configuration config)
+  (cons* `("alsa/asoundrc" ,(home-pipewire-asoundrc config))
+         (if (home-pipewire-configuration-enable-pulseaudio? config)
+             `(("pulse/client.conf"
+                ,home-pipewire-disable-pulseaudio-auto-start))
+             '())))
+
+(define home-pipewire-service-type
+  (service-type
+   (name 'pipewire)
+   (extensions
+    (list (service-extension home-shepherd-service-type
+                             home-pipewire-shepherd-services)
+          (service-extension home-xdg-configuration-files-service-type
+                             home-pipewire-xdg-configuration)))
+   (description
+    "Start essential PipeWire services.")
+   (default-value (home-pipewire-configuration))))
 
 
 ;;;

base-commit: d5298c5e334e56a9aabddcb62d312e63135864f6
-- 
2.41.0





Reply sent to Oleg Pykhalov <go.wigust <at> gmail.com>:
You have taken responsibility. (Wed, 20 Dec 2023 08:47:02 GMT) Full text and rfc822 format available.

Notification sent to Brian Cully <bjc <at> spork.org>:
bug acknowledged by developer. (Wed, 20 Dec 2023 08:47:02 GMT) Full text and rfc822 format available.

Message #76 received at 63863-done <at> debbugs.gnu.org (full text, mbox):

From: Oleg Pykhalov <go.wigust <at> gmail.com>
To: Brian Cully <bjc <at> spork.org>
Cc: Ludovic Courtès <ludo <at> gnu.org>, 63863-done <at> debbugs.gnu.org,
 Tanguy LE CARROUR <tanguy <at> bioneland.org>, Andrew Tropin <andrew <at> trop.in>
Subject: Re: [bug#63863] [PATCH v6] gnu: home: Add support for
 home-pipewire-service
Date: Wed, 20 Dec 2023 11:46:25 +0300
[Message part 1 (text/plain, inline)]
Hi Brian,

Brian Cully <bjc <at> spork.org> writes:

> 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),

The ‘home-pipewire-pulse-shepherd-service’ procedure is missing. Do you
have a code for this procedure or should it be removed from the commit
message?  The PipeWire service seems to work without it.

> (home-pipewire-shepherd-services)
> (home-pipewire-asoundrc), (home-pipewire-xdg-configuration): new procedures.
> (home-pipewire-service-type): new service type.
> (home-pipewire-configuration): new struct.
> (home-pipewire-disable-pulseaudio-auto-start): new variable.
> * doc/guix.texi (Sound Home Services): document it.
>
> Change-Id: I99e0ae860de91d459c3c554ec5503bf35f785a2a
> ---
>  doc/guix.texi               |  72 +++++++++++++++++++++++++
>  gnu/home/services/sound.scm | 102 +++++++++++++++++++++++++++++++++++-
>  2 files changed, 173 insertions(+), 1 deletion(-)
> ...
> base-commit: d5298c5e334e56a9aabddcb62d312e63135864f6

This is the third implementation of a PipeWire related home services
which I've found on the Internet. In the end all of them are the same
except variable naming. Also I've looked how NixOS and Gentoo GNU/Linux
distributions use PipeWire. Running it is a home service is the
recommended way by the upstream (user's systemd units are recommended by
the upstream to be correct) [1].

[1]: https://github.com/PipeWire/pipewire/blob/bd87902da6a2badae096e4679eedfe9da2e75d79/NEWS#L5573


The patch is tested with the following Guix home configuration:
--8<---------------cut here---------------start------------->8---
    (service home-dbus-service-type)
    (service home-pipewire-service-type)
--8<---------------cut here---------------end--------------->8---

The sound from speakers and microphone work.

Also I've packaged obs-pipewire-audio-capture package which works with
current PipeWire implementation.


I think we could merge the patch after getting
‘home-pipewire-pulse-shepherd-service’ or removing it from the commit
message, e.g.:
--8<---------------cut here---------------start------------->8---
gnu: home: Add 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-wireplumber-shepherd-service,
home-pipewire-shepherd-services, home-pipewire-asoundrc,
home-pipewire-xdg-configuration): New procedures.
(home-pipewire-service-type): New service type.
(home-pipewire-configuration): New struct.
(home-pipewire-disable-pulseaudio-auto-start): New variable.
* doc/guix.texi (Sound Home Services): Document it.
--8<---------------cut here---------------end--------------->8---

Brian, could you add the code for ‘home-pipewire-pulse-shepherd-service’
if it is required, please?


Thanks,
Oleg.
[signature.asc (application/pgp-signature, inline)]

Did not alter fixed versions and reopened. Request was from Debbugs Internal Request <help-debbugs <at> gnu.org> to internal_control <at> debbugs.gnu.org. (Wed, 20 Dec 2023 08:52:02 GMT) Full text and rfc822 format available.

Removed tag(s) patch. Request was from Oleg Pykhalov <go.wigust <at> gmail.com> to control <at> debbugs.gnu.org. (Wed, 20 Dec 2023 08:52:02 GMT) Full text and rfc822 format available.

Added tag(s) patch. Request was from Oleg Pykhalov <go.wigust <at> gmail.com> to control <at> debbugs.gnu.org. (Wed, 20 Dec 2023 08:56:02 GMT) Full text and rfc822 format available.

Information forwarded to , guix-patches <at> gnu.org:
bug#63863; Package guix-patches. (Fri, 22 Dec 2023 15:23:01 GMT) Full text and rfc822 format available.

Message #85 received at 63863 <at> debbugs.gnu.org (full text, mbox):

From: Brian Cully <bjc <at> spork.org>
To: 63863 <at> debbugs.gnu.org
Cc: Brian Cully <bjc <at> spork.org>
Subject: [PATCH v7] gnu: home: Add support for home-pipewire-service
Date: Fri, 22 Dec 2023 10:22:01 -0500
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-pulseaudio-shepherd-service), (home-wireplumber-shepherd-service),
(home-pipewire-shepherd-services)
(home-pipewire-asoundrc), (home-pipewire-xdg-configuration): new procedures.
(home-pipewire-service-type): new service type.
(home-pipewire-configuration): new struct.
(home-pipewire-disable-pulseaudio-auto-start): new variable.
* doc/guix.texi (Sound Home Services): document it.

Change-Id: I99e0ae860de91d459c3c554ec5503bf35f785a2a
---
 doc/guix.texi               |  72 +++++++++++++++++++++++++
 gnu/home/services/sound.scm | 102 +++++++++++++++++++++++++++++++++++-
 2 files changed, 173 insertions(+), 1 deletion(-)

diff --git a/doc/guix.texi b/doc/guix.texi
index e61a893af9..90888a514f 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -45050,6 +45050,7 @@ Sound Home Services
 
 @cindex PulseAudio, home service
 @cindex RTP, for PulseAudio
+@subsubheading PulseAudio RTP Streaming Services
 
 The following services dynamically reconfigure the
 @uref{https://pulseaudio.org,PulseAudio sound server}: they let you
@@ -45137,6 +45138,77 @@ Sound Home Services
 This is the multicast address used by default by the two services above.
 @end defvar
 
+@cindex PipeWire, home service
+@subsubheading 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.
+
+While PipeWire provides the media processing and API, it does not,
+directly, know about devices such as sound cards, nor how you might want
+to connect applications, hardware, and media processing filters.
+Instead, PipeWire relies on a @dfn{session manager} to specify all these
+relationships.  While you may use any session manager you wish, for most
+people the @url{https://pipewire.pages.freedesktop.org/wireplumber/,
+WirePlumber} session manager, a reference implementation provided by the
+PipeWire project itself, suffices, and that is the one
+@code{home-pipewire-service-type} uses.
+
+PipeWire can be used as a replacement for PulseAudio by setting
+@code{enable-pulseaudio?} to @code{#t} in
+@code{home-pipewire-configuration}, so that existing PulseAudio clients
+may use it without any further configuration.
+
+In addition, JACK clients may connect to PipeWire by using the
+@command{pw-jack} program, which comes with PipeWire.  Simply prefix the
+command with @command{pw-jack} when you run it, and audio data should go
+through PipeWire:
+
+@example
+pw-jack mpv -ao=jack sound-file.wav
+@end example
+
+For more information on PulseAudio emulation, see
+@uref{https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/Config-PulseAudio},
+for JACK, see
+@uref{https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/Config-JACK}.
+
+As PipeWire does not use @code{dbus} to start its services on demand
+(as PulseAudio does), @code{home-pipewire-service-type} uses Shepherd
+to start services when logged in, provisioning the @code{pipewire},
+@code{wireplumber}, and, if configured, @code{pipewire-pulseaudio}
+services.  @xref{Shepherd Home Service}.
+
+@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
+@end defvar
+
+@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)
+When true, enable PipeWire's PulseAudio emulation support, allowing
+PulseAudio clients to use PipeWire transparently.
+@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..313a57305b 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 <at> gnu.org>
+;;; Copyright © 2023 Brian Cully <bjc <at> spork.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -19,13 +20,112 @@
 (define-module (gnu home services sound)
   #:use-module (gnu home services)
   #:use-module (gnu home services shepherd)
+  #:use-module (gnu home services xdg)
+  #: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 (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)
+   "When true, enable PipeWire's PulseAudio emulation support, allowing
+PulseAudio clients to use PipeWire transparently."))
+
+(define (home-pipewire-shepherd-service config)
+  (shepherd-service
+   (documentation "PipeWire media processing.")
+   (provision '(pipewire))
+   (requirement '(dbus))
+   (start #~(make-forkexec-constructor
+             (list #$(file-append
+                      (home-pipewire-configuration-pipewire config)
+                      "/bin/pipewire"))))
+   (stop #~(make-kill-destructor))))
+
+(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"))))
+   (stop #~(make-kill-destructor))))
+
+(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"))))
+   (stop #~(make-kill-destructor))))
+
+(define (home-pipewire-shepherd-services config)
+  (cons* (home-pipewire-shepherd-service config)
+         (home-wireplumber-shepherd-service config)
+         (if (home-pipewire-configuration-enable-pulseaudio? config)
+             (list (home-pipewire-pulseaudio-shepherd-service config))
+             '())))
+
+(define (home-pipewire-asoundrc config)
+  (match-record config <home-pipewire-configuration>
+                (pipewire)
+    (mixed-text-file
+     "asoundrc"
+     "<" pipewire "/share/alsa/alsa.conf.d/50-pipewire.conf>\n"
+     "<" pipewire "/share/alsa/alsa.conf.d/99-pipewire-default.conf>\n"
+     "pcm_type.pipewire {\n"
+     "  lib \"" pipewire "/lib/alsa-lib/libasound_module_pcm_pipewire.so\"\n"
+     "}\n"
+     "ctl_type.pipewire {\n"
+     "  lib \"" pipewire "/lib/alsa-lib/libasound_module_ctl_pipewire.so\"\n"
+     "}\n")))
+
+(define home-pipewire-disable-pulseaudio-auto-start
+  (plain-file "client.conf" "autospawn = no"))
+
+(define (home-pipewire-xdg-configuration config)
+  (cons* `("alsa/asoundrc" ,(home-pipewire-asoundrc config))
+         (if (home-pipewire-configuration-enable-pulseaudio? config)
+             `(("pulse/client.conf"
+                ,home-pipewire-disable-pulseaudio-auto-start))
+             '())))
+
+(define home-pipewire-service-type
+  (service-type
+   (name 'pipewire)
+   (extensions
+    (list (service-extension home-shepherd-service-type
+                             home-pipewire-shepherd-services)
+          (service-extension home-xdg-configuration-files-service-type
+                             home-pipewire-xdg-configuration)))
+   (description
+    "Start essential PipeWire services.")
+   (default-value (home-pipewire-configuration))))
 
 
 ;;;

base-commit: d5298c5e334e56a9aabddcb62d312e63135864f6
-- 
2.41.0





Information forwarded to guix-patches <at> gnu.org:
bug#63863; Package guix-patches. (Fri, 22 Dec 2023 15:25:02 GMT) Full text and rfc822 format available.

Message #88 received at 63863 <at> debbugs.gnu.org (full text, mbox):

From: Brian Cully <bjc <at> spork.org>
To: 63863 <at> debbugs.gnu.org
Subject: Re: bug#63863: closed (Re: [bug#63863] [PATCH v6] gnu: home: Add
 support for home-pipewire-service)
Date: Fri, 22 Dec 2023 10:22:11 -0500
help-debbugs <at> gnu.org (GNU bug Tracking System) writes:

> Your bug report
>
> #63863: [PATCH] gnu: home: Add support for home-pipewire-service
>
> which was filed against the guix-patches package, has been 
> closed.

Was this intentional?

> The ‘home-pipewire-pulse-shepherd-service’ procedure is 
> missing. Do you
> have a code for this procedure or should it be removed from the 
> commit
> message?  The PipeWire service seems to work without it.

I'd renamed it to ‘home-pulseaudio-shepherd-service’ and forgot to 
update the commit message; v7 will have it fixed.

-bjc




Reply sent to Oleg Pykhalov <go.wigust <at> gmail.com>:
You have taken responsibility. (Tue, 26 Dec 2023 12:59:02 GMT) Full text and rfc822 format available.

Notification sent to Brian Cully <bjc <at> spork.org>:
bug acknowledged by developer. (Tue, 26 Dec 2023 12:59:02 GMT) Full text and rfc822 format available.

Message #93 received at 63863-done <at> debbugs.gnu.org (full text, mbox):

From: Oleg Pykhalov <go.wigust <at> gmail.com>
To: Brian Cully <bjc <at> spork.org>
Cc: 63863-done <at> debbugs.gnu.org
Subject: Re: [bug#63863] closed (Re: [bug#63863] [PATCH v6] gnu: home: Add
 support for home-pipewire-service)
Date: Tue, 26 Dec 2023 15:57:57 +0300
[Message part 1 (text/plain, inline)]
Brian Cully <bjc <at> spork.org> writes:

> help-debbugs <at> gnu.org (GNU bug Tracking System) writes:
>
>> Your bug report
>>
>> #63863: [PATCH] gnu: home: Add support for home-pipewire-service
>>
>> which was filed against the guix-patches package, has been closed.
>
> Was this intentional?

It was accidental, apologies.  I reopened the issue right after closing.

>> The ‘home-pipewire-pulse-shepherd-service’ procedure is missing. Do you
>> have a code for this procedure or should it be removed from the commit
>> message?  The PipeWire service seems to work without it.
>
> I'd renamed it to ‘home-pulseaudio-shepherd-service’ and forgot to update the
> commit message; v7 will have it fixed.

Pushed to master as afdbf7f271529573397474fdb8f1c9d00dceba37, following
the Guix convention style with a neatly formatted commit message.


Thanks,
Oleg.
[signature.asc (application/pgp-signature, inline)]

bug archived. Request was from Debbugs Internal Request <help-debbugs <at> gnu.org> to internal_control <at> debbugs.gnu.org. (Wed, 24 Jan 2024 12:24:07 GMT) Full text and rfc822 format available.

This bug report was last modified 64 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.