diff options
| author | Liliana Marie Prikler <liliana.prikler@gmail.com> | 2026-02-04 10:20:55 +0100 |
|---|---|---|
| committer | Liliana Marie Prikler <liliana.prikler@gmail.com> | 2026-03-10 11:23:30 +0100 |
| commit | de8b977d4e62bca47f696f7f1debf69a3b9078d4 (patch) | |
| tree | dcdc32be9d54d933c1c421537d4ca4a9f4929def /gnu | |
| parent | 06c6c3ede530585f643e09afa7259498299cef78 (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.scm | 159 |
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 |
| 101 | pcm_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")) | |
| 106 | ctl_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 | '())) | |
| 111 | pcm.!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 | |||
| 120 | ctl.!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))))) |
