On Wed, Mar 03, 2021 at 06:18:28PM +0000, Daniel P. Berrangé wrote:
> Currently the QEMU driver secretly sets the QEMU_AUDIO_DRV env variable
>
> - VNC - set to "none", unless passthrough of host env variable is set
> - SPICE - always set to "spice"
> - SDL - always passthrough host env
> - No graphics - set to "none", unless passthrough of host env variable is set
>
> The setting of the QEMU_AUDIO_DRV env variable is done in the code which
> configures graphics.
>
> If no <audio> element is present, we now auto-populate <audio> elements
> to reflect this historical default config. This avoids need to set audio
> env when processing graphics.
>
> Signed-off-by: Daniel P. Berrangé <[email protected]>
> diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
> index bb14fe2e33..59071068c3 100644
> --- a/src/qemu/qemu_domain.c
> +++ b/src/qemu/qemu_domain.c
> @@ -3573,9 +3573,112 @@ qemuDomainDefAddImplicitInputDevice(virDomainDef *def)
> return 0;
> }
>
> +static int
> +qemuDomainDefAddDefaultAudioBackend(virQEMUDriverPtr driver,
> + virDomainDefPtr def)
> +{
> + size_t i;
> + bool addAudio = false;
> + bool audioPassthrough = false;
> + virDomainAudioType audioBackend = VIR_DOMAIN_AUDIO_TYPE_NONE;
This var should be a plain 'int' otherwise the later....
> + g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver);
> +
> + if (def->naudios > 0) {
> + return 0;
> + }
> +
> + for (i = 0; i < def->ngraphics; i++) {
> + virDomainGraphicsDefPtr graph = def->graphics[i];
> +
> + switch ((virDomainGraphicsType)graph->type) {
> + case VIR_DOMAIN_GRAPHICS_TYPE_VNC:
> + if (cfg->vncAllowHostAudio) {
> + audioPassthrough = true;
> + } else {
> + audioPassthrough = false;
> + audioBackend = VIR_DOMAIN_AUDIO_TYPE_NONE;
> + }
> + addAudio = true;
> + break;
> + case VIR_DOMAIN_GRAPHICS_TYPE_SPICE:
> + audioPassthrough = false;
> + audioBackend = VIR_DOMAIN_AUDIO_TYPE_SPICE;
> + addAudio = true;
> + break;
> + case VIR_DOMAIN_GRAPHICS_TYPE_SDL:
> + audioPassthrough = true;
> + addAudio = true;
> + break;
> +
> + case VIR_DOMAIN_GRAPHICS_TYPE_RDP:
> + case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP:
> + case VIR_DOMAIN_GRAPHICS_TYPE_EGL_HEADLESS:
> + break;
> + case VIR_DOMAIN_GRAPHICS_TYPE_LAST:
> + default:
> + virReportEnumRangeError(virDomainGraphicsType, graph->type);
> + return -1;
> + }
> + }
> +
> + if (!def->ngraphics) {
> + if (cfg->nogfxAllowHostAudio) {
> + audioPassthrough = true;
> + } else {
> + audioPassthrough = false;
> + audioBackend = VIR_DOMAIN_AUDIO_TYPE_NONE;
> + }
> + addAudio = true;
> + }
> +
> + if (addAudio && audioPassthrough) {
> + const char *audioenv = g_getenv("QEMU_AUDIO_DRV");
> + if (audioenv == NULL) {
> + addAudio = false;
> + } else {
> + /*
> + * QEMU audio driver names are mostly the same as
> + * libvirt XML audio backend names
> + */
> + if (STREQ(audioenv, "pa")) {
> + audioBackend = VIR_DOMAIN_AUDIO_TYPE_PULSEAUDIO;
> + } else {
> + if ((audioBackend =
> virDomainAudioTypeTypeFromString(audioenv)) < 0) {
...check here causes warning from clang about comparing an unsigned
enum type to -1.
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> + _("unknown QEMU_AUDIO_DRV setting %s"),
> audioenv);
> + return -1;
> + }
> + }
> + }
> + }
Regards,
Daniel
--
|: https://berrange.com -o- https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org -o- https://fstop138.berrange.com :|
|: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|