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é <berrange@xxxxxxxxxx> > 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 :|