diff -rup libvirt-0.7.1/qemud/libvirtd.init.in audio/qemud/libvirtd.init.in --- libvirt-0.7.1/qemud/libvirtd.init.in 2009-07-22 09:37:32.000000000 -0400 +++ audio/qemud/libvirtd.init.in 2010-05-26 12:05:50.584822000 -0400 @@ -47,6 +47,9 @@ KRB5_KTNAME=/etc/libvirt/krb5.tab test -f @sysconfdir@/sysconfig/libvirtd && . @sysconfdir@/sysconfig/libvirtd +export QEMU_AUDIO_DRV +export SDL_AUDIODRIVER + LIBVIRTD_CONFIG_ARGS= if [ -n "$LIBVIRTD_CONFIG" ] then diff -rup libvirt-0.7.1/qemud/libvirtd_qemu.aug audio/qemud/libvirtd_qemu.aug --- libvirt-0.7.1/qemud/libvirtd_qemu.aug 2009-09-08 10:16:02.000000000 -0400 +++ audio/qemud/libvirtd_qemu.aug 2010-05-26 12:07:24.169216000 -0400 @@ -36,6 +36,7 @@ module Libvirtd_qemu = | str_array_entry "cgroup_device_acl" | str_entry "save_image_format" | str_entry "hugetlbfs_mount" + | bool_entry "vnc_allow_host_audio" (* Each enty in the config is one of the following three ... *) let entry = vnc_entry diff -rup libvirt-0.7.1/qemud/libvirtd.sysconf audio/qemud/libvirtd.sysconf --- libvirt-0.7.1/qemud/libvirtd.sysconf 2010-05-26 12:04:08.379130000 -0400 +++ audio/qemud/libvirtd.sysconf 2010-05-26 12:10:28.263486000 -0400 @@ -11,7 +11,8 @@ # Override the QEMU/SDL default audio driver probing when # starting virtual machines using SDL graphics # -# NB these have no effect for VMs using VNC +# NB these have no effect for VMs using VNC, unless vnc_allow_host_audio +# is enabled in /etc/libvirt/qemu.conf #QEMU_AUDIO_DRV=sdl # #SDL_AUDIODRIVER=pulse diff -rup libvirt-0.7.1/qemud/test_libvirtd_qemu.aug audio/qemud/test_libvirtd_qemu.aug --- libvirt-0.7.1/qemud/test_libvirtd_qemu.aug 2009-09-08 10:16:02.000000000 -0400 +++ audio/qemud/test_libvirtd_qemu.aug 2010-05-26 12:11:19.540907000 -0400 @@ -92,6 +92,8 @@ cgroup_device_acl = [ \"/dev/null\", \"/ save_image_format = \"gzip\" +vnc_allow_host_audio = 1 + hugetlbfs_mount = \"/dev/hugepages\" " @@ -195,4 +197,6 @@ hugetlbfs_mount = \"/dev/hugepages\" { "#empty" } { "save_image_format" = "gzip" } { "#empty" } -{ "hugetlbfs_mount" = "/dev/hugepages" } \ No newline at end of file +{ "hugetlbfs_mount" = "/dev/hugepages" } +{ "#empty" } +{ "vnc_allow_host_audio" = "1" } diff -rup libvirt-0.7.1/src/qemu.conf audio/src/qemu.conf --- libvirt-0.7.1/src/qemu.conf 2009-09-10 05:15:56.000000000 -0400 +++ audio/src/qemu.conf 2010-05-26 12:08:12.419811000 -0400 @@ -152,3 +152,13 @@ # in a location of $MOUNTPOINT/libvirt/qemu # hugetlbfs_mount = "/dev/hugepages" +# + +# QEMU implements an extension for providing audio over a VNC connection, +# though if your VNC client does not support it, your only chance for getting +# sound output is through regular audio backends. By default, libvirt will +# disable all QEMU sound backends if using VNC, since they can cause +# permissions issues. Enabling this option will make libvirtd honor the +# QEMU_AUDIO_DRV environment variable when using VNC. +# +# vnc_allow_host_audio = 0 diff -rup libvirt-0.7.1/src/qemu_conf.c audio/src/qemu_conf.c --- libvirt-0.7.1/src/qemu_conf.c 2010-05-26 12:04:08.578062000 -0400 +++ audio/src/qemu_conf.c 2010-05-26 12:09:31.174206000 -0400 @@ -318,6 +318,10 @@ int qemudLoadDriverConfig(struct qemud_d } } + p = virConfGetValue (conf, "vnc_allow_host_audio"); + CHECK_TYPE ("vnc_allow_host_audio", VIR_CONF_LONG); + if (p) driver->vncAllowHostAudio = p->l; + virConfFree (conf); return 0; } @@ -2113,12 +2117,15 @@ int qemudBuildCommandLine(virConnectPtr ADD_ARG_LIT(def->graphics[0]->data.vnc.keymap); } - /* QEMU implements a VNC extension for providing audio, so we - * set the audio backend to none, to prevent it opening the - * host OS audio devices since that causes security issues - * and is non-sensical when using VNC. + /* Unless user requested it, set the audio backend to none, to + * prevent it opening the host OS audio devices, since that causes + * security issues and might not work when using VNC. */ - ADD_ENV_LIT("QEMU_AUDIO_DRV=none"); + if (driver->vncAllowHostAudio) { + ADD_ENV_COPY("QEMU_AUDIO_DRV"); + } else { + ADD_ENV_LIT("QEMU_AUDIO_DRV=none"); + } } else if ((def->ngraphics == 1) && def->graphics[0]->type == VIR_DOMAIN_GRAPHICS_TYPE_SDL) { char *xauth = NULL; diff -rup libvirt-0.7.1/src/qemu_conf.h audio/src/qemu_conf.h --- libvirt-0.7.1/src/qemu_conf.h 2009-09-10 09:45:00.000000000 -0400 +++ audio/src/qemu_conf.h 2010-05-26 12:10:07.196992000 -0400 @@ -110,6 +110,8 @@ struct qemud_driver { char *hugetlbfs_mount; char *hugepage_path; + unsigned int vncAllowHostAudio : 1; + virCapsPtr caps; /* An array of callbacks */