From fb3ebd0397980ae035e66f0008b09e13377ef80f Mon Sep 17 00:00:00 2001 From: Cole Robinson Date: Wed, 19 May 2010 16:41:01 -0400 Subject: [PATCH] qemu: Allow using regular audio backends with VNC Currently all host audio backends are disabled if a VM is using VNC, in favor of the QEMU VNC audio extension. Unfortunately no released VNC client supports this extension, so users have no way of getting audio to work if using VNC. Add a new config option in qemu.conf which allows changing libvirt's behavior, but keep the default intact. v2: Fix doc typos, change name to vnc_allow_host_audio --- src/qemu/libvirtd_qemu.aug | 1 + src/qemu/qemu.conf | 10 ++++++++++ src/qemu/qemu_conf.c | 17 ++++++++++++----- src/qemu/qemu_conf.h | 2 ++ src/qemu/test_libvirtd_qemu.aug | 4 ++++ 5 files changed, 29 insertions(+), 5 deletions(-) diff --git a/src/qemu/libvirtd_qemu.aug b/src/qemu/libvirtd_qemu.aug index 5bd60b3629..551cc20fd8 100644 --- a/src/qemu/libvirtd_qemu.aug +++ b/src/qemu/libvirtd_qemu.aug @@ -38,6 +38,7 @@ module Libvirtd_qemu = | str_entry "save_image_format" | str_entry "hugetlbfs_mount" | bool_entry "relaxed_acs_check" + | bool_entry "vnc_allow_host_audio" (* Each enty in the config is one of the following three ... *) let entry = vnc_entry diff --git a/src/qemu/qemu.conf b/src/qemu/qemu.conf index 3da332fc86..98a117693f 100644 --- a/src/qemu/qemu.conf +++ b/src/qemu/qemu.conf @@ -168,3 +168,13 @@ # be assigned to guests. # # relaxed_acs_check = 1 + + +# 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 --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c index 2755545e79..b4d8e74cbd 100644 --- a/src/qemu/qemu_conf.c +++ b/src/qemu/qemu_conf.c @@ -351,6 +351,10 @@ int qemudLoadDriverConfig(struct qemud_driver *driver, CHECK_TYPE ("relaxed_acs_check", VIR_CONF_LONG); if (p) driver->relaxedACS = p->l; + 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; } @@ -4399,12 +4403,15 @@ int qemudBuildCommandLine(virConnectPtr conn, 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 --git a/src/qemu/qemu_conf.h b/src/qemu/qemu_conf.h index 8fd8d798f5..7fb4de57d2 100644 --- a/src/qemu/qemu_conf.h +++ b/src/qemu/qemu_conf.h @@ -138,6 +138,8 @@ struct qemud_driver { unsigned int relaxedACS : 1; + unsigned int vncAllowHostAudio : 1; + virCapsPtr caps; /* An array of callbacks */ diff --git a/src/qemu/test_libvirtd_qemu.aug b/src/qemu/test_libvirtd_qemu.aug index 2feedc05cf..a048ae55e6 100644 --- a/src/qemu/test_libvirtd_qemu.aug +++ b/src/qemu/test_libvirtd_qemu.aug @@ -97,6 +97,8 @@ save_image_format = \"gzip\" hugetlbfs_mount = \"/dev/hugepages\" relaxed_acs_check = 1 + +vnc_allow_host_audio = 1 " test Libvirtd_qemu.lns get conf = @@ -204,3 +206,5 @@ relaxed_acs_check = 1 { "hugetlbfs_mount" = "/dev/hugepages" } { "#empty" } { "relaxed_acs_check" = "1" } +{ "#empty" } +{ "vnc_allow_host_audio" = "1" }