From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33809) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dgn82-0007L6-Hh for guix-patches@gnu.org; Sun, 13 Aug 2017 03:16:10 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dgn7y-0003Nh-Bt for guix-patches@gnu.org; Sun, 13 Aug 2017 03:16:06 -0400 Received: from debbugs.gnu.org ([208.118.235.43]:50433) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dgn7y-0003Na-7G for guix-patches@gnu.org; Sun, 13 Aug 2017 03:16:02 -0400 Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1dgn7x-0005Hz-TB for guix-patches@gnu.org; Sun, 13 Aug 2017 03:16:01 -0400 Subject: bug#28059: [PATCH] gnu: Add mpd service. Resent-To: guix-patches@gnu.org Resent-Message-ID: Date: Sun, 13 Aug 2017 08:15:10 +0100 From: Christopher Baines Message-ID: <20170813081510.0c06683c@cbaines.net> In-Reply-To: <87wp68cujv.fsf@gmail.com> References: <20170812015211.5411-1-petermikkelsen10@gmail.com> <20170812115011.4c076108@cbaines.net> <87a834u2z3.fsf@gmail.com> <20170812215833.0b957af6@cbaines.net> <87wp68cujv.fsf@gmail.com> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha512; boundary="Sig_/nENCve.rh+HWAjhYskz=319"; protocol="application/pgp-signature" List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-patches-bounces+kyle=kyleam.com@gnu.org Sender: "Guix-patches" To: Peter Mikkelsen Cc: 28059-done@debbugs.gnu.org --Sig_/nENCve.rh+HWAjhYskz=319 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable On Sun, 13 Aug 2017 00:04:04 +0200 Peter Mikkelsen wrote: > Christopher Baines writes: >=20 > > On Sat, 12 Aug 2017 19:10:08 +0200 > > Peter Mikkelsen wrote: > > =20 > >> Hi, thanks for the quick review! > >> > >> Christopher Baines writes: > >> =20 > >> > Hey, > >> > > >> > This looks great Peter, awesome job :) I've made some notes about > >> > potential improvements inline below. > >> > > >> > I've succeeded in running the system test locally, but there was > >> > some suspicious output in the log: > >> > > >> > exception: bind to '0.0.0.0:6600' failed (continuing anyway, > >> > because binding to '[::]:6600' succeeded): Failed to bind > >> > socket: Address already in use exception: Failed to > >> > access /root/.mpd/playlists: No such file or directory > >> > =20 > >> > >> This is pretty normal for mpd, and I believe happens because it > >> first binds on IPv6 and then fails for IPv4. The error about the > >> playlist dir happens because it does not exist, but AFAIK it is no > >> problem unless you want to save playlists. The user can just > >> create the dir. =20 > > > > Ok, good to know :) > > =20 > >> > On Sat, 12 Aug 2017 03:52:11 +0200 > >> > Peter Mikkelsen wrote: =20 > >> >> * doc/guix.text: Add documentation. =20 > >> > > >> > Typo above, text rather than texi. > >> > =20 > >> > >> Ups, my mistake. > >> =20 > >> >> * gnu/services/music.scm (): New record type. > >> >> (mpd-service): New service extension. > >> >> (mpd-service-type): New service type. > >> >> * gnu/tests/music.scm: New file. > >> >> * gnu/local.mk: Add new files. > >> >> > >> >> --- > >> >> doc/guix.texi | 53 +++++++++++++++++++++++++++++++ > >> >> gnu/local.mk | 2 ++ > >> >> gnu/services/music.scm | 84 > >> >> ++++++++++++++++++++++++++++++++++++++++++++++++++ > >> >> gnu/tests/music.scm | 83 > >> >> +++++++++++++++++++++++++++++++++++++++++++++++++ 4 files > >> >> changed, 222 insertions(+) create mode 100644 > >> >> gnu/services/music.scm create mode 100644 gnu/tests/music.scm > >> >> > >> >> diff --git a/doc/guix.texi b/doc/guix.texi > >> >> index 8f14ddd50..e565dfdc9 100644 > >> >> --- a/doc/guix.texi > >> >> +++ b/doc/guix.texi > >> >> @@ -227,6 +227,7 @@ Services > >> >> * Network File System:: NFS related services. > >> >> * Continuous Integration:: The Cuirass service. > >> >> * Power management Services:: The TLP tool. > >> >> +* Music Services:: The MPD. > >> >> * Miscellaneous Services:: Other services. > >> >> > >> >> Defining Services > >> >> @@ -9035,6 +9036,7 @@ declaration. > >> >> * Network File System:: NFS related services. > >> >> * Continuous Integration:: The Cuirass service. > >> >> * Power management Services:: The TLP tool. > >> >> +* Music Services:: The MPD. > >> >> * Miscellaneous Services:: Other services. > >> >> @end menu > >> >> > >> >> @@ -15635,6 +15637,57 @@ Package object of thermald. > >> >> @end table > >> >> @end deftp > >> >> > >> >> +@node Music Services > >> >> +@subsubsection Music Services =20 > >> > > >> > I'm wondering if Audio services, rather than Music services > >> > might be better? Maybe this would fit in other services related > >> > to audio, e.g. Jack, MIDI stuff, etc... > >> > =20 > >> > >> That sounds like a good idea. > >> =20 > >> >> +@cindex mpd > >> >> +@subsubheading Music Player Daemon > >> >> + > >> >> +The @code{(gnu services music)} provides a service to start MPD > >> >> (the Music +Player Daemon). It uses pulseaudio for output. > >> >> + > >> >> +@defvr {Scheme Variable} mpd-service-type > >> >> +The service type for @command{mpd} > >> >> +@end defvr > >> >> + > >> >> +@deftp {Data Type} mpd-configuration > >> >> +Data type representing the configuration of @command{mpd}. > >> >> + > >> >> +@table @asis > >> >> +@item @code{user} (default: @code{"mpd"}) > >> >> +The user to run mpd as. > >> >> + > >> >> +@item @code{music-dir} (default: @code{"~/Music"}) > >> >> +The directory to scan for music files. > >> >> + > >> >> +@item @code{playlist-dir} (default: @code{"~/.mpd/playlists"}) > >> >> +The directory to store playlists. > >> >> + > >> >> +@item @code{pid-file} (default: @code{"~/.mpd-pid"}) > >> >> +The file mpd wil store its PID. > >> >> + > >> >> +@item @code{port} (default: @code{"6600"}) > >> >> +The port to run mpd on. > >> >> + > >> >> +@item @code{address} (default: @code{"any"}) > >> >> +The address that mpd will bind to. To use a Unix domain socket, > >> >> +an absolute path can be specified here. =20 > >> > > >> > The style for Guix is to use two spaces between sentences, I > >> > always forget about this too. > >> > =20 > >> > >> Oh yes, me too. > >> =20 > >> >> + > >> >> +@end table > >> >> +@end deftp > >> >> + > >> >> +@deffn {Scheme Procedure} mpd-service [#:config > >> >> (mpd-configuration)] +Return a service that runs @code{mpd} > >> >> using @var{configuration}, +a @code{} object. > >> >> + > >> >> +The following example shows how one might run @code{mpd} as > >> >> user +@code{"bob"} on port @code{6666}. > >> >> +@example > >> >> +(mpd-service (mpd-configuration > >> >> + (user "bob") > >> >> + (port "6666"))) > >> >> +@end example > >> >> +@end deffn > >> >> > >> >> @node Miscellaneous Services > >> >> @subsubsection Miscellaneous Services > >> >> diff --git a/gnu/local.mk b/gnu/local.mk > >> >> index b1ff72d6a..cad0ba38d 100644 > >> >> --- a/gnu/local.mk > >> >> +++ b/gnu/local.mk > >> >> @@ -441,6 +441,7 @@ GNU_SYSTEM_MODULES > >> >> =3D \ > >> >> %D%/services/mail.scm \ > >> >> %D%/services/mcron.scm \ > >> >> %D%/services/messaging.scm \ > >> >> + %D%/services/music.scm \ > >> >> %D%/services/networking.scm \ > >> >> %D%/services/nfs.scm \ > >> >> %D%/services/shepherd.scm \ > >> >> @@ -488,6 +489,7 @@ GNU_SYSTEM_MODULES > >> >> =3D \ > >> >> %D%/tests/install.scm \ > >> >> %D%/tests/mail.scm \ > >> >> %D%/tests/messaging.scm \ > >> >> + %D%/tests/music.scm \ > >> >> %D%/tests/networking.scm \ > >> >> %D%/tests/ssh.scm \ > >> >> %D%/tests/web.scm > >> >> diff --git a/gnu/services/music.scm b/gnu/services/music.scm > >> >> new file mode 100644 > >> >> index 000000000..77912d5c6 > >> >> --- /dev/null > >> >> +++ b/gnu/services/music.scm > >> >> @@ -0,0 +1,84 @@ > >> >> +;;; GNU Guix --- Functional package management for GNU > >> >> +;;; Copyright =C2=A9 2017 Peter Mikkelsen > >> >> +;;; > >> >> +;;; 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 > >> >> . + > >> >> +(define-module (gnu services music) > >> >> + #:use-module (guix gexp) > >> >> + #:use-module (gnu services) > >> >> + #:use-module (gnu services shepherd) > >> >> + #:use-module (gnu packages mpd) > >> >> + #:use-module (guix records) > >> >> + #:export (mpd-configuration > >> >> + mpd-configuration? > >> >> + mpd-service > >> >> + mpd-service-type)) > >> >> + > >> >> +;;; Commentary: > >> >> +;;; > >> >> +;;; Music related services > >> >> +;;; > >> >> +;;; Code: > >> >> + > >> >> +(define-record-type* > >> >> + mpd-configuration make-mpd-configuration > >> >> + mpd-configuration? > >> >> + (user mpd-configuration-user > >> >> + (default "mpd")) > >> >> + (music-dir mpd-configuration-music-dir > >> >> + (default "~/Music")) > >> >> + (playlist-dir mpd-configuration-playlist-dir > >> >> + (default "~/.mpd/playlists")) > >> >> + (port mpd-configuration-port > >> >> + (default "6600")) > >> >> + (address mpd-configuration-address > >> >> + (default "any")) > >> >> + (pid-file mpd-configuration-pid-file > >> >> + (default "~/.mpd-pid"))) > >> >> + > >> >> +(define (mpd-config->file config) > >> >> + (apply > >> >> + mixed-text-file "mpd.conf" > >> >> + "audio_output {\n" > >> >> + " type \"pulse\"\n" > >> >> + " name \"MPD\"\n" > >> >> + "}\n" > >> >> + (map (lambda (config-line) > >> >> + (let ((config-name (car config-line)) > >> >> + (config-val (cadr config-line))) > >> >> + (string-append config-name " \"" (config-val > >> >> config) "\"\n"))) > >> >> + `(("user" ,mpd-configuration-user) > >> >> + ("music_directory" ,mpd-configuration-music-dir) > >> >> + > >> >> ("playlist_directory" ,mpd-configuration-playlist-dir) > >> >> + ("port" ,mpd-configuration-port) > >> >> + ("bind_to_address" ,mpd-configuration-address) > >> >> + ("pid_file" ,mpd-configuration-pid-file))))) > >> >> + > >> >> +(define mpd-service-type > >> >> + (shepherd-service-type > >> >> + 'mpd > >> >> + (lambda (config) > >> >> + (shepherd-service > >> >> + (documentation "Run the MPD (Music Player Daemon)") > >> >> + (provision '(mpd)) > >> >> + (start #~(make-forkexec-constructor > >> >> + (list #$(file-append mpd "/bin/mpd") > >> >> + "--no-daemon" > >> >> + #$(mpd-config->file config)))) > >> >> + (stop #~(make-kill-destructor)))))) > >> >> + > >> >> +(define* (mpd-service #:optional (config (mpd-configuration))) > >> >> + (service mpd-service-type config)) =20 > >> > > >> > I've been trying a slightly different style for this recently. At > >> > the moment, if you had a configuration file for MPD, you couldn't > >> > use this with the service here. One way of addressing this is to > >> > do something like the Tailon service, and define a gexp compiler > >> > for the configuration file (e.g. [1]). For the Tailon service, > >> > this means that you should be able to pass your own > >> > configuration file to the service. =20 > >> > >> I am not sure I get how this works, and I would probs just make a > >> big mess. What about we take my approach first, and then I can > >> come back to it when I learn some more about guix? =20 > > > > No problem. Looking at it again, I think it might be a bit trickier > > than I initially assumed, as the pid-file value is used. > > =20 > Oh i see. > >> > Also, now that a can have a default-value, I think > >> > its easier to just have the mpd-service-type, without the > >> > mpd-service procedure. If you add a default value, you should be > >> > able to do (service mpd-service-type). > >> > =20 > >> Ok with me. > >> =20 > >> > 1: > >> > https://git.savannah.gnu.org/cgit/guix.git/tree/gnu/services/admin.s= cm#n255 > >> > =20 > >> >> diff --git a/gnu/tests/music.scm b/gnu/tests/music.scm > >> >> new file mode 100644 > >> >> index 000000000..158513098 > >> >> --- /dev/null > >> >> +++ b/gnu/tests/music.scm > >> >> @@ -0,0 +1,83 @@ > >> >> +;;; GNU Guix --- Functional package management for GNU > >> >> +;;; Copyright =C2=A9 2017 Peter Mikkelsen > >> >> +;;; > >> >> +;;; 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 > >> >> . + > >> >> +(define-module (gnu tests music) > >> >> + #:use-module (gnu tests) > >> >> + #:use-module (gnu system) > >> >> + #:use-module (gnu system vm) > >> >> + #:use-module (gnu services) > >> >> + #:use-module (gnu services music) > >> >> + #:use-module (gnu packages mpd) > >> >> + #:use-module (guix gexp) > >> >> + #:export (%test-mpd)) > >> >> + > >> >> +(define %mpd-os > >> >> + (simple-operating-system > >> >> + (mpd-service (mpd-configuration > >> >> + (user "root"))))) > >> >> + > >> >> +(define (run-mpd-test) > >> >> + "Run tests in %mpd-os, which has mpd running." > >> >> + (define os > >> >> + (marionette-operating-system > >> >> + %mpd-os > >> >> + #:imported-modules '((gnu services herd)))) > >> >> + > >> >> + (define vm > >> >> + (virtual-machine os)) > >> >> + > >> >> + (define test > >> >> + (with-imported-modules '((gnu build marionette)) > >> >> + #~(begin > >> >> + (use-modules (srfi srfi-64) > >> >> + (gnu build marionette)) > >> >> + (define marionette > >> >> + (make-marionette (list #$vm))) > >> >> + > >> >> + (mkdir #$output) > >> >> + (chdir #$output) > >> >> + > >> >> + (test-begin "mpd") > >> >> + > >> >> + (test-eq "service is running" > >> >> + 'running! > >> >> + (marionette-eval > >> >> + '(begin > >> >> + (use-modules (gnu services herd)) > >> >> + (start-service 'mpd) > >> >> + 'running!) > >> >> + marionette)) =20 > >> > > >> > Recently, the start-service procedure was changed to return the > >> > information from the shepherd, and this can be used to make this > >> > check a bit more rigorous. > >> > > >> > I've got an patch for the Memcached service which demonstrates > >> > this here [2], as with the test above, it will not always fail, > >> > even if the service fails to create the PID file. > >> > > >> > 2: https://debbugs.gnu.org/cgi/bugreport.cgi?bug=3D28021 > >> > =20 > >> >> + (test-assert "pid file" > >> >> + (wait-for-file "/root/.mpd-pid" > >> >> + marionette)) =20 > >> > > >> > If this is useful when using MPD, then I think it would be > >> > valuable to get the shepherd to wait for the PID file. I think > >> > you can do this by adding #:pid-file to the > >> > make-forkexec-constructor call. > >> > > >> > If you do this, them I'm not sure this test adds anything, as I > >> > think the start-service call would only return successfully when > >> > the service has started, and created the PID file. > >> > =20 > >> > >> Right, I have removed this test. =20 > > > > Great. Just to check I wasn't wrong, I've just tested what happens > > if you break the service by getting mpd to create the PID file, and > > shepherd to look for it in different places, and the previous test > > about starting the service does indeed fail, which is what we > > want :D=20 >=20 > Great! > >> >> + (test-assert "mpc connect" > >> >> + (marionette-eval > >> >> + '(zero? (system #$(file-append mpd-mpc > >> >> "/bin/mpc"))) > >> >> + marionette)) > >> >> + > >> >> + (test-end) > >> >> + (exit (=3D (test-runner-fail-count > >> >> (test-runner-current)) 0))))) > >> >> + (gexp->derivation "mpd-test" test)) > >> >> + > >> >> +(define %test-mpd > >> >> + (system-test > >> >> + (name "mpd") > >> >> + (description "Test that the mpd can run and be connected > >> >> to.") > >> >> + (value (run-mpd-test)))) =20 > >> > >> I think I have fixed all of your suggestions (apart from the > >> gexp-compiler one). Please see my new patch. =20 > > > > Awesome, I've put a couple more suggestions below, but just on the > > docs and a bit of code style. Regardless of these, I think this is > > good to go. > > > > =20 > >> From 419a8df59bc958ee87ece5519393b32cfbef609c Mon Sep 17 00:00:00 > >> 2001 From: Peter Mikkelsen > >> Date: Sat, 12 Aug 2017 03:40:25 +0200 > >> Subject: [PATCH] gnu: Add mpd service. > >> > >> * doc/guix.texi: Add documentation. > >> * gnu/services/audio.scm (): New record type. > >> (mpd-service-type): New service type. > >> * gnu/tests/audio.scm: New file. > >> * gnu/local.mk: Add new files. > >> --- > >> doc/guix.texi | 49 ++++++++++++++++++++++++++++ > >> gnu/local.mk | 2 ++ > >> gnu/services/audio.scm | 86 > >> ++++++++++++++++++++++++++++++++++++++++++++++++++ > >> gnu/tests/audio.scm | 78 > >> +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 215 > >> insertions(+) create mode 100644 gnu/services/audio.scm create mode > >> 100644 gnu/tests/audio.scm > >> > >> diff --git a/doc/guix.texi b/doc/guix.texi > >> index 8f14ddd50..754408ade 100644 > >> --- a/doc/guix.texi > >> +++ b/doc/guix.texi > >> @@ -227,6 +227,7 @@ Services > >> * Network File System:: NFS related services. > >> * Continuous Integration:: The Cuirass service. > >> * Power management Services:: The TLP tool. > >> +* Audio Services:: The MPD. > >> * Miscellaneous Services:: Other services. > >> > >> Defining Services > >> @@ -9035,6 +9036,7 @@ declaration. > >> * Network File System:: NFS related services. > >> * Continuous Integration:: The Cuirass service. > >> * Power management Services:: The TLP tool. > >> +* Audio Services:: The MPD. > >> * Miscellaneous Services:: Other services. > >> @end menu > >> > >> @@ -15635,6 +15637,53 @@ Package object of thermald. > >> @end table > >> @end deftp > >> > >> +@node Audio Services > >> +@subsubsection Audio Services > >> + > >> +@cindex mpd > >> +@subsubheading Music Player Daemon > >> + > >> +The @code{(gnu services audio)} provides a service to start MPD > >> (the Music +Player Daemon). It uses pulseaudio for output. > >> + > >> +@defvr {Scheme Variable} mpd-service-type > >> +The service type for @command{mpd} > >> +@end defvr > >> + > >> +@deftp {Data Type} mpd-configuration > >> +Data type representing the configuration of @command{mpd}. > >> + > >> +@table @asis > >> +@item @code{user} (default: @code{"mpd"}) > >> +The user to run mpd as. > >> + > >> +@item @code{music-dir} (default: @code{"~/Music"}) > >> +The directory to scan for music files. > >> + > >> +@item @code{playlist-dir} (default: @code{"~/.mpd/playlists"}) > >> +The directory to store playlists. > >> + > >> +@item @code{pid-file} (default: @code{"/var/run/mpd.pid"}) > >> +The file mpd wil store its PID. This must be an absolute path. > >> + > >> +@item @code{port} (default: @code{"6600"}) > >> +The port to run mpd on. > >> + > >> +@item @code{address} (default: @code{"any"}) > >> +The address that mpd will bind to. To use a Unix domain socket, > >> +an absolute path can be specified here. > >> + > >> +@end table > >> +@end deftp > >> + > >> +The following example shows how one might run @code{mpd} as user > >> +@code{"bob"} on port @code{6666}. > >> +@example > >> +(service mpd-service-type > >> + (mpd-configuration > >> + (user "bob") > >> + (port "6666"))) > >> +@end example =20 > > > > I've got a few suggestions for the docs. Nothing too important, and > > I'm fine if you still prefer docs without the suggestions below, > > but feel free to pick and choose any changes that you think are > > good, I've put my reasoning inline in round brackets. > > > > > > @node Audio Services > > @subsubsection Audio Services > > > > The @code{(gnu services audio)} module provides a service to > > start MPD (the Music Player Daemon). > > > > ( > > Having the introduction to the module above the Music Player > > Daemon subsubheading seems neater. Also, I think adding "module" > > after @code{(gnu services audio)} helps with readability. > > ) > > > > @cindex mpd > > @subsubheading Music Player Daemon > > > > The Music Player Daemon (MPD) is a service that can play music while > > being controlled from the local machine or over the network by a > > variety of clients. > > > > ( > > An introductory paragraph about what the service does might be > > useful, so I've written one above. > > ) > > > > The following example shows how one might run @code{mpd} as user > > @code{"bob"} on port @code{6666}. It uses pulseaudio for output. > > > > @example > > (service mpd-service-type > > (mpd-configuration > > (user "bob") > > (port "6666"))) > > @end example > > > > ( > > Moving the example here might be more visible, rather than below > > the reference documentation. > > ) > > > > @defvr {Scheme Variable} mpd-service-type > > The service type for @command{mpd} > > @end defvr > > > > @deftp {Data Type} mpd-configuration > > Data type representing the configuration of @command{mpd}. > > > > ... > > > > @end table > > @end deftp > > > > =20 > I like all your suggestions and they are all part of the new patch, > thanks! > >> @node Miscellaneous Services > >> @subsubsection Miscellaneous Services > >> diff --git a/gnu/local.mk b/gnu/local.mk > >> index cffb18d3a..c12fd8559 100644 > >> --- a/gnu/local.mk > >> +++ b/gnu/local.mk > >> @@ -426,6 +426,7 @@ GNU_SYSTEM_MODULES > >> =3D \ \ > >> %D%/services.scm \ > >> %D%/services/admin.scm \ > >> + %D%/services/audio.scm \ > >> %D%/services/avahi.scm \ > >> %D%/services/base.scm \ > >> %D%/services/configuration.scm \ > >> @@ -481,6 +482,7 @@ GNU_SYSTEM_MODULES > >> =3D \ \ > >> %D%/tests.scm \ > >> %D%/tests/admin.scm \ > >> + %D%/tests/audio.scm \ > >> %D%/tests/base.scm \ > >> %D%/tests/databases.scm \ > >> %D%/tests/dict.scm \ > >> diff --git a/gnu/services/audio.scm b/gnu/services/audio.scm > >> new file mode 100644 > >> index 000000000..f5c465341 > >> --- /dev/null > >> +++ b/gnu/services/audio.scm > >> @@ -0,0 +1,86 @@ > >> +;;; GNU Guix --- Functional package management for GNU > >> +;;; Copyright =C2=A9 2017 Peter Mikkelsen > >> +;;; > >> +;;; 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 > >> . + > >> +(define-module (gnu services audio) > >> + #:use-module (guix gexp) > >> + #:use-module (gnu services) > >> + #:use-module (gnu services shepherd) > >> + #:use-module (gnu packages mpd) > >> + #:use-module (guix records) > >> + #:export (mpd-configuration > >> + mpd-configuration? > >> + mpd-service-type)) > >> + > >> +;;; Commentary: > >> +;;; > >> +;;; Audio related services > >> +;;; > >> +;;; Code: > >> + > >> +(define-record-type* > >> + mpd-configuration make-mpd-configuration > >> + mpd-configuration? > >> + (user mpd-configuration-user > >> + (default "mpd")) > >> + (music-dir mpd-configuration-music-dir > >> + (default "~/Music")) > >> + (playlist-dir mpd-configuration-playlist-dir > >> + (default "~/.mpd/playlists")) > >> + (port mpd-configuration-port > >> + (default "6600")) > >> + (address mpd-configuration-address > >> + (default "any")) > >> + (pid-file mpd-configuration-pid-file > >> + (default "/var/run/mpd.pid"))) > >> + > >> +(define (mpd-config->file config) > >> + (apply > >> + mixed-text-file "mpd.conf" > >> + "audio_output {\n" > >> + " type \"pulse\"\n" > >> + " name \"MPD\"\n" > >> + "}\n" > >> + (map (lambda (config-line) > >> + (let ((config-name (car config-line)) > >> + (config-val (cadr config-line))) > >> + (string-append config-name " \"" (config-val config) > >> "\"\n"))) =20 > > > > One way of making this a bit more concise and remove the need for > > car and cadr is to use the match module (ice-9 match). > > > > (map (match-lambda > > ((config-name config-val) > > (string-append config-name " \"" (config-val config) > > "\"\n"))) ... > > > > =20 >=20 > I didn't know about match-lambda, but it seems pretty neat, so I used > your example here, thanks. >=20 > >> + `(("user" ,mpd-configuration-user) > >> + ("music_directory" ,mpd-configuration-music-dir) > >> + ("playlist_directory" ,mpd-configuration-playlist-dir) > >> + ("port" ,mpd-configuration-port) > >> + ("bind_to_address" ,mpd-configuration-address) > >> + ("pid_file" ,mpd-configuration-pid-file))))) > >> + =20 > > > > ... =20 Awesome, I've now pushed this to master :) --Sig_/nENCve.rh+HWAjhYskz=319 Content-Type: application/pgp-signature Content-Description: OpenPGP digital signature -----BEGIN PGP SIGNATURE----- iQKTBAEBCgB9FiEEPonu50WOcg2XVOCyXiijOwuE9XcFAlmP/H5fFIAAAAAALgAo aXNzdWVyLWZwckBub3RhdGlvbnMub3BlbnBncC5maWZ0aGhvcnNlbWFuLm5ldDNF ODlFRUU3NDU4RTcyMEQ5NzU0RTBCMjVFMjhBMzNCMEI4NEY1NzcACgkQXiijOwuE 9XfXoQ/+IP1Kgwz67KaJ8V5mr4QiBLVYs2nzdFeOiroOkeFFvg1AZ1JjDwGxQN4T 61sH8N68eofJXFWQyns8QwDgDEXvGzYTRZHVddKvobByEM1SQoI1ttweOWMXpMIh wWhye4vI3ddaXg0U4HiOkNXeKQ6U10e3wleTYckiMLVdVur4QQw1wPYUuzzHWXt5 ndjNMb8ozqU27EqnK3w/xqkyG4RGV+y27YHnrK3t4CrOlf1Ya/Usgxlm5THKqJYE OVwIx3agcpYW7ls/a79F6k5W5IEHnYYGQ43E2nndgYqjl37xCtC1bqfF7O0fvQ3U mg2qVPpS/qm7T9Q8TE/4Qfz52IgHhzmPC95uRp8XPU8a8nD46AtkNDzsdSM7nBOC rNSnWQWEsPIlu+teZoulcUSBtUlIRazXNQuXUyI4qApRl/wyOO3Z5k+8KnjsAXJU A+mmOR3K1Q8gi4ivbSwfgVWXkuSw4iGKfdYR5mUoXes0FmhQzrxKYMjeZZOAmiUD 2qwBecBYPOlfqPfyY2FROqiTVO7aZVCjt2xO4LKUKZzqEA/gUdsCJztOxCnqF3Qd W0GitrUL/vCgGRSZr4o1cIWynOM+29zg9zueZcQ6wAdWjq00Pv74d1+RvpZT3Mkb i0V1YSYeExDrLFv6BNp1P61Ko2mjYTRmsUCb1bKGwVRc5GDyaoY= =uXCh -----END PGP SIGNATURE----- --Sig_/nENCve.rh+HWAjhYskz=319--