On 05/25/2010 06:45 AM, Daniel P. Berrange wrote:
On Mon, May 24, 2010 at 02:52:30PM -0400, Cole Robinson wrote:
> 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
>
> Signed-off-by: Cole Robinson <crobinso(a)redhat.com>
> ---
> src/qemu/qemu.conf | 10 ++++++++++
> src/qemu/qemu_conf.c | 17 ++++++++++++-----
> src/qemu/qemu_conf.h | 2 ++
> 3 files changed, 24 insertions(+), 5 deletions(-)
>
> diff --git a/src/qemu/qemu.conf b/src/qemu/qemu.conf
> index 3da332f..98a1176 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 2755545..b4d8e74 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 8fd8d79..7fb4de5 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 */
> --
ACK
Though it should also have a addition to the qemu.aug and test_qemu.aug
files too
Thanks, pushed now with the *.aug additions.
- Cole