~ruther/guix-local

af643735a546d9d3538113ebab4b5892f34c131a — Roman Scherer 1 year, 16 days ago 5135b9e
services: Add speakersafetyd service.

* gnu/services/sound.scm (speakersafetyd-shepherd-service)
(speakersafetyd-configuration)
(speakersafetyd-service-type): New variables.
* doc/guix.texi (Sound Services): Document it.

Change-Id: Ib8fa19b056a2036019ae7c199d81e1139664e951
Modified-by: Maxim Cournoyer <maxim.cournoyer@gmail.com>
Signed-off-by: Maxim Cournoyer <maxim.cournoyer@gmail.com>
2 files changed, 108 insertions(+), 1 deletions(-)

M doc/guix.texi
M gnu/services/sound.scm
M doc/guix.texi => doc/guix.texi +43 -0
@@ 26575,6 26575,49 @@ details.

@end defvar

@subsubheading Speaker Safety Daemon System Service

@uref{https://github.com/AsahiLinux/speakersafetyd, Speaker Safety
Daemon} is a user-space daemon that implements an analogue of the Texas
Instruments Smart Amp speaker protection model.  It can be used to
protect the speakers on Apple Silicon devices.

@defvar speakersafetyd-service-type
This is the type for the @code{speakersafetyd} system service, whose
value is a @command{speakersafetyd-configuration} record.

@lisp
(service speakersafetyd-service-type)
@end lisp

See below for details about @code{speakersafetyd-configuration}.
@end defvar

@c %start of fragment
@deftp {Data Type} speakersafetyd-configuration
Available @code{speakersafetyd-configuration} fields are:

@table @asis
@item @code{blackbox-directory} (default: @code{"/var/lib/speakersafetyd/blackbox"}) (type: string)
The directory to which blackbox files are written when the speakers are
getting too hot.  The blackbox files contain audio and debug information
which the developers of @code{speakersafetyd} might ask for when
reporting bugs.

@item @code{configuration-directory} (type: file-like)
The base directory as a G-expression (@pxref{G-Expressions}) that
contains the configuration files of the speaker models.

@item @code{maximum-gain-reduction} (default: @code{7}) (type: integer)
Maximum gain reduction before panicking, useful for debugging.

@item @code{speakersafetyd} (default: @code{speakersafetyd}) (type: file-like)
The Speaker Safety Daemon package to use.

@end table
@end deftp
@c %end of fragment

@node File Search Services
@subsection File Search Services


M gnu/services/sound.scm => gnu/services/sound.scm +65 -1
@@ 3,6 3,7 @@
;;; Copyright © 2020 Liliana Marie Prikler <liliana.prikler@gmail.com>
;;; Copyright © 2020 Marius Bakke <mbakke@fastmail.com>
;;; Copyright © 2022 Maxim Cournoyer <maxim.cournoyer@gmail.com>
;;; Copyright © 2025 Roman Scherer <roman@burningswell.com>
;;;
;;; This file is part of GNU Guix.
;;;


@@ 35,6 36,7 @@
  #:use-module (gnu packages audio)
  #:use-module (gnu packages linux)
  #:use-module (gnu packages pulseaudio)
  #:use-module (gnu packages rust-apps)
  #:use-module (ice-9 match)
  #:use-module (srfi srfi-1)
  #:export (alsa-configuration


@@ 56,7 58,15 @@
            ladspa-configuration
            ladspa-configuration?
            ladspa-configuration-plugins
            ladspa-service-type))
            ladspa-service-type

            speakersafetyd-configuration
            speakersafetyd-configuration-blackbox-directory
            speakersafetyd-configuration-configuration-directory
            speakersafetyd-configuration-maximum-gain-reduction
            speakersafetyd-configuration-speakersafetyd
            speakersafetyd-configuration?
            speakersafetyd-service-type))

;;; Commentary:
;;;


@@ 263,4 273,58 @@ computed-file object~%") file))))
   (default-value (ladspa-configuration))
   (description "Configure LADSPA plugins.")))


;;;
;;; Speaker Safety Daemon.
;;;

(define-configuration/no-serialization speakersafetyd-configuration
  (blackbox-directory
   (string "/var/lib/speakersafetyd/blackbox")
   "The directory to which blackbox files are written when the speakers are
getting too hot.  The blackbox files contain audio and debug information which
the developers of @code{speakersafetyd} might ask for when reporting bugs.")
  (configuration-directory
   (file-like (file-append speakersafetyd "/share/speakersafetyd"))
   "The base directory as a G-expression (@pxref{G-Expressions}) that contains
the configuration files of the speaker models.")
  (maximum-gain-reduction
   (integer 7)
   "Maximum gain reduction before panicking, useful for debugging.")
  (speakersafetyd
   (file-like speakersafetyd)
   "The Speaker Safety Daemon package to use."))

(define speakersafetyd-shepherd-service
  (match-record-lambda <speakersafetyd-configuration>
      (blackbox-directory configuration-directory maximum-gain-reduction speakersafetyd)
    (shepherd-service
     (documentation "Run the speaker safety daemon")
     (provision '(speakersafetyd))
     (requirement '(udev))
     (start #~(make-forkexec-constructor
               (list #$(file-append speakersafetyd "/bin/speakersafetyd")
                     "--config-path" #$configuration-directory
                     "--blackbox-path" #$blackbox-directory
                     "--max-reduction" (number->string #$maximum-gain-reduction))))
     (stop #~(make-kill-destructor)))))

(define speakersafetyd-service-type
  (service-type
   (name 'speakersafetyd)
   (description "Run @command{speakersafetyd}, a user space daemon that
implements an analogue of the Texas Instruments Smart Amp speaker protection
model.  It can be used to protect the speakers on Apple Silicon devices.")
   (extensions
    (list (service-extension
           shepherd-root-service-type
           (compose list speakersafetyd-shepherd-service))
          (service-extension
           udev-service-type
           (compose list speakersafetyd-configuration-speakersafetyd))
          (service-extension
           profile-service-type
           (compose list speakersafetyd-configuration-speakersafetyd))))
   (default-value (speakersafetyd-configuration))))

;;; sound.scm ends here