This addresses <https://bugs.gnu.org/40837> by making these configuration files more easily accessible within the WebKitGTK sandbox. * gnu/services/sound.scm (pulseaudio-environment): Move below PULSEAUDIO-CONF-ENTRY. Instantiate PULSE_CONFIG and PULSE_CLIENTCONFIG entries directly instead of referring to /etc/pulse. (pulseaudio-etc): Do not create /etc/pulse/client.conf and /etc/pulse/daemon.conf.
		
			
				
	
	
		
			194 lines
		
	
	
	
		
			6.1 KiB
		
	
	
	
		
			Scheme
		
	
	
	
	
	
			
		
		
	
	
			194 lines
		
	
	
	
		
			6.1 KiB
		
	
	
	
		
			Scheme
		
	
	
	
	
	
| ;;; GNU Guix --- Functional package management for GNU
 | ||
| ;;; Copyright © 2018, 2020 Oleg Pykhalov <go.wigust@gmail.com>
 | ||
| ;;; Copyright © 2020 Leo Prikler <leo.prikler@student.tugraz.at>
 | ||
| ;;; Copyright © 2020 Marius Bakke <mbakke@fastmail.com>
 | ||
| ;;;
 | ||
| ;;; This file is part of GNU Guix.
 | ||
| ;;;
 | ||
| ;;; GNU Guix is free software; you can redistribute it and/or modify it
 | ||
| ;;; under the terms of the GNU General Public License as published by
 | ||
| ;;; the Free Software Foundation; either version 3 of the License, or (at
 | ||
| ;;; your option) any later version.
 | ||
| ;;;
 | ||
| ;;; GNU Guix is distributed in the hope that it will be useful, but
 | ||
| ;;; WITHOUT ANY WARRANTY; without even the implied warranty of
 | ||
| ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | ||
| ;;; GNU General Public License for more details.
 | ||
| ;;;
 | ||
| ;;; You should have received a copy of the GNU General Public License
 | ||
| ;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
 | ||
| 
 | ||
| (define-module (gnu services sound)
 | ||
|   #:use-module (gnu services base)
 | ||
|   #:use-module (gnu services configuration)
 | ||
|   #:use-module (gnu services shepherd)
 | ||
|   #:use-module (gnu services)
 | ||
|   #:use-module (gnu system pam)
 | ||
|   #:use-module (gnu system shadow)
 | ||
|   #:use-module (guix gexp)
 | ||
|   #:use-module (guix packages)
 | ||
|   #:use-module (guix records)
 | ||
|   #:use-module (guix store)
 | ||
|   #:use-module (gnu packages audio)
 | ||
|   #:use-module (gnu packages linux)
 | ||
|   #:use-module (gnu packages pulseaudio)
 | ||
|   #:use-module (ice-9 match)
 | ||
|   #:export (alsa-configuration
 | ||
|             alsa-service-type
 | ||
| 
 | ||
|             pulseaudio-configuration
 | ||
|             pulseaudio-service-type
 | ||
| 
 | ||
|             ladspa-configuration
 | ||
|             ladspa-service-type))
 | ||
| 
 | ||
| ;;; Commentary:
 | ||
| ;;;
 | ||
| ;;; Sound services.
 | ||
| ;;;
 | ||
| ;;; Code:
 | ||
| 
 | ||
| 
 | ||
| ;;;
 | ||
| ;;; ALSA
 | ||
| ;;;
 | ||
| 
 | ||
| (define-record-type* <alsa-configuration>
 | ||
|   alsa-configuration make-alsa-configuration alsa-configuration?
 | ||
|   (alsa-plugins alsa-configuration-alsa-plugins ;<package>
 | ||
|                 (default alsa-plugins))
 | ||
|   (pulseaudio?   alsa-configuration-pulseaudio? ;boolean
 | ||
|                  (default #t))
 | ||
|   (extra-options alsa-configuration-extra-options ;string
 | ||
|                  (default "")))
 | ||
| 
 | ||
| (define alsa-config-file
 | ||
|   ;; Return the ALSA configuration file.
 | ||
|   (match-lambda
 | ||
|     (($ <alsa-configuration> alsa-plugins pulseaudio? extra-options)
 | ||
|      (apply mixed-text-file "asound.conf"
 | ||
|             `("# Generated by 'alsa-service'.\n\n"
 | ||
|               ,@(if pulseaudio?
 | ||
|                     `("# Use PulseAudio by default
 | ||
| pcm_type.pulse {
 | ||
|   lib \"" ,#~(string-append #$alsa-plugins:pulseaudio
 | ||
|                             "/lib/alsa-lib/libasound_module_pcm_pulse.so") "\"
 | ||
| }
 | ||
| 
 | ||
| ctl_type.pulse {
 | ||
|   lib \"" ,#~(string-append #$alsa-plugins:pulseaudio
 | ||
|                             "/lib/alsa-lib/libasound_module_ctl_pulse.so") "\"
 | ||
| }
 | ||
| 
 | ||
| pcm.!default {
 | ||
|   type pulse
 | ||
|   fallback \"sysdefault\"
 | ||
|   hint {
 | ||
|     show on
 | ||
|     description \"Default ALSA Output (currently PulseAudio Sound Server)\"
 | ||
|   }
 | ||
| }
 | ||
| 
 | ||
| ctl.!default {
 | ||
|   type pulse
 | ||
|   fallback \"sysdefault\"
 | ||
| }\n\n")
 | ||
|                     '())
 | ||
|               ,extra-options)))))
 | ||
