summaryrefslogtreecommitdiff
path: root/gnu
diff options
context:
space:
mode:
authorLiliana Marie Prikler <liliana.prikler@gmail.com>2026-02-04 10:20:55 +0100
committerLiliana Marie Prikler <liliana.prikler@gmail.com>2026-03-10 11:23:30 +0100
commitde8b977d4e62bca47f696f7f1debf69a3b9078d4 (patch)
treedcdc32be9d54d933c1c421537d4ca4a9f4929def /gnu
parent06c6c3ede530585f643e09afa7259498299cef78 (diff)
services: Generalize alsa-configuration.
* gnu/packages/sound.scm (alsa-pcm-configuration, alsa-ctl-configuration): New configuration records. (serialize-alsa-pcm-configuration, serialize-alsa-ctl-configuration): New variables. (<alsa-configuration>): Remove alsa-plugins and pulseaudio?. Add default-pcm and default-ctl. Rename extra-options to options. (alsa-config-file): Adjust accordingly. (alsa-servcice-type): Add compose and extend. (<pulseaudio-configuration>): Add alsa-lib. (pulseaudio-alsa-configuration): New procedure. (pulseaudio-service-type): Extend alsa-servcice-type.
Diffstat (limited to 'gnu')
-rw-r--r--gnu/services/sound.scm159
1 files changed, 117 insertions, 42 deletions
diff --git a/gnu/services/sound.scm b/gnu/services/sound.scm
index b41ff3921b1..4c319153448 100644
--- a/gnu/services/sound.scm
+++ b/gnu/services/sound.scm
@@ -41,11 +41,20 @@
41 #:use-module (gnu packages rust-apps) 41 #:use-module (gnu packages rust-apps)
42 #:use-module (ice-9 match) 42 #:use-module (ice-9 match)
43 #:use-module (srfi srfi-1) 43 #:use-module (srfi srfi-1)
44 #:export (alsa-configuration 44 #:export (alsa-pcm-configuration
45 alsa-pcm-configuration-type
46 alsa-pcm-configuration-hint
47 alsa-pcm-configuration-configuration
48
49 alsa-ctl-configuration
50 alsa-ctl-configuration-type
51 alsa-ctl-configuration-configuration
52
53 alsa-configuration
45 alsa-configuration? 54 alsa-configuration?
46 alsa-configuration-alsa-plugins 55 alsa-configuration-default-ctl
47 alsa-configuration-pulseaudio? 56 alsa-configuration-default-pcm
48 alsa-configuration-extra-options 57 alsa-configuration-options
49 alsa-service-type 58 alsa-service-type
50 59
51 pulseaudio-configuration 60 pulseaudio-configuration
@@ -81,48 +90,70 @@
81;;; ALSA 90;;; ALSA
82;;; 91;;;
83 92
93(define-maybe/no-serialization string)
94
95(define-configuration/no-serialization alsa-pcm-configuration
96 (type symbol "The PCM type.")
97 (hint maybe-string "A human-readable description of the PCM.")
98 (configuration
99 list-of-strings
100 "Additional configuration. Each item will be printed on a separate line."))
101
102(define-configuration/no-serialization alsa-ctl-configuration
103 (type symbol "The CTL type.")
104 (configuration
105 list-of-strings
106 "Additional configuration. Each item will be printed on a separate line."))
107
84(define-record-type* <alsa-configuration> 108(define-record-type* <alsa-configuration>
85 alsa-configuration make-alsa-configuration alsa-configuration? 109 alsa-configuration make-alsa-configuration alsa-configuration?
86 (alsa-plugins alsa-configuration-alsa-plugins ;file-like 110 (default-pcm alsa-configuration-default-pcm (default #f))
87 (default alsa-plugins)) 111 (default-ctl alsa-configuration-default-ctl (default #f))
88 (pulseaudio? alsa-configuration-pulseaudio? ;boolean 112 (options alsa-configuration-options ; string
89 (default #t)) 113 (default (list))))
90 (extra-options alsa-configuration-extra-options ;string 114
91 (default ""))) 115(define (serialize-alsa-pcm-configuration config name)
116 (match-record config <alsa-pcm-configuration>
117 (type hint configuration)
118 #~(string-append
119 "pcm." #$name " {\n"
120 " type " #$(symbol->string type) "\n"
121 #$(if hint
122 (string-append " hint { show on; description \"" hint "\" }\n")
123 "")
124 #$(if (null? configuration) "" " ")
125 #$(string-join configuration "\n ")
126 "\n}")))
127
128(define (serialize-alsa-ctl-configuration config name)
129 (match-record config <alsa-ctl-configuration>
130 (type configuration)
131 #~(string-append
132 "ctl." #$name " {\n"
133 " type " #$(symbol->string type) "\n"
134 #$(if (null? configuration) "" " ")
135 #$(string-join configuration "\n ")
136 "\n}")))
92 137
93(define alsa-config-file 138(define alsa-config-file
94 ;; Return the ALSA configuration file. 139 ;; Return the ALSA configuration file.
95 (match-lambda 140 (match-lambda
96 (($ <alsa-configuration> alsa-plugins pulseaudio? extra-options) 141 (($ <alsa-configuration> default-pcm default-ctl options)
97 (apply mixed-text-file "asound.conf" 142 (mixed-text-file
98 `("# Generated by 'alsa-service'.\n\n" 143 "asound.conf"
99 ,@(if pulseaudio? 144 #~(string-join
100 `("# Use PulseAudio by default 145 (list
101pcm_type.pulse { 146 "# Generated by 'alsa-service'"
102 lib \"" ,#~(string-append #$alsa-plugins:pulseaudio 147 #$@options
103 "/lib/alsa-lib/libasound_module_pcm_pulse.so") "\" 148 #$@(if default-pcm
104} 149 (list
105 150 (serialize-alsa-pcm-configuration default-pcm "!default"))
106ctl_type.pulse { 151 '())
107 lib \"" ,#~(string-append #$alsa-plugins:pulseaudio 152 #$@(if default-ctl
108 "/lib/alsa-lib/libasound_module_ctl_pulse.so") "\" 153 (list
109} 154 (serialize-alsa-ctl-configuration default-ctl "!default"))
110 155 '()))
111pcm.!default { 156 "\n")))))
112 type pulse
113 fallback \"sysdefault\"
114 hint {
115 show on
116 description \"Default ALSA Output (currently PulseAudio Sound Server)\"
117 }
118}
119
120ctl.!default {
121 type pulse
122 fallback \"sysdefault\"
123}\n\n")
124 '())
125 ,extra-options)))))
126 157
127(define (alsa-etc-service config) 158(define (alsa-etc-service config)
128 (list `("asound.conf" ,(alsa-config-file config)))) 159 (list `("asound.conf" ,(alsa-config-file config))))
@@ -132,6 +163,22 @@ ctl.!default {
132 (name 'alsa) 163 (name 'alsa)
133 (extensions 164 (extensions
134 (list (service-extension etc-service-type alsa-etc-service))) 165 (list (service-extension etc-service-type alsa-etc-service)))
166 (compose concatenate)
167 (extend (lambda (config extensions)
168 (let* ((configs (cons config extensions))
169 (options (append-map (lambda (cfg)
170 (alsa-configuration-options cfg))
171 configs))
172 (default-pcm (any (lambda (cfg)
173 (alsa-configuration-default-pcm cfg))
174 (reverse configs)))
175 (default-ctl (any (lambda (cfg)
176 (alsa-configuration-default-ctl cfg))
177 (reverse configs))))
178 (alsa-configuration
179 (default-pcm default-pcm)
180 (default-ctl default-ctl)
181 (options options)))))
135 (default-value (alsa-configuration)) 182 (default-value (alsa-configuration))
136 (description "Configure low-level Linux sound support, ALSA."))) 183 (description "Configure low-level Linux sound support, ALSA.")))
137 184
@@ -156,7 +203,10 @@ ctl.!default {
156 (default '())) 203 (default '()))
157 (system-script-file pulseaudio-configuration-system-script-file 204 (system-script-file pulseaudio-configuration-system-script-file
158 (default 205 (default
159 (file-append pulseaudio "/etc/pulse/system.pa")))) 206 (file-append pulseaudio "/etc/pulse/system.pa")))
207 (alsa-lib pulseaudio-alsa-lib
208 (default #~(string-append #$alsa-plugins:pulseaudio
209 "/lib/alsa-lib"))))
160 210
161(define (pulseaudio-conf-entry arg) 211(define (pulseaudio-conf-entry arg)
162 (match arg 212 (match arg
@@ -237,11 +287,36 @@ computed-file object~%") file))))
237 ,(apply mixed-text-file "client.conf" 287 ,(apply mixed-text-file "client.conf"
238 (map pulseaudio-conf-entry client-conf))))))))) 288 (map pulseaudio-conf-entry client-conf)))))))))
239 289
290(define pulseaudio-alsa-configuration
291 (match-record-lambda <pulseaudio-configuration>
292 (alsa-lib)
293 (list
294 (alsa-configuration
295 (default-pcm
296 (alsa-pcm-configuration
297 (type 'pulse)
298 (hint "Default ALSA Output (currently PulseAudio Sound Server)")
299 (configuration (list "fallback \"sysdefault\""))))
300 (default-ctl
301 (alsa-ctl-configuration
302 (type 'pulse)
303 (configuration (list "fallback \"sysdefault\""))))
304 (options
305 (list
306 #~(string-append "pcm_type.pulse {
307 lib \"" #$alsa-lib "/libasound_module_pcm_pulse.so\"
308}")
309 #~(string-append "ctl_type.pulse {
310 lib \"" #$alsa-lib "/libasound_module_ctl_pulse.so\"
311}")))))))
312
240(define pulseaudio-service-type 313(define pulseaudio-service-type
241 (service-type 314 (service-type
242 (name 'pulseaudio) 315 (name 'pulseaudio)
243 (extensions 316 (extensions
244 (list (service-extension session-environment-service-type 317 (list (service-extension alsa-service-type
318 pulseaudio-alsa-configuration)
319 (service-extension session-environment-service-type
245 pulseaudio-environment) 320 pulseaudio-environment)
246 (service-extension etc-service-type pulseaudio-etc) 321 (service-extension etc-service-type pulseaudio-etc)
247 (service-extension udev-service-type (const (list pulseaudio))))) 322 (service-extension udev-service-type (const (list pulseaudio)))))