| 
 | ||
| (define (alsa-etc-service config)
 | ||
|   (list `("asound.conf" ,(alsa-config-file config))))
 | ||
| 
 | ||
| (define alsa-service-type
 | ||
|   (service-type
 | ||
|    (name 'alsa)
 | ||
|    (extensions
 | ||
|     (list (service-extension etc-service-type alsa-etc-service)))
 | ||
|    (default-value (alsa-configuration))
 | ||
|    (description "Configure low-level Linux sound support, ALSA.")))
 | ||
| 
 | ||
| 
 | ||
| ;;;
 | ||
| ;;; PulseAudio
 | ||
| ;;;
 | ||
| 
 | ||
| (define-record-type* <pulseaudio-configuration>
 | ||
|   pulseaudio-configuration make-pulseaudio-configuration
 | ||
|   pulseaudio-configuration?
 | ||
|   (client-conf pulseaudio-client-conf
 | ||
|                (default '()))
 | ||
|   (daemon-conf pulseaudio-daemon-conf
 | ||
|                ;; Flat volumes may cause unpleasant experiences to users
 | ||
|                ;; when applications inadvertently max out the system volume
 | ||
|                ;; (see e.g. <https://bugs.gnu.org/38172>).
 | ||
|                (default '((flat-volumes . no))))
 | ||
|   (script-file pulseaudio-script-file
 | ||
|                (default (file-append pulseaudio "/etc/pulse/default.pa")))
 | ||
|   (system-script-file pulseaudio-system-script-file
 | ||
|                       (default
 | ||
|                         (file-append pulseaudio "/etc/pulse/system.pa"))))
 | ||
| 
 | ||
| (define (pulseaudio-conf-entry arg)
 | ||
|   (match arg
 | ||
|     ((key . value)
 | ||
|      (format #f "~a = ~s~%" key value))
 | ||
|     ((? string? _)
 | ||
|      (string-append arg "\n"))))
 | ||
| 
 | ||
| (define pulseaudio-environment
 | ||
|   (match-lambda
 | ||
|     (($ <pulseaudio-configuration> client-conf daemon-conf default-script-file)
 | ||
|      `(("PULSE_CONFIG" . ,(apply mixed-text-file "daemon.conf"
 | ||
|                                  "default-script-file = " default-script-file "\n"
 | ||
|                                  (map pulseaudio-conf-entry daemon-conf)))
 | ||
|        ("PULSE_CLIENTCONFIG" . ,(apply mixed-text-file "client.conf"
 | ||
|                                        (map pulseaudio-conf-entry client-conf)))))))
 | ||
| 
 | ||
| (define pulseaudio-etc
 | ||
|   (match-lambda
 | ||
|     (($ <pulseaudio-configuration> _ _ default-script-file system-script-file)
 | ||
|      `(("pulse"
 | ||
|         ,(file-union
 | ||
|           "pulse"
 | ||
|           `(("default.pa" ,default-script-file)
 | ||
|             ("system.pa" ,system-script-file))))))))
 | ||
| 
 | ||
| (define pulseaudio-service-type
 | ||
|   (service-type
 | ||
|    (name 'pulseaudio)
 | ||
|    (extensions
 | ||
|     (list (service-extension session-environment-service-type
 | ||
|                              pulseaudio-environment)
 | ||
|           (service-extension etc-service-type pulseaudio-etc)))
 | ||
|    (default-value (pulseaudio-configuration))
 | ||
|    (description "Configure PulseAudio sound support.")))
 | ||
| 
 | ||
| 
 | ||
| ;;;
 | ||
| ;;; LADSPA
 | ||
| ;;;
 | ||
| 
 | ||
| (define-record-type* <ladspa-configuration>
 | ||
|   ladspa-configuration make-ladspa-configuration
 | ||
|   ladspa-configuration?
 | ||
|   (plugins ladspa-plugins (default '())))
 | ||
| 
 | ||
| (define (ladspa-environment config)
 | ||
|   ;; Define this variable in the global environment such that
 | ||
|   ;; pulseaudio swh-plugins (and similar LADSPA plugins) work.
 | ||
|   `(("LADSPA_PATH" .
 | ||
|      (string-join
 | ||
|       ',(map (lambda (package) (file-append package "/lib/ladspa"))
 | ||
|              (ladspa-plugins config))
 | ||
|       ":"))))
 | ||
| 
 | ||
| (define ladspa-service-type
 | ||
|   (service-type
 | ||
|    (name 'ladspa)
 | ||
|    (extensions
 | ||
|     (list (service-extension session-environment-service-type
 | ||
|                              ladspa-environment)))
 | ||
|    (default-value (ladspa-configuration))
 | ||
|    (description "Configure LADSPA plugins.")))
 | ||
| 
 | ||
| ;;; sound.scm ends here
 |